#include "HADRONS++/Main/Hadron_Decay_Table.H" #include "HADRONS++/Main/Hadron_Decay_Channel.H" #include "HADRONS++/Main/Mixing_Handler.H" #include "HADRONS++/Main/Tools.H" #include "ATOOLS/Phys/Blob.H" #include "ATOOLS/Org/Shell_Tools.H" #include "ATOOLS/Org/My_MPI.H" #include using namespace HADRONS; using namespace ATOOLS; using namespace PHASIC; using namespace std; Hadron_Decay_Table::Hadron_Decay_Table(Flavour decayer, const Mass_Selector* ms, Mixing_Handler* mh) : Decay_Table(decayer, ms), p_mixinghandler(mh) { m_flavwidth=Flav().Width(); if (Flav().Kfcode()==kf_tau && m_flavwidth==0.0) { m_flavwidth = 2.26735e-12; } } Hadron_Decay_Table::~Hadron_Decay_Table() { } void Hadron_Decay_Table::Read(Scoped_Settings s, GeneralModel& startmd) { DEBUG_FUNC((int) Flav()); // read "Partonics" block vector specs; vector specweights; for (auto spec: s["Spectators"].GetItems()) { specs.push_back(ToType(spec.GetKeys()[0])); specweights.push_back(spec[spec.GetKeys()[0]]["Weight"].SetDefault(1).Get()); } for (size_t j=0;j forced_channels(s["Forced"].SetDefault(vector()).GetVector()); // read all other entries (= real channels) double totwidth(0.); for (const auto& channel: s.GetKeys()) { if (channel=="Spectators" || channel=="Forced") continue; DEBUG_VAR(channel); vector helpkfc; Tools::ExtractFlavours(helpkfc,channel); Hadron_Decay_Channel* hdc = new Hadron_Decay_Channel(Flav(),p_ms); int charge = Flav().IntCharge(); double mass = Flav().HadMass(); for (size_t j=0;jAddDecayProduct(flav); charge-=flav.IntCharge(); mass-=flav.HadMass(); } if (mass<0.) THROW(fatal_error, "Mass too low."); if (charge!=0) THROW(fatal_error,"Charge not conserved for "+hdc->IDCode()); if (s[channel]["BR"].GetItemsCount()==0) { // some partonic channels will be constructed manually below. // these will not have a BR provided in the decay data. // (they are nevertheless stored in the decay table for the intresults) delete hdc; continue; } hdc->SetWidth(s[channel]["BR"][0].SetDefault(-1.0).Get()*m_flavwidth); hdc->SetDeltaWidth(s[channel]["BR"][1].SetDefault(-1.0).Get()*m_flavwidth); hdc->SetOrigin(s[channel]["Origin"].SetDefault("").Get()); hdc->SetActive(s[channel]["Status"].SetDefault(hdc->Active()).GetVector()); totwidth += hdc->Width(); hdc->Initialise(s[channel], startmd); AddDecayChannel(hdc); } DEBUG_VAR(totwidth); if (specs.size()>0) { PHASIC::Decay_Table * dectable(NULL); if (!Flav().IsB_Hadron() && !Flav().IsC_Hadron()) { msg_Error()<<"ERROR in "< anti = "<TotalWidth()*totspec)); for (size_t i=0;isize();i++) { double BR = ((*dectable)[i]->Width()*specweights[k]); double mass = Flav().HadMass(); string fsidcode; mass-=spec.HadMass(); fsidcode=ToString((int)spec); for (size_t j=0;j<(*dectable)[i]->NOut();j++) { Flavour flav = (*dectable)[i]->GetDecayProduct(j); if (isAnti) flav=flav.Bar(); mass -= flav.HadMass(); fsidcode=fsidcode+","+ToString((int)flav); } if (mass<0.) { msg_Tracking()<<"Mass too low for "<"; for (size_t j=0;j<(*dectable)[i]->NOut();j++) { msg_Tracking()<<" "<<(*dectable)[i]->GetDecayProduct(j); } msg_Tracking()<<".\n"; continue; } Hadron_Decay_Channel* hdc = new Hadron_Decay_Channel(Flav(),p_ms); hdc->AddDecayProduct(spec,false); msg_Tracking()<<" Add partonic decay: "< "; for (size_t j=0;j<(*dectable)[i]->NOut();j++) { Flavour flav = (*dectable)[i]->GetDecayProduct(j); if (isAnti) flav=flav.Bar(); msg_Tracking()<AddDecayProduct(flav,false); } hdc->SetWidth(BR*partWidth); hdc->SetDeltaWidth(0.); hdc->SetOrigin(""); hdc->Initialise(s[fsidcode],startmd); AddDecayChannel(hdc); } } } // set forced channels UpdateChannelStatuses(); } void Hadron_Decay_Table::LatexOutput(std::ostream& f) { f<<"\\subsection{\\texorpdfstring{Decaying Particle: $"<Width()!=0.0) at(i)->LatexOutput(f, TotalWidth()); } // skip inclusives for now f<<"\\hline"<Status()<<"\n" // <<(*blob)<<"\n"; if (data) { if (blob->Has(blob_status::internal_flag)) { bool partonic_finalstate(false); Decay_Channel* dc; do { dc = Decay_Table::Select(); for (size_t i=0; iFlavs().size(); ++i) { if(dc->Flavs()[i].Strong()) { partonic_finalstate=true; break; } } } while (!partonic_finalstate); //msg_Tracking()<Get()->Name()<<",\n" // <<" retrying with "<Name()<<".\n"; DEBUG_INFO("retrying with "<Name()); blob->UnsetStatus(blob_status::internal_flag); blob->AddData("dc",new Blob_Data(dc)); return dc; } return data->Get(); } Decay_Channel* dec_channel=p_mixinghandler->Select(blob->InParticle(0),*this); blob->AddData("dc",new Blob_Data(dec_channel)); return dec_channel; }