#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/Org/Scoped_Settings.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 One_Variable_Observable: public Primitive_Observable_Base { private: Flavour_Matrix m_flavs; Int_Matrix m_items; String_Vector m_vtags; Variable_Vector m_vars; Double_Matrix m_histos; Histogram_Vector m_dists; public: One_Variable_Observable (const std::string &inlist,const Flavour_Matrix &flavs, const Int_Matrix &items,const String_Vector &vtags, const Double_Matrix &m_histos,Primitive_Analysis *const ana, const std::string &name=""); ~One_Variable_Observable(); void EvaluateNLOcontrib(double weight,double ncount); void Evaluate(const ATOOLS::Particle_List &list, double weight, double ncount); void Evaluate(const ATOOLS::Particle_List &list, double weight, double ncount,const int mode); bool Evaluate(const ATOOLS::Particle_List &list, double weight,double ncount,Particle_List moms, const size_t i,const size_t j,size_t k, size_t o,size_t &eval,const int mode); Analysis_Object &operator+=(const Analysis_Object &obj); void EvaluateNLOevt(); void EndEvaluation(double scale=1.0); void Restore(double scale=1.0); void Output(const std::string & pname); Primitive_Observable_Base *Copy() const; };// end of class One_Variable_Observable } // namespace ANALYSIS using namespace ANALYSIS; DECLARE_GETTER(One_Variable_Observable,"VarObs", Primitive_Observable_Base,Analysis_Key); void ATOOLS::Getter::PrintInfo (std::ostream &str,const size_t width) const { str<<"{\n" <,\n" <::operator() (const Analysis_Key &key) const { Scoped_Settings s{ key.m_settings }; s.DeclareVectorSettingsWithEmptyDefault({ "Vars", "Types", "Bins" }); s.DeclareMatrixSettingsWithEmptyDefault({ "Flavs", "Items" }); Flavour_Matrix flavs; Int_Matrix items; String_Vector vtags; Double_Matrix histos(4); const auto inlist = s["InList"].SetDefault("FinalState").GetVector()[0]; auto cfls = s["Flavs"].GetMatrix(); for (const auto& cfl : cfls) { flavs.push_back(Flavour_Vector(cfl.size())); for (size_t k(0);k(); for (const auto& cit : cits) { items.push_back(cit); } const auto vars = s["Vars"].GetVector(); for (const auto& var : vars) { vtags.push_back(var); } const auto types = s["Types"].GetVector(); for (const auto& type : types) { histos[0].push_back(HistogramType(type)); } const auto bins = s["Bins"].GetVector(); for (const auto& bin : bins) { histos[1].push_back(bin); } const auto mins = s["Mins"].GetVector(); for (const auto& min : mins) { histos[2].push_back(min); } const auto maxs = s["Maxs"].GetVector(); for (const auto& max : maxs) { histos[3].push_back(max); } if (flavs.empty() || items.empty() || vtags.empty()) { msg_Debugging()<GetObject(m_listname+"_"+ToString(n))!=NULL) ++n; m_name=m_listname+"_"+ToString(n); } for (size_t i(0);i-1) { msg_Debugging()<<" init histo "< type "<m_dists[i]; return *this; } void One_Variable_Observable::EvaluateNLOevt() { for (size_t i(0);iFinishMCB(); } void One_Variable_Observable::EndEvaluation(double scale) { for (size_t i(0);iMPISync(); m_dists[i]->Finalize(); if (scale!=1.0) m_dists[i]->Scale(scale); } } void One_Variable_Observable::Restore(double scale) { for (size_t i(0);iScale(scale); m_dists[i]->Restore(); } } void One_Variable_Observable::Output(const std::string & pname) { msg_Debugging()< names; for (size_t i(0);iIDName()); for (size_t j(0);jOutput((name+id+".dat").c_str()); names.insert(name+id); } msg_Debugging()<<"}\n"; } One_Variable_Observable::~One_Variable_Observable() { 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(); } } bool One_Variable_Observable::Evaluate (const ATOOLS::Particle_List &list,double weight,double ncount, Particle_List moms,const size_t i,const size_t j,size_t k, size_t o,size_t &eval,const int mode) { if (j>=m_flavs[i].size()) { ++eval; if (m_vars[i]->IDName()=="Count") return true; std::vector vmoms(moms.size()); for (size_t l(0);lMomentum(); double val(m_vars[i]->Value(&vmoms.front(),vmoms.size())); if (msg_LevelIsDebugging()) { msg_Debugging()<<" "<Name()<<"("<Number(); for (size_t k(1);kNumber(); msg_Debugging()<<") = "<InsertMCB(val,weight,ncount); else m_dists[i]->Insert(val,weight,ncount); } return true; } if (j>0 && m_flavs[i][j]!=m_flavs[i][j-1]) o=k=0; bool pass(false); for (;kFlav())) { if ((m_items[i][j]<0 && -int(o)<=m_items[i][j]+1) || int(o)==m_items[i][j]) { moms.push_back(list[k]); if (Evaluate(list,weight,ncount,moms,i,j+1,k+1,o+1,eval,mode)) pass=true; if (int(o)==m_items[i][j]) return pass; moms.pop_back(); } ++o; } } return pass; } void One_Variable_Observable::EvaluateNLOcontrib(double weight,double ncount) { Evaluate(*p_ana->GetParticleList(m_listname),weight,ncount,1); } void One_Variable_Observable::Evaluate (const ATOOLS::Particle_List &list,double weight,double ncount) { Evaluate(list,weight,ncount,0); } void One_Variable_Observable::Evaluate (const ATOOLS::Particle_List &list,double weight,double ncount,const int mode) { msg_Debugging()<InsertMCB(1.0,0.0,ncount); else m_dists[i]->Insert(1.0,0.0,ncount); } if (m_vars[i]->IDName()=="Count") { std::vector vmoms(eval); double val(m_vars[i]->Value(&vmoms.front(),eval)); if (msg_LevelIsDebugging()) { msg_Debugging()<<" "<Name()<<"("<InsertMCB(val,weight,ncount); else m_dists[i]->Insert(val,weight,ncount); } } } msg_Debugging()<<"} done\n"; } Primitive_Observable_Base *One_Variable_Observable::Copy() const { return new One_Variable_Observable (m_listname,m_flavs,m_items,m_vtags,m_histos,p_ana,m_name); }