/////////////////////////////////////////////////////////////////////////////// // // /////////////////////////////////////////////////////////////////////////////// #include "TROOT.h" #include "TFolder.h" #include "Stntuple/mod/InitStntupleDataBlocks.hh" #include "Stntuple/obj/TStnElectronBlock.hh" #include "Stntuple/obj/TStnTrackBlock.hh" #include "Stntuple/obj/TStnVertex.hh" #include "Stntuple/obj/TStnEvent.hh" #include "Stntuple/obj/TStnErrorLogger.hh" #include "Stntuple/mod/StntupleEleFilter.hh" #include "Stntuple/alg/TStnElectronID.hh" ClassImp(StntupleEleFilter) //_____________________________________________________________________________ StntupleEleFilter::StntupleEleFilter() { fElectronID = new TStnElectronID; } //_____________________________________________________________________________ StntupleEleFilter::StntupleEleFilter(const char* Name, TModule* Module): StntupleFilter(Name,Module) { //----------------------------------------------------------------------------- // introduce cuts //----------------------------------------------------------------------------- TObjArray* cuts; fElectronID = new TStnElectronID; fElectronID->SetMinLoosePt( 0.); fElectronID->SetMinLooseEt(18.); //----------------------------------------------------------------------------- // object-level cuts //----------------------------------------------------------------------------- cuts = fListOfObjectCuts; cuts->Add(new StntupleCut("eleEt" ,Module, 0, 5.,1e5, 200,0,200)); cuts->Add(new StntupleCut("eleEta" ,Module, 1,-1e5,1e5, 200,-5.,5.)); cuts->Add(new StntupleCut("eleIso" ,Module, 2, 0.,1e5, 100, 0.,5.)); cuts->Add(new StntupleCut("eleIsoFrac" ,Module, 3, 0.,1e5, 100, 0.,5.)); cuts->Add(new StntupleCut("eleHadEm" ,Module, 4, 0.,1e5, 100, 0.,1.)); cuts->Add(new StntupleCut("eleEOverP" ,Module, 5, 0.,1e5, 200, 0.,2.)); cuts->Add(new StntupleCut("eleLshr" ,Module, 6,-1e5,1e5, 100, 0.,5.)); cuts->Add(new StntupleCut("elePt" ,Module, 7, 0.,1e5, 200,0,200)); cuts->Add(new StntupleCut("eleChi2S" ,Module, 8, 0.,1e5, 200,0,100)); cuts->Add(new StntupleCut("eleChi2W" ,Module, 9, 0.,1e5, 200,0,100)); cuts->Add(new StntupleCut("eleDelX" ,Module,10,-1e5,1e5, 250,-25,25)); cuts->Add(new StntupleCut("eleDelZ" ,Module,11,-1e5,1e5, 250,-25,25)); cuts->Add(new StntupleCut("eleNas" ,Module,12, 0., 10, 10, 0,10)); cuts->Add(new StntupleCut("eleNss" ,Module,13, 0., 10, 10, 0,10)); cuts->Add(new StntupleCut("eleTIso" ,Module,14, 0.,1e5, 100,0,5)); cuts->Add(new StntupleCut("eleZ0" ,Module,15,-1e5,1e5, 100,-200,200)); cuts->Add(new StntupleCut("eleClEmEt" ,Module,16, 0.,1e5, 100, 0,200)); cuts->Add(new StntupleCut("eleRawEP" ,Module,17, 0.,1e5, 100, 0,10 )); cuts->Add(new StntupleCut("eleIsCentral",Module,18, 0.,1e5, 100, 0,10 )); //----------------------------------------------------------------------------- // event-level cuts //----------------------------------------------------------------------------- cuts = fListOfEventCuts; cuts->Add(new StntupleCut("eleNGood" ,Module,31, 1.,1e5, 20 ,0,20)); cuts->Add(new StntupleCut("eleNTight" ,Module,32, 0.,1e5, 20,0,20)); cuts->Add(new StntupleCut("eleNLoose" ,Module,33, 0.,1e5, 20,0,20)); //----------------------------------------------------------------------------- // create array of parameters //----------------------------------------------------------------------------- fPar = new Double_t[40]; } //_____________________________________________________________________________ StntupleEleFilter::~StntupleEleFilter() { // fPar is deleted in the destructor of the base class (StntupleFilter) delete fElectronID; } //_____________________________________________________________________________ Int_t StntupleEleFilter::Init(TStnEvent* Event) { fTrackBlock = (TStnTrackBlock*) Event->GetDataBlock("TrackBlock"); fEleBlock = (TStnElectronBlock*) Event->GetDataBlock("ElectronBlock"); fListOfMetVertices = (TClonesArray*) Event->FindObject("ListOfMetVertices"); return 0; } //_____________________________________________________________________________ Int_t StntupleEleFilter::ProcessEvent(AbsEvent* Event) { // returns true, if the number of EM objects with // Et >= eleEtMin and eleEtaMin <= eta < eleEtaMax // is >= eleNMin static TFolder* fol = NULL; static TStnErrorLogger* logger = NULL; int it, nv, tight_id_word, loose_id_word, good_object; TStnTrack* trk; TStnVertex* vtx; if (! fol) { //----------------------------------------------------------------------------- // initialize local static variables //----------------------------------------------------------------------------- fol = (TFolder*) gROOT->GetRootFolder()->FindObject("StntupleFolder"); logger = (TStnErrorLogger*) fol->FindObject("StntupleErrorLogger"); } fNInput++; //----------------------------------------------------------------------------- // initialize track block with Mode=1 to disable beam-constrained fit of track // parameters - filter should not be using those //----------------------------------------------------------------------------- StntupleInitTrackBlock (fTrackBlock,Event,0); StntupleInitElectronBlock (fEleBlock ,Event,0); StntupleElectronBlockLinks(fEleBlock ,Event,0); int nel = fEleBlock->NElectrons(); fPar[31] = 0; // n_good - will go fPar[32] = 0; // n_tight fPar[33] = 0; // n_loose for (int i=0; iElectron(i); //----------------------------------------------------------------------------- // here transition from non-generic to generic occurs //----------------------------------------------------------------------------- fPar[0] = ele->Et(); fPar[1] = ele->Momentum()->Eta(); fPar[2] = ele->Iso(); fPar[3] = ele->Iso()/ele->Et(); fPar[4] = ele->HadEm(); fPar[5] = ele->EOverP(); fPar[6] = ele->Lshr(); fPar[7] = ele->TrackPt(); fPar[8] = ele->Chi2Strip(); fPar[9] = ele->Chi2Wire(); fPar[10] = ele->DelX(); fPar[11] = ele->DelZ(); if (ele->Momentum()->Energy() > 100) { //----------------------------------------------------------------------------- // for high-Pt electrons do not cut on Had/Em, E/P, Lshr, chi^2(CES) //----------------------------------------------------------------------------- fPar[4] = 0; fPar[5] = 1; fPar[6] = 0; fPar[8] = 0; fPar[9] = 0; } trk = 0; it = ele->TrackNumber(); fPar[12] = 0; fPar[13] = 0; fPar[14] = 0; fPar[15] = 1.e10; if (it != -1) { trk = fTrackBlock->Track(it); if (trk) { fPar[12] = trk->NAxSeg(); fPar[13] = trk->NStSeg(); fPar[14] = trk->Iso4 (); fPar[15] = trk->Z0 (); } else { logger->Report(-104, Form("StntupleEleFilter: for ele %i it=%i but trk=NULL", i,it)); } } fPar[16] = ele->ClusterEmEt(); fPar[17] = ele->RawEP(); fPar[18] = ele->IsCentral(); good_object = ApplyObjectCuts(); if (good_object) { fPar[31]++; //----------------------------------------------------------------------------- // and add electron Z0 to the list of vertices to be used to calculate MET // by construction, electron has a track... //----------------------------------------------------------------------------- nv = fListOfMetVertices->GetEntriesFast(); vtx = new ((*fListOfMetVertices)[nv]) TStnVertex(); vtx->SetXYZ(0.,0.,trk->Z0()); } ele->SetTrack(trk); tight_id_word = fElectronID->TightIDWord(ele); if (tight_id_word == 0) fPar[32]++; loose_id_word = fElectronID->LooseIDWord(ele); if (loose_id_word == 0) fPar[33]++; } //----------------------------------------------------------------------------- // now apply event-level cuts //----------------------------------------------------------------------------- fPassed = ApplyEventCuts(); if (fPassed) fNPassed++; return fPassed; }