1 |
yilmaz |
1.1 |
// File: BaseHiGenJetProducer.cc
|
2 |
|
|
// Author: Y.Yilmaz, 2008
|
3 |
yilmaz |
1.8 |
// $Id: BaseHiGenJetProducer.cc,v 1.7 2009/06/27 18:23:43 yilmaz Exp $
|
4 |
yilmaz |
1.1 |
//--------------------------------------------
|
5 |
|
|
#include <memory>
|
6 |
|
|
|
7 |
|
|
#include "DataFormats/Common/interface/EDProduct.h"
|
8 |
|
|
#include "FWCore/Framework/interface/Event.h"
|
9 |
|
|
#include "FWCore/Framework/interface/EventSetup.h"
|
10 |
|
|
#include "DataFormats/Common/interface/View.h"
|
11 |
|
|
#include "DataFormats/Common/interface/Handle.h"
|
12 |
|
|
#include "DataFormats/Provenance/interface/ProductID.h"
|
13 |
|
|
#include "FWCore/MessageLogger/interface/MessageLogger.h"
|
14 |
|
|
|
15 |
|
|
#include "DataFormats/JetReco/interface/CaloJetCollection.h"
|
16 |
|
|
#include "DataFormats/JetReco/interface/GenJetCollection.h"
|
17 |
|
|
#include "DataFormats/JetReco/interface/PFJetCollection.h"
|
18 |
|
|
#include "DataFormats/JetReco/interface/BasicJetCollection.h"
|
19 |
|
|
#include "RecoJets/JetAlgorithms/interface/JetRecoTypes.h"
|
20 |
|
|
#include "RecoJets/JetAlgorithms/interface/JetAlgoHelper.h"
|
21 |
|
|
#include "RecoJets/JetAlgorithms/interface/JetMaker.h"
|
22 |
|
|
#include "RecoJets/JetAlgorithms/interface/ProtoJet.h"
|
23 |
|
|
#include "DataFormats/Candidate/interface/CandidateFwd.h"
|
24 |
|
|
#include "DataFormats/Candidate/interface/LeafCandidate.h"
|
25 |
|
|
#include "FWCore/Framework/interface/ESHandle.h"
|
26 |
|
|
#include "Geometry/CaloGeometry/interface/CaloGeometry.h"
|
27 |
|
|
#include "Geometry/Records/interface/CaloGeometryRecord.h"
|
28 |
|
|
#include "SimDataFormats/HiGenData/interface/SubEventMap.h"
|
29 |
|
|
#include "DataFormats/HepMCCandidate/interface/GenParticle.h"
|
30 |
|
|
#include "FWCore/Framework/interface/ESHandle.h"
|
31 |
|
|
#include "SimGeneral/HepPDTRecord/interface/ParticleDataTable.h"
|
32 |
|
|
|
33 |
|
|
#include "CmsHi/JetAnalysis/interface/BaseHiGenJetProducer.h"
|
34 |
|
|
|
35 |
|
|
using namespace std;
|
36 |
|
|
using namespace reco;
|
37 |
|
|
using namespace JetReco;
|
38 |
|
|
|
39 |
|
|
namespace {
|
40 |
|
|
|
41 |
yilmaz |
1.7 |
bool checkHydro(GenParticleRef& p){
|
42 |
yilmaz |
1.1 |
|
43 |
yilmaz |
1.7 |
const Candidate* m1 = p->mother();
|
44 |
|
|
while(m1){
|
45 |
|
|
int pdg = abs(m1->pdgId());
|
46 |
yilmaz |
1.8 |
int st = m1->status();
|
47 |
yilmaz |
1.7 |
LogDebug("SubEventMothers")<<"Pdg ID : "<<pdg<<endl;
|
48 |
yilmaz |
1.8 |
|
49 |
|
|
if(st == 3 || pdg < 9 || pdg == 21){
|
50 |
|
|
LogDebug("SubEventMothers")<<"Sub-Collision Found! Pdg ID : "<<pdg<<endl;
|
51 |
yilmaz |
1.7 |
return false;
|
52 |
|
|
}
|
53 |
|
|
const Candidate* m = m1->mother();
|
54 |
|
|
m1 = m;
|
55 |
yilmaz |
1.8 |
|
56 |
|
|
if(!m1) LogDebug("SubEventMothers")<<"No Mother, particle is : "<<pdg<<" with status "<<st<<endl;
|
57 |
|
|
|
58 |
yilmaz |
1.7 |
}
|
59 |
|
|
return true;
|
60 |
yilmaz |
1.1 |
}
|
61 |
yilmaz |
1.7 |
|
62 |
|
|
const bool debug = false;
|
63 |
yilmaz |
1.1 |
|
64 |
|
|
bool makeCaloJet (const string& fTag) {
|
65 |
|
|
return fTag == "CaloJet";
|
66 |
|
|
}
|
67 |
|
|
bool makePFJet (const string& fTag) {
|
68 |
|
|
return fTag == "PFJet";
|
69 |
|
|
}
|
70 |
|
|
bool makeGenJet (const string& fTag) {
|
71 |
|
|
return fTag == "GenJet";
|
72 |
|
|
}
|
73 |
|
|
bool makeBasicJet (const string& fTag) {
|
74 |
|
|
return fTag == "BasicJet";
|
75 |
|
|
}
|
76 |
|
|
|
77 |
|
|
bool makeGenericJet (const string& fTag) {
|
78 |
|
|
return !makeCaloJet (fTag) && !makePFJet (fTag) && !makeGenJet (fTag) && !makeBasicJet (fTag);
|
79 |
|
|
}
|
80 |
|
|
|
81 |
|
|
template <class T>
|
82 |
|
|
void dumpJets (const T& fJets) {
|
83 |
|
|
for (unsigned i = 0; i < fJets.size(); ++i) {
|
84 |
yilmaz |
1.2 |
std::cout<< "Jet # " << i << std::endl << fJets[i].print();
|
85 |
yilmaz |
1.1 |
}
|
86 |
|
|
}
|
87 |
|
|
|
88 |
|
|
void copyVariables (const ProtoJet& fProtojet, reco::Jet* fJet) {
|
89 |
|
|
fJet->setJetArea (fProtojet.jetArea ());
|
90 |
|
|
fJet->setPileup (fProtojet.pileup ());
|
91 |
|
|
fJet->setNPasses (fProtojet.nPasses ());
|
92 |
|
|
}
|
93 |
|
|
|
94 |
yilmaz |
1.3 |
void copyConstituents (const JetReco::InputCollection& fConstituents, const edm::View <Candidate>& fInput, reco::Jet* fJet) {
|
95 |
|
|
// put constituents
|
96 |
|
|
for (unsigned iConstituent = 0; iConstituent < fConstituents.size (); ++iConstituent) {
|
97 |
|
|
fJet->addDaughter (fInput.ptrAt (fConstituents[iConstituent].index ()));
|
98 |
|
|
}
|
99 |
|
|
}
|
100 |
|
|
|
101 |
yilmaz |
1.1 |
}
|
102 |
|
|
|
103 |
|
|
namespace cms
|
104 |
|
|
{
|
105 |
|
|
// Constructor takes input parameters now: to be replaced with parameter set.
|
106 |
|
|
BaseHiGenJetProducer::BaseHiGenJetProducer(const edm::ParameterSet& conf)
|
107 |
|
|
: mSrc(conf.getParameter<edm::InputTag>( "src")),
|
108 |
yilmaz |
1.3 |
mapSrc(conf.getParameter<edm::InputTag>( "srcMap")),
|
109 |
yilmaz |
1.1 |
mJetType (conf.getParameter<string>( "jetType")),
|
110 |
|
|
mVerbose (conf.getUntrackedParameter<bool>("verbose", false)),
|
111 |
|
|
mEtInputCut (conf.getParameter<double>("inputEtMin")),
|
112 |
|
|
mEInputCut (conf.getParameter<double>("inputEMin")),
|
113 |
yilmaz |
1.5 |
ignoreHydro_ (conf.getUntrackedParameter<bool>("ignoreHydro", true)),
|
114 |
yilmaz |
1.7 |
nMax_(conf.getUntrackedParameter<double>("maxParticles", 2000))
|
115 |
yilmaz |
1.1 |
{
|
116 |
|
|
std::string alias = conf.getUntrackedParameter<string>( "alias", conf.getParameter<std::string>("@module_label"));
|
117 |
|
|
if (makeCaloJet (mJetType)) {
|
118 |
|
|
produces<CaloJetCollection>().setBranchAlias (alias);
|
119 |
|
|
}
|
120 |
|
|
else if (makePFJet (mJetType)) produces<PFJetCollection>().setBranchAlias (alias);
|
121 |
|
|
else if (makeGenJet (mJetType)) produces<GenJetCollection>().setBranchAlias (alias);
|
122 |
|
|
else if (makeBasicJet (mJetType)) produces<BasicJetCollection>().setBranchAlias (alias);
|
123 |
|
|
// else if (makeGenericJet (mJetType)) produces<GenericJetCollection>().setBranchAlias (alias);
|
124 |
|
|
}
|
125 |
|
|
|
126 |
|
|
// Virtual destructor needed.
|
127 |
|
|
BaseHiGenJetProducer::~BaseHiGenJetProducer() { }
|
128 |
|
|
|
129 |
|
|
void BaseHiGenJetProducer::beginJob(const edm::EventSetup& fSetup)
|
130 |
|
|
{
|
131 |
|
|
fSetup.getData(mPdt);
|
132 |
|
|
}
|
133 |
|
|
|
134 |
|
|
// Functions that gets called by framework every event
|
135 |
|
|
void BaseHiGenJetProducer::produce(edm::Event& e, const edm::EventSetup& fSetup)
|
136 |
|
|
{
|
137 |
|
|
using namespace reco;
|
138 |
|
|
|
139 |
yilmaz |
1.3 |
edm::Handle< edm::View<Candidate> > inputHandle;
|
140 |
yilmaz |
1.1 |
e.getByLabel(mSrc,inputHandle);
|
141 |
|
|
|
142 |
|
|
edm::Handle<edm::SubEventMap> subs;
|
143 |
yilmaz |
1.3 |
e.getByLabel(mapSrc,subs);
|
144 |
yilmaz |
1.1 |
|
145 |
|
|
vector <ProtoJet> output;
|
146 |
|
|
vector<JetReco::InputCollection> inputs;
|
147 |
|
|
|
148 |
yilmaz |
1.2 |
vector<int> nsubparticle;
|
149 |
yilmaz |
1.7 |
vector<int> hydroTag;
|
150 |
yilmaz |
1.2 |
|
151 |
yilmaz |
1.1 |
for (unsigned i = 0; i < inputHandle->size(); ++i) {
|
152 |
yilmaz |
1.7 |
|
153 |
yilmaz |
1.3 |
GenParticleRef pref = inputHandle->refAt(i).castTo<GenParticleRef>();
|
154 |
|
|
int subevent = (*subs)[pref];
|
155 |
yilmaz |
1.2 |
LogDebug("SubEventJets")<<"inputs size "<<inputs.size()<<" subevent "<<subevent;
|
156 |
yilmaz |
1.7 |
|
157 |
yilmaz |
1.2 |
if(subevent >= inputs.size()){
|
158 |
yilmaz |
1.7 |
// hydroTag.push_back(-1);
|
159 |
|
|
hydroTag.resize(subevent+1);
|
160 |
|
|
hydroTag[subevent] = -1;
|
161 |
yilmaz |
1.2 |
inputs.resize(subevent+1);
|
162 |
|
|
nsubparticle.resize(subevent+1);
|
163 |
|
|
}
|
164 |
yilmaz |
1.7 |
|
165 |
yilmaz |
1.8 |
if(hydroTag[subevent] != 0) hydroTag[subevent] = (int)checkHydro(pref);
|
166 |
yilmaz |
1.7 |
|
167 |
|
|
if(nsubparticle[subevent]> nMax_ && hydroTag[subevent] != 1){
|
168 |
|
|
LogDebug("JetsInHydro")<<"More particles than maximum particles cut, although not previously identified as sub-event, Sub-Event : "<<subevent;
|
169 |
|
|
|
170 |
|
|
hydroTag[subevent] = 1;
|
171 |
|
|
}
|
172 |
|
|
|
173 |
|
|
|
174 |
|
|
if(hydroTag[subevent] != 1){
|
175 |
yilmaz |
1.3 |
(inputs[subevent]).push_back(JetReco::InputItem(&((*inputHandle)[i]),i));
|
176 |
yilmaz |
1.2 |
nsubparticle[subevent]++;
|
177 |
|
|
}
|
178 |
yilmaz |
1.1 |
}
|
179 |
yilmaz |
1.7 |
|
180 |
yilmaz |
1.1 |
int nsub = inputs.size();
|
181 |
yilmaz |
1.5 |
|
182 |
yilmaz |
1.8 |
bool hydroDone = false;
|
183 |
yilmaz |
1.1 |
for(int isub = 0; isub < nsub; ++isub){
|
184 |
|
|
cout<<"Processing Sub-Event : "<<isub<<endl;
|
185 |
|
|
JetReco::InputCollection & input = inputs[isub];
|
186 |
yilmaz |
1.7 |
if(hydroTag[isub] == 1){
|
187 |
yilmaz |
1.8 |
if(hydroDone){
|
188 |
|
|
throw cms::Exception("HeavyIonHydroEvent")<<"More than one Hydro sub-event found for the input, please check your MC! Second hydro id : "<<isub<<endl;
|
189 |
|
|
}
|
190 |
yilmaz |
1.7 |
cout<<"Sub-Event number "<<isub<<" with more than "<<input.size()<<" particles, skipped as background event. Number of total sub-events: "<<nsub<<endl;
|
191 |
yilmaz |
1.8 |
hydroDone = true;
|
192 |
yilmaz |
1.1 |
}else{
|
193 |
|
|
|
194 |
|
|
if (mVerbose) {
|
195 |
|
|
std::cout << "BaseJetProducer::produce-> INPUT COLLECTION selected from" << mSrc
|
196 |
|
|
<< " with ET > " << mEtInputCut << " and/or E > " << mEInputCut << std::endl;
|
197 |
|
|
for (unsigned index = 0; index < input.size(); ++index) {
|
198 |
|
|
std::cout << " Input " << index << ", px/py/pz/pt/e: "
|
199 |
|
|
<< input[index]->px() << '/' << input[index]->py() << '/' << input[index]->pz() << '/'
|
200 |
|
|
<< input[index]->pt() << '/' << input[index]->energy()
|
201 |
|
|
<< std::endl;
|
202 |
|
|
}
|
203 |
|
|
}
|
204 |
|
|
|
205 |
|
|
if (input.empty ()) {
|
206 |
|
|
edm::LogInfo ("Empty Event") << "empty input for jet algorithm: bypassing..." << std::endl;
|
207 |
|
|
}
|
208 |
|
|
else {
|
209 |
|
|
cout<<"Algorithm running on sub-event..."<<endl;
|
210 |
|
|
this->runAlgorithm (input, &output);
|
211 |
|
|
}
|
212 |
|
|
}
|
213 |
|
|
}
|
214 |
|
|
|
215 |
|
|
// produce output collection
|
216 |
|
|
if (mVerbose) {
|
217 |
|
|
std::cout << "OUTPUT JET COLLECTION:" << std::endl;
|
218 |
|
|
}
|
219 |
|
|
reco::Jet::Point vertex (0,0,0); // do not have true vertex yet, use default
|
220 |
|
|
|
221 |
|
|
// make sure protojets are sorted
|
222 |
|
|
sortByPt (&output);
|
223 |
|
|
if (makeGenJet (mJetType)) {
|
224 |
|
|
|
225 |
|
|
cout<<"Saving GenJets..."<<endl;
|
226 |
|
|
|
227 |
|
|
auto_ptr<GenJetCollection> jets (new GenJetCollection);
|
228 |
|
|
jets->reserve(output.size());
|
229 |
|
|
for (unsigned iJet = 0; iJet < output.size (); ++iJet) {
|
230 |
|
|
ProtoJet* protojet = &(output [iJet]);
|
231 |
|
|
const JetReco::InputCollection& constituents = protojet->getTowerList();
|
232 |
|
|
GenJet::Specific specific;
|
233 |
|
|
JetMaker::makeSpecific (constituents, &specific);
|
234 |
|
|
jets->push_back (GenJet (protojet->p4(), vertex, specific));
|
235 |
|
|
Jet* newJet = &(jets->back());
|
236 |
|
|
copyConstituents (constituents, *inputHandle, newJet);
|
237 |
|
|
copyVariables (*protojet, newJet);
|
238 |
|
|
}
|
239 |
|
|
|
240 |
|
|
if (mVerbose) dumpJets (*jets);
|
241 |
|
|
e.put(jets);
|
242 |
|
|
}
|
243 |
|
|
}
|
244 |
|
|
}
|
245 |
|
|
|