#ifndef __HPARTICLECUT_H__ #define __HPARTICLECUT_H__ #include "TString.h" #include "TNamed.h" #include "TTree.h" #include "TTreeFormula.h" #include "TDirectory.h" #include "TROOT.h" #include #include #include using namespace std; template class HParticleCut : public TNamed { private: Int_t fCutNumber; // a unique cut number to handle this cut TString fcondition; // formular expression for this object to cut on UInt_t fmaxCut; // how many version can be used at max TDirectory* fsaveDir; //! remember the actual directory before strting to work (will be restored) vectorfctFail; // count evaluation == kFALSE vectorfctCall; // count all call to the evaluation Bool_t fbInverseCut; // default kFALSE , kTRUE will invert selection T* fc; // template class pointer TTree* fTree; // mini tree on the object to cut on TTreeFormula* fselect; // formula object public: HParticleCut(TString name,Int_t num,TString cond); ~HParticleCut(); void setInverse(Bool_t inv) { fbInverseCut = inv;} void setMaxCut(UInt_t max=4); Bool_t eval(T* c,UInt_t version=0); void print(); void resetCounter(); Float_t getCutRate(UInt_t version=0); UInt_t getNCall(UInt_t version=0); UInt_t getNFail(UInt_t version=0); T* getClass() { return fc; } TTree* getTree() { return fTree; } TTreeFormula* getFormula() { return fselect;} TString getCondition() { return fcondition;} ClassDef(HParticleCut,1) }; template HParticleCut::HParticleCut(TString name,Int_t num,TString cond) { fsaveDir = gDirectory; gROOT->cd(); SetName(name); fCutNumber = num; fcondition = cond; fbInverseCut = kFALSE; fc = new T(); fTree = new TTree(Form("Tree_%s_%i",name.Data(),fCutNumber),Form("Tree_%s_%i",name.Data(),fCutNumber)); fTree->Branch(fc->ClassName(),fc->ClassName(),&fc,99); fselect = new TTreeFormula(Form("Selection_%s_%i",name.Data(),fCutNumber),fcondition,fTree); setMaxCut(4); fsaveDir->cd(); } template HParticleCut::~HParticleCut() { if(fselect)delete fselect; if(fTree) delete fTree; if(fc) delete fc; } template void HParticleCut::setMaxCut(UInt_t max) { // set the max number of versions of stst counters fmaxCut = max; if(fmaxCut == 0) fmaxCut = 1; resetCounter(); } template Float_t HParticleCut::getCutRate(UInt_t version) { return (version 0) ? (fctFail[version]/(Float_t)fctCall[version])*100.:0; } template UInt_t HParticleCut::getNCall(UInt_t version) { return (version UInt_t HParticleCut::getNFail(UInt_t version) { return (version void HParticleCut::resetCounter() { fctFail.clear(); fctCall.clear(); fctFail.assign(fmaxCut,0); fctCall.assign(fmaxCut,0); } template Bool_t HParticleCut::eval(T* c,UInt_t version) { // returns kTRUE if the object fullfills the condition // counters for calls and failed conditions are filled if(versionEvalInstance(0) == 0) || ( fbInverseCut && fselect->EvalInstance(0) != 0) ) { if(version void HParticleCut::print() { Int_t p = cout.precision(); std::ios_base::fmtflags fl =cout.flags(); cout<<"CutNumber : "<