/////////////////////////////////////////////////////////////////////////////// // // /////////////////////////////////////////////////////////////////////////////// #include #include "Stntuple/alg/TStntuple.hh" #include "Stntuple/mod/StntupleModule.hh" #include "Stntuple/mod/StntupleMuonFilter.hh" #include "Stntuple/mod/InitStntupleDataBlocks.hh" #include "Stntuple/obj/TStnMuonBlock.hh" #include "Stntuple/obj/TStnTrackBlock.hh" #include "Stntuple/obj/TStnEvent.hh" ClassImp(StntupleMuonFilter) //_____________________________________________________________________________ StntupleMuonFilter::StntupleMuonFilter() { } //_____________________________________________________________________________ StntupleMuonFilter::StntupleMuonFilter(const char* Name, TModule* Module): StntupleFilter(Name,Module) { //----------------------------------------------------------------------------- // introduce cuts //----------------------------------------------------------------------------- TObjArray* cuts; //----------------------------------------------------------------------------- // object-level cuts //----------------------------------------------------------------------------- cuts = fListOfObjectCuts; Module->AddNewCommand(Module->NewCommand("muoPrint")); cuts->Add(new StntupleCut("muoPt" ,Module, 0, 0.,1e5, 200,0,200)); cuts->Add(new StntupleCut("muoEta" ,Module, 1,-1e5,1e5, 200,-5,5)); cuts->Add(new StntupleCut("muoD0" ,Module, 2,-1e5,1e5, 200,-5,5)); cuts->Add(new StntupleCut("muoZ0" ,Module, 3,-1e5,1e5, 200,-200,200)); cuts->Add(new StntupleCut("muoNas" ,Module, 4, 0, 10, 10, 0,10)); cuts->Add(new StntupleCut("muoNss" ,Module, 5, 0, 10, 10, 0,10)); cuts->Add(new StntupleCut("muoTIso" ,Module, 6, 0.,1e5, 100,0, 5)); //----------------------------------------------------------------------------- // track-stup coordinate matching is OR'ed //----------------------------------------------------------------------------- cuts->Add(new StntupleCut("muoCmuDelX" ,Module, 7,-1e5,1e5, 200,-100,100,2)); cuts->Add(new StntupleCut("muoCmuDelDxDy" ,Module, 8,-1e5,1e5, 200,-100,100)); cuts->Add(new StntupleCut("muoCmuDelZ" ,Module, 9,-1e5,1e5, 200,-200,200)); cuts->Add(new StntupleCut("muoCmuDelDzDy" ,Module,10,-1e5,1e5, 200,-100,100)); cuts->Add(new StntupleCut("muoCmpDelX" ,Module,11,-1e5,1e5, 200,-100,100,2)); cuts->Add(new StntupleCut("muoCmpDelDxDy" ,Module,12,-1e5,1e5, 200,-100,100)); cuts->Add(new StntupleCut("muoCmxDelX" ,Module,13,-1e5,1e5, 200,-100,100,2)); cuts->Add(new StntupleCut("muoCmxDelDxDy" ,Module,14,-1e5,1e5, 200,-100,100)); cuts->Add(new StntupleCut("muoCmxDelZ" ,Module,15,-1e5,1e5, 200,-200,200)); cuts->Add(new StntupleCut("muoCmxDelDzDy" ,Module,16,-1e5,1e5, 200,-100,100)); cuts->Add(new StntupleCut("muoBmuDelX" ,Module,17,-1e5,1e5, 200,-100,100,2)); cuts->Add(new StntupleCut("muoBmuDelDxDy" ,Module,18,-1e5,1e5, 200,-100,100)); cuts->Add(new StntupleCut("muoBmuDelZ" ,Module,19,-1e5,1e5, 200,-100,100)); cuts->Add(new StntupleCut("muoBmuDelDzDy" ,Module,20,-1e5,1e5, 200,-100,100)); cuts->Add(new StntupleCut("muoEEm" ,Module,21, 0. ,1e5, 200, 0,100)); cuts->Add(new StntupleCut("muoEHad" ,Module,22, 0. ,1e5, 200, 0,100)); cuts->Add(new StntupleCut("muoTrkStubMatch" ,Module,23, 0.5 ,1.5, 10, 0, 10)); cuts->Add(new StntupleCut("muoIso" ,Module,24,-1.e5,1e5, 100,-100,100)); cuts->Add(new StntupleCut("muoChi2Cot" ,Module,25, 0. ,4.0, 100,-100,100)); //----------------------------------------------------------------------------- // event-level cuts //----------------------------------------------------------------------------- cuts = fListOfEventCuts; cuts->Add(new StntupleCut("muoNGood" ,Module, 31, 1.,1e5, 20 ,0,20)); fPar = new Double_t[40]; } //_____________________________________________________________________________ StntupleMuonFilter::~StntupleMuonFilter() { // fPar is deleted in the destructor of the base class (StntupleFilter) } //_____________________________________________________________________________ Int_t StntupleMuonFilter::Init(TStnEvent* Event) { fTrackBlock = (TStnTrackBlock*)Event->GetDataBlock("TrackBlock"); fMuonBlock = (TStnMuonBlock*) Event->GetDataBlock("MuonBlock"); return 0; } //_____________________________________________________________________________ Int_t StntupleMuonFilter::ProcessEvent(AbsEvent* Event) { // int it, nmu, good_object; double pt; fNInput++; StntupleInitTrackBlock(fTrackBlock,Event,0); StntupleInitMuonBlock (fMuonBlock,Event,0); StntupleMuonBlockLinks(fMuonBlock,Event,0); nmu = fMuonBlock->NMuons(); fPar[31] = 0; // n_good - will go for (int i=0; iMuon(i); it = muo->TrackNumber(); TStnTrack* trk = fTrackBlock->Track(it); //----------------------------------------------------------------------------- // here transition form non-generic to generic occurs //----------------------------------------------------------------------------- pt = muo->Momentum()->Pt(); fPar[ 0] = pt; fPar[ 1] = muo->Momentum()->Eta(); fPar[ 2] = TStntuple::CorrectedD0(trk); fPar[ 3] = trk->Z0(); fPar[ 4] = trk->NAxSeg(); fPar[ 5] = trk->NStSeg(); fPar[ 6] = trk->Iso4(); //----------------------------------------------------------------------------- // CMU stub-track residuals //----------------------------------------------------------------------------- fPar[ 7] = 0.; fPar[ 8] = 0.; fPar[ 9] = 0.; fPar[10] = 0.; fPar[23] = 0.; StntupleCut* cmu_dx = ObjectCut( 7); StntupleCut* cmp_dx = ObjectCut(11); StntupleCut* cmx_dx = ObjectCut(13); StntupleCut* bmu_dx = ObjectCut(17); if (muo->HasCmuStub()) { fPar[ 7] = muo->CmuDelX(); fPar[23] = fPar[23] || ((muo->CmuDelX() >= cmu_dx->PMin()) && (muo->CmuDelX() < cmu_dx->PMax()) ); fPar[ 8] = muo->CmuDelDxDy(); if (muo->CmuDelZ() < 1.e5) { fPar[ 9] = muo->CmuDelZ(); fPar[10] = muo->CmuDelDzDy(); } } //----------------------------------------------------------------------------- // CMP stub-track residuals //----------------------------------------------------------------------------- fPar[11] = 0.; fPar[12] = 0.; if (muo->HasCmpStub()) { fPar[11] = muo->CmpDelX (); fPar[12] = muo->CmpDelDxDy(); fPar[23] = fPar[23] || ((muo->CmpDelX() >= cmp_dx->PMin()) && (muo->CmpDelX() < cmp_dx->PMax()) ); } //----------------------------------------------------------------------------- // CMX stub-track residuals //----------------------------------------------------------------------------- fPar[13] = 0.; fPar[14] = 0.; fPar[15] = 0.; fPar[16] = 0.; if (muo->HasCmxStub()) { fPar[13] = muo->CmxDelX(); fPar[14] = muo->CmxDelDxDy(); fPar[23] = fPar[23] || ((muo->CmxDelX() >= cmx_dx->PMin()) && (muo->CmxDelX() < cmx_dx->PMax()) ); if (muo->CmxDelZ() < 1.e5) { fPar[15] = muo->CmxDelZ(); fPar[16] = muo->CmxDelDzDy(); } } //----------------------------------------------------------------------------- // BMU stub-track residuals //----------------------------------------------------------------------------- fPar[17] = 0.; fPar[18] = 0.; fPar[19] = 0.; fPar[20] = 0.; if (muo->HasBmuStub()) { fPar[17] = muo->BmuDelX(); fPar[18] = muo->BmuDelDxDy(); fPar[23] = fPar[23] || ((muo->BmuDelX() >= bmu_dx->PMin()) && (muo->BmuDelX() < bmu_dx->PMax()) ); if (muo->BmuDelZ() < 1.e5) { fPar[19] = muo->BmuDelZ(); fPar[20] = muo->BmuDelDzDy(); } } //----------------------------------------------------------------------------- // EM and HAD energies: cut on these only if PT < 100, make sure that non-zero // cut doesn't hurt - we use it for stripping //----------------------------------------------------------------------------- fPar[21] = 1.; fPar[22] = 1.; if (pt < 100.) { fPar[21] = muo->EmEnergy(); fPar[22] = muo->HadEnergy(); } fPar[24] = muo->Iso()/pt; fPar[25] = trk->Chi2Cot()/(trk->NCotHitsTot()-4.99999); good_object = ApplyObjectCuts(); if (good_object) fPar[31]++; } //----------------------------------------------------------------------------- // all the objects are checked, apply event-level cuts //----------------------------------------------------------------------------- fPassed = ApplyEventCuts(); if (fPassed) fNPassed++; //----------------------------------------------------------------------------- // printing //----------------------------------------------------------------------------- if (fPrintLevel == 1) { // print passed if (fPassed) fMuonBlock->Print("banner+data"); } else if (fPrintLevel == 2) { // print rejected if (! fPassed) fMuonBlock->Print("banner+data"); } return fPassed; } //_____________________________________________________________________________ Int_t StntupleMuonFilter::Command(const char* Cmd, Int_t Argc, char** Argv) { // this has to search both event and object level cuts... int level; if (strcmp(Cmd,"muoPrint") == 0) { if (Argc != 3) { Error("Command",Form("%s : too many parameters",Cmd)); return -1; } else { level = atoi(Argv[2]); this->SetPrintLevel(level); } } else { StntupleFilter::Command(Cmd,Argc,Argv); } return 0; }