#include "HADRONS++/Main/Tools.H" #include "HADRONS++/Main/Hadron_Decay_Map.H" #include "HADRONS++/Main/Hadron_Decay_Table.H" #include "HADRONS++/Main/Hadron_Decay_Channel.H" #include "HADRONS++/PS_Library/HD_PS_Base.H" #include "ATOOLS/Org/Data_Reader.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Org/MyStrStream.H" #include "HADRONS++/ME_Library/HD_ME_Base.H" #include "HADRONS++/ME_Library/Current_ME.H" #include "HADRONS++/Current_Library/Current_Base.H" #include "ATOOLS/Org/Getter_Function.H" #include "HADRONS++/Main/Mixing_Handler.H" #include "ATOOLS/Org/My_MPI.H" #include "ATOOLS/Phys/KF_Table.H" using namespace HADRONS; using namespace ATOOLS; using namespace PHASIC; using namespace std; Hadron_Decay_Map::Hadron_Decay_Map(const Mass_Selector* ms) : Decay_Map(ms), m_fixed_next_tables(0), p_mixinghandler(NULL) {} Hadron_Decay_Map::~Hadron_Decay_Map() { for (map::iterator it=m_fixed_tables.begin(); it!=m_fixed_tables.end(); ++it) { delete it->second; } } void Hadron_Decay_Map::ReadInConstants(const string& path, const string& file) { m_startmd.clear(); // clear model Data_Reader reader = Data_Reader(" ",";","!","|"); reader.AddWordSeparator("\t"); reader.AddComment("#"); reader.AddComment("//"); reader.SetInputPath(path); reader.SetInputFile(file); reader.AddLineSeparator("\n"); vector > constants; if(!reader.MatrixFromFile(constants,"")) { msg_Error()<<"Warning! The file "<IDName())); GeneralModel::iterator xit(m_startmd.find("x_"+flavit->IDName())); GeneralModel::iterator qit(m_startmd.find("qoverp2_"+flavit->IDName())); if(yit!=m_startmd.end()) flavit->SetDeltaGamma(2.0*flavit->Width()*yit->second); if(xit!=m_startmd.end()) flavit->SetDeltaM(flavit->Width()*xit->second); if(qit!=m_startmd.end()) flavit->SetQOverP2(qit->second); } } void Hadron_Decay_Map::ReadInPartonicDecays(const ATOOLS::Flavour & decflav, const std::string& path, const std::string& file) { Data_Reader reader = Data_Reader(" ",";","!","|"); reader.AddWordSeparator("\t"); reader.AddComment("#"); reader.AddComment("//"); reader.SetInputPath(path); reader.SetInputFile(file); reader.AddLineSeparator("\n"); vector > helpsvv; vector helpkfc; if(!reader.MatrixFromFile(helpsvv,"")) { msg_Error()<<"ERROR in "<(helpsvv[i][1]); } else if (helpsvv[i].size()==3) { if (Tools::ExtractFlavours(helpkfc,helpsvv[i][0])) { double mass(decmass); for (size_t j=0;j "; for (size_t j=0;j0?Flavour(helpkfc[j]): Flavour(helpkfc[j]).Bar())<<" "; msg_Tracking()<<"cannot be initialised - not enough mass.\n"; continue; } Decay_Channel * dc(new Decay_Channel(decflav,p_ms)); for (size_t j=0;jAddDecayProduct(flav,false); } Tools::ExtractBRInfo(helpsvv[i][1], BR, dBR, origin); dc->SetWidth(BR*width); dt->AddDecayChannel(dc); msg_Tracking()<UpdateWidth(); msg_Tracking()<size() <<" channels.\n"<", ";", "#", ""); reader.AddWordSeparator("\t"); reader.AddComment("#"); reader.AddComment("//"); reader.SetInputPath(path); reader.SetInputFile(file); reader.AddLineSeparator("\n"); vector > aliases; reader.MatrixFromFile(aliases,""); for (size_t i=0;i(aliases[i][0]); kf_code real = ToType(aliases[i][1]); m_startmd.m_aliases[alias]=real; Particle_Info* aliasinfo = new Particle_Info(*s_kftable[real]); aliasinfo->m_kfc=alias; s_kftable[alias]=aliasinfo; msg_Info()<"); reader.AddWordSeparator("\t"); reader.AddComment("#"); reader.AddComment("//"); reader.SetInputPath(path); reader.SetInputFile(file); reader.AddLineSeparator("\n"); vector > Decayers; if(reader.MatrixFromFile(Decayers,"")) { msg_Info()<1?line[1]:"hadrons.tex"; } else if (line.size()==3) { int decayerkf = atoi((line[0]).c_str()); Flavour decayerflav = Flavour( (kf_code) abs(decayerkf), decayerkf<0); msg_Tracking()<<"New hadron decay table for "<Read(path+line[1], line[2]); // add decayer to decaymap Decay_Map::iterator it = find(decayerflav); if (it==end()) { insert(make_pair(decayerflav, vector(1,dt))); } else { it->second.push_back(dt); m_counters.insert(make_pair(decayerflav,0)); } } else { PRINT_INFO("Warning: Decay table in "<"); reader.AddWordSeparator("\t"); reader.AddComment("#"); reader.AddComment("//"); reader.SetInputPath(path); reader.SetInputFile(file); reader.AddLineSeparator("\n"); vector > Decayers; if(!reader.MatrixFromFile(Decayers,"")) { return; } Flavour fl; for (size_t i=0;i line = Decayers[i]; if (line.size()==4) { std::string table_id = line[0]; int decayerkf = atoi((line[1]).c_str()); Flavour decayerflav = Flavour( (kf_code) abs(decayerkf), decayerkf<0); Hadron_Decay_Table * dt = new Hadron_Decay_Table(decayerflav, p_ms, p_mixinghandler); dt->Read(path+line[2], line[3]); pair found=m_fixed_tables.equal_range(table_id); for (SDtMMapIt it=found.first; it!=found.second; ++it) { if (it->second->Flav()==decayerflav) { THROW(fatal_error, "Duplicate decayer "+ToString((long int)decayerflav) +" for fixed decay table ID="+table_id); } } m_fixed_tables.insert(make_pair(table_id, dt)); } else { msg_Error()<::iterator it=m_fixed_tables.begin(); it!=m_fixed_tables.end(); ++it) { it->second->Initialise(m_startmd); } } void Hadron_Decay_Map::FixDecayTables(std::string table_id) { pair found=m_fixed_tables.equal_range(table_id); for (SDtMMapIt it=found.first; it!=found.second; ++it) { m_fixed_next_tables.push_back(it->second); } } void Hadron_Decay_Map::ClearFixedDecayTables() { m_fixed_next_tables.clear(); } void Hadron_Decay_Map::Initialise() { for (Decay_Map::iterator pos = this->begin(); pos != this->end(); ++pos) { for(size_t i=0; isecond.size(); i++) { Hadron_Decay_Table* dt = (Hadron_Decay_Table*) pos->second[i]; dt->Initialise(m_startmd); } } } void Hadron_Decay_Map::CreateBooklet(std::string & name) { ofstream f(name.c_str()); // header f<<"\\documentclass[a4paper]{scrartcl}\n" <<"\\usepackage{latexsym,amssymb,amsmath,amsxtra,longtable,fullpage}\n" <<"\\usepackage[ps2pdf,colorlinks,bookmarks=true,bookmarksnumbered=true]{hyperref}\n\n" <<"\\begin{document}\n"<::PrintGetterInfo( f,30,indent, separator, lineend, replacefrom, replaceto); f<<"\\subsection{Weak Currents}"<::PrintGetterInfo( f,30,indent, separator, lineend, replacefrom, replaceto); // text f<<"\\section{Decay Channels}"< mes; for ( Decay_Map::iterator pos = begin(); pos != end(); ++pos) { Hadron_Decay_Table* dt=(Hadron_Decay_Table*) pos->second[0]; if(dt==NULL) continue; dt->LatexOutput(f); } // end f<<"\\end{document}"<Flav().Kfcode()==decayer.Kfcode()) { return m_fixed_next_tables[i]; } } return Decay_Map::FindDecay(decayer); }