[1009] | 1 |
|
---|
| 2 | /** \class JetPileUpSubtractor
|
---|
| 3 | *
|
---|
[1029] | 4 | * Subtract pile-up contribution from jets using the fastjet area method
|
---|
[1009] | 5 | *
|
---|
[1029] | 6 | * $Date: 2012-11-18 15:57:08 +0100 (Sun, 18 Nov 2012) $
|
---|
| 7 | * $Revision: 814 $
|
---|
[1009] | 8 | *
|
---|
[1029] | 9 | * \author M. Selvaggi - UCL, Louvain-la-Neuve
|
---|
[1009] | 10 | *
|
---|
| 11 | */
|
---|
| 12 |
|
---|
| 13 | #include "modules/JetPileUpSubtractor.h"
|
---|
| 14 |
|
---|
| 15 | #include "classes/DelphesClasses.h"
|
---|
| 16 | #include "classes/DelphesFactory.h"
|
---|
| 17 | #include "classes/DelphesFormula.h"
|
---|
| 18 |
|
---|
| 19 | #include "ExRootAnalysis/ExRootResult.h"
|
---|
| 20 | #include "ExRootAnalysis/ExRootFilter.h"
|
---|
| 21 | #include "ExRootAnalysis/ExRootClassifier.h"
|
---|
| 22 |
|
---|
| 23 | #include "TMath.h"
|
---|
| 24 | #include "TString.h"
|
---|
| 25 | #include "TFormula.h"
|
---|
| 26 | #include "TRandom3.h"
|
---|
| 27 | #include "TObjArray.h"
|
---|
| 28 | #include "TDatabasePDG.h"
|
---|
| 29 | #include "TLorentzVector.h"
|
---|
| 30 |
|
---|
[1029] | 31 | #include <algorithm>
|
---|
[1009] | 32 | #include <stdexcept>
|
---|
| 33 | #include <iostream>
|
---|
| 34 | #include <sstream>
|
---|
| 35 |
|
---|
| 36 | using namespace std;
|
---|
| 37 |
|
---|
| 38 | //------------------------------------------------------------------------------
|
---|
| 39 |
|
---|
| 40 | JetPileUpSubtractor::JetPileUpSubtractor() :
|
---|
[1315] | 41 | fItJetInputArray(0), fItRhoInputArray(0)
|
---|
[1009] | 42 | {
|
---|
[1029] | 43 |
|
---|
[1009] | 44 | }
|
---|
| 45 |
|
---|
| 46 | //------------------------------------------------------------------------------
|
---|
| 47 |
|
---|
| 48 | JetPileUpSubtractor::~JetPileUpSubtractor()
|
---|
| 49 | {
|
---|
[1029] | 50 |
|
---|
[1009] | 51 | }
|
---|
| 52 |
|
---|
| 53 | //------------------------------------------------------------------------------
|
---|
| 54 |
|
---|
| 55 | void JetPileUpSubtractor::Init()
|
---|
| 56 | {
|
---|
| 57 | fJetPTMin = GetDouble("JetPTMin", 20.0);
|
---|
[1029] | 58 |
|
---|
[1009] | 59 | // import input array(s)
|
---|
| 60 |
|
---|
| 61 | fJetInputArray = ImportArray(GetString("JetInputArray", "FastJetFinder/jets"));
|
---|
| 62 | fItJetInputArray = fJetInputArray->MakeIterator();
|
---|
| 63 |
|
---|
| 64 | fRhoInputArray = ImportArray(GetString("RhoInputArray", "Rho/rho"));
|
---|
[1315] | 65 | fItRhoInputArray = fRhoInputArray->MakeIterator();
|
---|
[1009] | 66 |
|
---|
| 67 | // create output array(s)
|
---|
| 68 |
|
---|
| 69 | fOutputArray = ExportArray(GetString("OutputArray", "jets"));
|
---|
| 70 |
|
---|
| 71 | }
|
---|
| 72 |
|
---|
| 73 | //------------------------------------------------------------------------------
|
---|
| 74 |
|
---|
| 75 | void JetPileUpSubtractor::Finish()
|
---|
| 76 | {
|
---|
[1315] | 77 | if(fItRhoInputArray) delete fItRhoInputArray;
|
---|
[1009] | 78 | if(fItJetInputArray) delete fItJetInputArray;
|
---|
| 79 | }
|
---|
| 80 |
|
---|
| 81 | //------------------------------------------------------------------------------
|
---|
| 82 |
|
---|
| 83 | void JetPileUpSubtractor::Process()
|
---|
| 84 | {
|
---|
[1317] | 85 | Candidate *candidate, *object;
|
---|
[1088] | 86 | TLorentzVector momentum, area;
|
---|
[1315] | 87 | Double_t eta = 0.0;
|
---|
[1088] | 88 | Double_t rho = 0.0;
|
---|
[1029] | 89 |
|
---|
[1009] | 90 | // loop over all input candidates
|
---|
| 91 | fItJetInputArray->Reset();
|
---|
| 92 | while((candidate = static_cast<Candidate*>(fItJetInputArray->Next())))
|
---|
| 93 | {
|
---|
[1088] | 94 | momentum = candidate->Momentum;
|
---|
[1009] | 95 | area = candidate->Area;
|
---|
[1315] | 96 | eta = TMath::Abs(momentum.Eta());
|
---|
[1029] | 97 |
|
---|
[1315] | 98 | // find rho
|
---|
| 99 | rho = 0.0;
|
---|
[1317] | 100 | if(fRhoInputArray)
|
---|
[1315] | 101 | {
|
---|
[1317] | 102 | fItRhoInputArray->Reset();
|
---|
| 103 | while((object = static_cast<Candidate*>(fItRhoInputArray->Next())))
|
---|
[1315] | 104 | {
|
---|
[1317] | 105 | if(eta >= object->Edges[0] && eta < object->Edges[1])
|
---|
| 106 | {
|
---|
| 107 | rho = object->Momentum.Pt();
|
---|
| 108 | }
|
---|
[1315] | 109 | }
|
---|
[1317] | 110 | }
|
---|
[1315] | 111 |
|
---|
[1009] | 112 | // apply pile-up correction
|
---|
[1089] | 113 | if(momentum.Pt() <= rho * area.Pt()) continue;
|
---|
| 114 |
|
---|
| 115 | momentum -= rho * area;
|
---|
[1317] | 116 |
|
---|
[1088] | 117 | if(momentum.Pt() <= fJetPTMin) continue;
|
---|
[1029] | 118 |
|
---|
[1009] | 119 | candidate = static_cast<Candidate*>(candidate->Clone());
|
---|
[1088] | 120 | candidate->Momentum = momentum;
|
---|
[1029] | 121 |
|
---|
[1009] | 122 | fOutputArray->Add(candidate);
|
---|
[1029] | 123 | }
|
---|
[1009] | 124 | }
|
---|
| 125 |
|
---|
| 126 | //------------------------------------------------------------------------------
|
---|