ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/CmsHi/JetAnalysis/src/BaseHiGenJetProducer.cc
Revision: 1.8
Committed: Thu Aug 6 17:35:53 2009 UTC (15 years, 9 months ago) by yilmaz
Content type: text/plain
Branch: MAIN
CVS Tags: cmshi_32X
Changes since 1.7: +14 -4 lines
Log Message:
Hydro part re-re-re-fixed.

File Contents

# User Rev Content
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