/** \class Isolation * * Sums transverse momenta of isolation objects (tracks, calorimeter towers, etc) * within a DeltaR cone around a candidate and calculates fraction of this sum * to the candidate's transverse momentum. outputs candidates that have * the transverse momenta fraction within (PTRatioMin, PTRatioMax]. * * $Date: 2013-01-11 11:08:39 +0100 (Fri, 11 Jan 2013) $ * $Revision: 878 $ * * * \author P. Demin - UCL, Louvain-la-Neuve * */ #include "modules/Isolation.h" #include "classes/DelphesClasses.h" #include "classes/DelphesFactory.h" #include "classes/DelphesFormula.h" #include "ExRootAnalysis/ExRootResult.h" #include "ExRootAnalysis/ExRootFilter.h" #include "ExRootAnalysis/ExRootClassifier.h" #include "TMath.h" #include "TString.h" #include "TFormula.h" #include "TRandom3.h" #include "TObjArray.h" #include "TDatabasePDG.h" #include "TLorentzVector.h" #include #include #include #include using namespace std; //------------------------------------------------------------------------------ class IsolationClassifier : public ExRootClassifier { public: IsolationClassifier() {} Int_t GetCategory(TObject *object); Double_t fPTMin; }; //------------------------------------------------------------------------------ Int_t IsolationClassifier::GetCategory(TObject *object) { Candidate *track = static_cast(object); const TLorentzVector &momentum = track->Momentum; if(momentum.Pt() < fPTMin) return -1; return 0; } //------------------------------------------------------------------------------ Isolation::Isolation() : fClassifier(0), fFilter(0), fItIsolationInputArray(0), fItCandidateInputArray(0) { fClassifier = new IsolationClassifier; } //------------------------------------------------------------------------------ Isolation::~Isolation() { } //------------------------------------------------------------------------------ void Isolation::Init() { fDeltaRMin = GetDouble("DeltaRMin", 0.0); fDeltaRMax = GetDouble("DeltaRMax", 0.5); fPTRatioMin = GetDouble("PTRatioMin", 0.0); fPTRatioMax = GetDouble("PTRatioMax", 0.1); fClassifier->fPTMin = GetDouble("PTMin", 0.5); // import input array(s) fIsolationInputArray = ImportArray(GetString("IsolationInputArray", "Delphes/partons")); fItIsolationInputArray = fIsolationInputArray->MakeIterator(); fFilter = new ExRootFilter(fIsolationInputArray); fCandidateInputArray = ImportArray(GetString("CandidateInputArray", "Calorimeter/electrons")); fItCandidateInputArray = fCandidateInputArray->MakeIterator(); // create output array fOutputArray = ExportArray(GetString("OutputArray", "electrons")); } //------------------------------------------------------------------------------ void Isolation::Finish() { if(fFilter) delete fFilter; if(fItCandidateInputArray) delete fItCandidateInputArray; if(fItIsolationInputArray) delete fItIsolationInputArray; } //------------------------------------------------------------------------------ void Isolation::Process() { Candidate *candidate, *isolation; TObjArray *isolationArray; Double_t sumPT, ratio; // select isolation objects fFilter->Reset(); isolationArray = fFilter->GetSubArray(fClassifier, 0); if(isolationArray == 0) return; TIter itIsolationArray(isolationArray); // loop over all input jets fItCandidateInputArray->Reset(); while((candidate = static_cast(fItCandidateInputArray->Next()))) { const TLorentzVector &candidateMomentum = candidate->Momentum; // loop over all input tracks sumPT = 0.0; itIsolationArray.Reset(); while((isolation = static_cast(itIsolationArray.Next()))) { const TLorentzVector &isolationMomentum = isolation->Momentum; if(candidateMomentum.DeltaR(isolationMomentum) > fDeltaRMin && candidateMomentum.DeltaR(isolationMomentum) <= fDeltaRMax) { sumPT += isolationMomentum.Pt(); } } ratio = sumPT/candidateMomentum.Pt(); if(ratio <= fPTRatioMin || ratio > fPTRatioMax) continue; fOutputArray->Add(candidate); } } //------------------------------------------------------------------------------