#include "AddOns/Analysis/Triggers/Trigger_Base.H" #include "AddOns/Analysis/Observables/Primitive_Observable_Base.H" #include "ATOOLS/Math/Variable.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Math/Histogram.H" #include "ATOOLS/Org/Shell_Tools.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Math/Algebra_Interpreter.H" #include using namespace ATOOLS; namespace ANALYSIS { typedef std::vector Int_Vector; typedef std::vector Int_Matrix; typedef std::vector Double_Vector; typedef std::vector Double_Matrix; typedef std::vector Flavour_Matrix; typedef std::vector*> Variable_Vector; typedef std::vector Histogram_Vector; class OVS_Tag_Replacer: public Tag_Replacer { private: Primitive_Analysis *p_ana; public: OVS_Tag_Replacer(Primitive_Analysis *const ana): p_ana(ana) {} std::string ReplaceTags(std::string &expr) const; ATOOLS::Term *ReplaceTags(ATOOLS::Term *term) const; };// end of class OVS_Tag_Replacer class One_Variable_Selector: public Trigger_Base { private: String_Matrix m_cndlist; Flavour_Matrix m_flavs; Int_Matrix m_items; String_Vector m_vtags; Variable_Vector m_vars; Double_Vector m_mins, m_maxs; Double_Matrix m_histos; Histogram_Vector m_dists; ATOOLS::Histogram *p_flow; OVS_Tag_Replacer m_repl; public: One_Variable_Selector (const std::string &inlist,const std::string &outlist, const String_Matrix &cndlist,const int isobs, const Flavour_Matrix &flavs,const Int_Matrix &items, const String_Vector &vtags,const Double_Vector &mins, const Double_Vector &maxs,const Double_Matrix &m_histos, Primitive_Analysis *const ana,const std::string &name=""); ~One_Variable_Selector(); void Evaluate(const ATOOLS::Particle_List &inlist, ATOOLS::Particle_List &outlist, double weight, double ncount); int Evaluate(ATOOLS::Particle_List &reflist, double weight,double ncount,ATOOLS::Particle_List &moms, const size_t i,size_t j,size_t k,size_t o,size_t &eval); Analysis_Object &operator+=(const Analysis_Object &obj); void EndEvaluation(double scale=1.0); void Restore(double scale=1.0); void Output(const std::string & pname); Analysis_Object *GetCopy() const; };// end of class One_Variable_Selector } // namespace ANALYSIS using namespace ANALYSIS; DECLARE_GETTER(One_Variable_Selector,"MomSel", Analysis_Object,Analysis_Key); void ATOOLS::Getter :: PrintInfo(std::ostream &str,const size_t width) const { str<<"{\n" < std::string MakeString(const std::vector<__T> &v); template <> std::string MakeString (const std::vector &v) { if (v.empty()) return ""; std::string s((v.front().IsAnti()?"-":"") +ToString(v.front().Kfcode())); for (size_t i(1);i std::string MakeString(const std::vector<__T> &v) { if (v.empty()) return ""; std::string s(ToString(v.front())); for (size_t i(1);i:: operator()(const Analysis_Key& key) const { ATOOLS::Scoped_Settings s{ key.m_settings }; s.DeclareVectorSettingsWithEmptyDefault({ "CndList", "Vars", "Mins", "Maxs", "HTypes", "HItems", "HBins", "HMins", "HMaxs" }); s.DeclareMatrixSettingsWithEmptyDefault({ "Flavs", "Items" }); const auto inlist = s["InList"].SetDefault("FinalState").Get(); const auto outlist = s["OutList"].SetDefault("Selected").Get(); String_Matrix cndlist; cndlist.push_back(s["CndList"].GetVector()); if (cndlist.back().size() != 2) THROW(fatal_error, "CndList must consist of two values."); const auto isobs = s["IsObs"].SetDefault(0).Get(); Flavour_Matrix flavs; Int_Matrix rawflavs{ s["Flavs"].GetMatrix() }; for (const auto& rawflavrow : rawflavs) { flavs.push_back(Flavour_Vector()); for (const auto& rawflav : rawflavrow) { flavs.back().push_back(Flavour((kf_code)std::abs(rawflav))); if (rawflav < 0) flavs.back().back() = flavs.back().back().Bar(); } } auto items = s["Items"].GetMatrix(); auto vtags = s["Vars"].GetVector(); auto mins = s["Mins"].GetVector(); auto maxs = s["Maxs"].GetVector(); Double_Matrix histos(5); for (const auto& htype : s["HTypes"].GetVector()) { histos[0].push_back(HistogramType(htype)); } for (const auto& hitem : s["HItems"].GetVector()) { histos[4].push_back(hitem); } for (const auto& hbin : s["HBins"].GetVector()) { histos[1].push_back(hbin); } for (const auto& hmin : s["HMins"].GetVector()) { histos[2].push_back(hmin); } for (const auto& hmin : s["HMaxs"].GetVector()) { histos[3].push_back(hmin); } if (flavs.empty() || items.empty() || vtags.empty() || mins.empty() || maxs.empty()) THROW(fatal_error, "Cannot initialise selector."); if (histos[0].empty()) histos[0].push_back(-1.0); size_t max(Max(vtags.size(),Max(flavs.size(),items.size()))); max=Max(max,Max(mins.size(),maxs.size())); flavs.resize(max,flavs.back()); items.resize(max,items.back()); vtags.resize(max,vtags.back()); mins.resize(max,mins.back()); maxs.resize(max,maxs.back()); for (size_t i(0);i<5;++i) histos[i].resize(max,-1); for (size_t i(flavs.size());iGetInterpreter(); if (inter!=NULL) { const String_BlobDataBase_Map &data(ana->GetData()); for (String_BlobDataBase_Map::const_iterator dit(data.begin());dit!=data.end();++dit) { Blob_Data *dat(dynamic_cast*>(dit->second)); if (dat!=NULL) inter->AddTag(dit->first,"0"); else inter->AddTag(dit->first,"(0,0,0,0)"); } m_vars[i]->Init(m_vtags[i]+"{"+ToString((long unsigned int)(&m_repl))+"}"); } } if (name!="") m_name=name; else { size_t n(0); while (ana->GetObject(m_inlist+"_"+ToString(n))!=NULL) ++n; m_name=m_inlist+"_"+ToString(n); } p_flow = new ATOOLS::Histogram(1,0.0,(double)m_flavs.size(),m_flavs.size()); for (size_t i(0);i-1) { msg_Debugging()<<" init histo "<Name()<<" for "; for (size_t j(0);j type "<m_dists[i]; *p_flow+=*vob->p_flow; return *this; } void One_Variable_Selector::EndEvaluation(double scale) { for (size_t i(0);iMPISync(); m_dists[i]->Finalize(); if (scale!=1.0) m_dists[i]->Scale(scale); } p_flow->MPISync(); p_flow->Finalize(); if (scale!=1.0) p_flow->Scale(scale); } void One_Variable_Selector::Restore(double scale) { for (size_t i(0);iScale(scale); m_dists[i]->Restore(); } if (scale!=1.0) p_flow->Scale(scale); p_flow->Restore(); } void One_Variable_Selector::Output(const std::string & pname) { msg_Debugging()<IDName()); for (size_t j(0);jOutput((name+".dat").c_str()); } if (m_isobs) p_flow->Output((bname+"_eff.dat").c_str()); msg_Debugging()<<"}\n"; } One_Variable_Selector::~One_Variable_Selector() { while (m_vars.size()) { delete m_vars.back(); m_vars.pop_back(); } while (m_dists.size()) { if (m_dists.back()!=NULL) delete m_dists.back(); m_dists.pop_back(); } delete p_flow; } int One_Variable_Selector::Evaluate (ATOOLS::Particle_List &reflist,double weight,double ncount, ATOOLS::Particle_List &moms,const size_t i,size_t j,size_t k, size_t o,size_t &eval) { bool count(m_vars[i]->IDName()=="Count"); if (j>=m_flavs[i].size()) { ++eval; if (count) return 1; std::vector vmoms(moms.size()); for (size_t l(0);lMomentum(); double val(m_vars[i]->Value(&vmoms.front(),vmoms.size())); bool pass(val>=m_mins[i] && val<=m_maxs[i]); if (msg_LevelIsDebugging()) { msg_Debugging()<<" "<Name()<<"("<Number(); for (size_t k(1);kNumber(); msg_Debugging()<<") = "<Insert(val,weight,ncount); if (pass) return 1; if (m_vars[i]->IDName()=="Count") return 0; bool rem(false); for (size_t l(0);l=0) continue; for (Particle_List::iterator pit(reflist.begin()); pit!=reflist.end();++pit) if (*pit==moms[l]) { msg_Debugging()<<" erase "<<**pit<<"\n"; reflist.erase(pit); rem=true; break; } } if (!rem) return 0; moms.clear(); return -1; } if (j>0 && m_flavs[i][j]!=m_flavs[i][j-1]) o=k=0; for (;kFlav())) { if ((m_items[i][j]<0 && -int(o)<=m_items[i][j]+1) || int(o)==m_items[i][j]) { moms.push_back(reflist[k]); int stat(Evaluate(reflist,weight,ncount,moms,i,j+1,k+1,o+1,eval)); if (stat<1) return stat; if (int(o)==m_items[i][j]) return 1; moms.pop_back(); } ++o; } } return 1; } void One_Variable_Selector::Evaluate (const ATOOLS::Particle_List &inlist,ATOOLS::Particle_List &outlist, double weight, double ncount) { msg_Debugging()< '"< cndlist(m_cndlist.size()); for (size_t i(0);iAddParticleList(m_cndlist[i][1],cndlist[i]); } p_flow->Insert(0.0,weight,ncount); Particle_List vreflist(inlist); size_t eval(0); for (int oldi(0), i(0);i<(int)m_flavs.size();++i) { if (i!=oldi) eval=0; oldi=i; Particle_List moms; int stat(Evaluate(vreflist,weight,ncount,moms,i,0,0,0,eval)); if (m_vars[i]->IDName()=="Count") { std::vector vmoms(eval); double val(m_vars[i]->Value(&vmoms.front(),eval)); bool pass(val>=m_mins[i] && val<=m_maxs[i]); if (msg_LevelIsDebugging()) { msg_Debugging()<<" "<Name()<<"("<Insert(val,weight,ncount); if (!pass) { msg_Debugging()<<"} failed\n"; return; } } else if (!eval && msg_LevelIsDebugging()) { msg_Debugging()<<" "<Name()<<", range [" <Insert((double)i+1.5,weight,0); } msg_Debugging()<<"} passed\n"; outlist.resize(vreflist.size()); for (size_t i(0);iGetParticleList(m_cndlist[i][0])); if (list==NULL) { msg_Error()<resize(list->size()); for (size_t j(0);jsize();++j) (*cndlist[i])[j] = new Particle(*(*list)[j]); } } std::string OVS_Tag_Replacer::ReplaceTags(std::string &expr) const { THROW(fatal_error,"Invalid function call"); } Term *OVS_Tag_Replacer::ReplaceTags(Term *term) const { size_t bpos(term->Tag().find('[')); if (bpos!=std::string::npos) { Blob_Data *dat(dynamic_cast*>((*p_ana)[term->Tag()])); if (dat!=NULL) { term->Set(dat->Get()); return term; } THROW(critical_error,"Tag '"+term->Tag()+"' not found"); } Blob_Data *dat(dynamic_cast*>((*p_ana)[term->Tag()])); if (dat!=NULL) { term->Set(dat->Get()); return term; } THROW(critical_error,"Tag '"+term->Tag()+"' not found"); } Analysis_Object *One_Variable_Selector::GetCopy() const { return new One_Variable_Selector (m_inlist,m_outlist,m_cndlist,m_isobs, m_flavs,m_items,m_vtags,m_mins,m_maxs, m_histos,p_ana,m_name); }