double Hadron_Remnant::MinimalEnergy(const ATOOLS::Flavour &flavour) { if (!m_initialized) { if (!flavour.Strong()) { return p_beam->Beam().HadMass(); } bool found(false); kf_code di[3]; if (flavour.IsQuark()) { short unsigned int j=0; for (Flavour_Vector::const_iterator flit(m_constit.begin()); flit!=m_constit.end();++flit) { if (found || flavour!=*flit) di[j++]=flit->Kfcode(); else found=true; } } Flavour difl; if (!found || flavour.IsGluon()) { int single=-1; for (size_t i=0;i<m_constit.size();++i) { for (size_t j=i+1;j<m_constit.size();++j) { if (m_constit[i]==m_constit[j]) { single=j; break; } } if (single>0) break; } Flavour fl(m_constit[single]); for (short unsigned int j=0, i=0;i<3;i++) if (i!=single) di[j++]=m_constit[i].Kfcode(); if (di[0]>di[1]) difl=Flavour((kf_code)(di[0]*1000+di[1]*100+1)); else if (di[1]>di[0]) difl=Flavour((kf_code)(di[1]*1000+di[0]*100+1)); else difl=Flavour((kf_code)(di[0]*1100+3)); if (m_constit[single].IsAnti()) difl=difl.Bar(); return difl.Mass()+fl.Mass()+flavour.Bar().Mass(); } if (di[0]>di[1]) difl=Flavour((kf_code)(di[0]*1000+di[1]*100+1)); else if (di[1]>di[0]) difl=Flavour((kf_code)(di[1]*1000+di[0]*100+1)); else difl=Flavour((kf_code)(di[0]*1100+3)); if (m_constit[0].IsAnti()) difl=difl.Bar(); return difl.Mass(); } else { if (flavour.IsQuark()) return flavour.Bar().Mass(); } return 0.; }
Primitive_Observable_Base *GetObservable(const Argument_Matrix ¶meters) { if (parameters.size()<1) return NULL; if (parameters.size()==1) { if (parameters[0].size()<5) return NULL; int kf=ATOOLS::ToType<int>(parameters[0][0]); ATOOLS::Flavour flavour((kf_code)abs(kf)); if (kf<0) flavour=flavour.Bar(); std::string list=parameters[0].size()>5?parameters[0][5]:finalstate_list; return new Class(flavour,HistogramType(parameters[0][4]), ATOOLS::ToType<double>(parameters[0][1]), ATOOLS::ToType<double>(parameters[0][2]), ATOOLS::ToType<int>(parameters[0][3]),list); } else if (parameters.size()<5) return NULL; double min=0.0, max=1.0; size_t bins=100; std::string list=finalstate_list, scale="Lin"; ATOOLS::Flavour flavour; for (size_t i=0;i<parameters.size();++i) { if (parameters[i].size()<2) continue; if (parameters[i][0]=="FLAV") { int kf=ATOOLS::ToType<int>(parameters[i][1]); flavour=ATOOLS::Flavour((kf_code)abs(kf)); if (kf<0) flavour=flavour.Bar(); } else if (parameters[i][0]=="MIN") min=ATOOLS::ToType<double>(parameters[i][1]); else if (parameters[i][0]=="MAX") max=ATOOLS::ToType<double>(parameters[i][1]); else if (parameters[i][0]=="BINS") bins=ATOOLS::ToType<int>(parameters[i][1]); else if (parameters[i][0]=="SCALE") scale=parameters[i][1]; else if (parameters[i][0]=="LIST") list=parameters[i][1]; } return new Class(flavour,HistogramType(scale),min,max,bins,list); }