ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/CmsHi/JetAnalysis/src/RecHitTreeProducer.cc
Revision: 1.25
Committed: Sun Jan 20 16:58:58 2013 UTC (12 years, 3 months ago) by yilmaz
Content type: text/plain
Branch: MAIN
CVS Tags: HiForest_V02_43, HiForest_V02_42, HiForest_V02_41, HiForest_V02_40, HiForest_V02_39
Changes since 1.24: +52 -35 lines
Log Message:
rec hit analyzer updated for ZDC

File Contents

# User Rev Content
1 yilmaz 1.1 // -*- C++ -*-
2     //
3     // Package: RecHitTreeProducer
4     // Class: RecHitTreeProducer
5     //
6     /**\class RecHitTreeProducer RecHitTreeProducer.cc CmsHi/RecHitTreeProducer/src/RecHitTreeProducer.cc
7    
8     Description: [one line class summary]
9    
10     Implementation:
11     [Notes on implementation]
12     */
13     //
14     // Original Author: Yetkin Yilmaz
15 yjlee 1.17 // Modified: Frank Ma, Yen-Jie Lee
16 yilmaz 1.1 // Created: Tue Sep 7 11:38:19 EDT 2010
17 yilmaz 1.25 // $Id: RecHitTreeProducer.cc,v 1.22 2013/01/16 17:22:56 yilmaz Exp $
18 yilmaz 1.1 //
19     //
20    
21 yjlee 1.16 #define versionTag "v1"
22 yilmaz 1.1 // system include files
23     #include <memory>
24     #include <vector>
25     #include <iostream>
26    
27     // user include files
28     #include "FWCore/Framework/interface/Frameworkfwd.h"
29     #include "FWCore/Framework/interface/EDAnalyzer.h"
30    
31     #include "FWCore/Framework/interface/Event.h"
32     #include "FWCore/Framework/interface/MakerMacros.h"
33     #include "FWCore/Framework/interface/ESHandle.h"
34     #include "FWCore/ParameterSet/interface/ParameterSet.h"
35    
36     #include "DataFormats/DetId/interface/DetId.h"
37     #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
38     #include "Geometry/Records/interface/IdealGeometryRecord.h"
39     #include "Geometry/Records/interface/CaloGeometryRecord.h"
40     #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
41    
42     #include "CommonTools/UtilAlgos/interface/TFileService.h"
43     #include "FWCore/ServiceRegistry/interface/Service.h"
44    
45     #include "DataFormats/Math/interface/deltaR.h"
46    
47     #include "DataFormats/Common/interface/Handle.h"
48     #include "DataFormats/FWLite/interface/ChainEvent.h"
49     #include "FWCore/Utilities/interface/InputTag.h"
50     #include "DataFormats/HeavyIonEvent/interface/CentralityBins.h"
51     #include "DataFormats/CaloTowers/interface/CaloTower.h"
52     #include "DataFormats/HeavyIonEvent/interface/Centrality.h"
53     #include "SimDataFormats/HiGenData/interface/GenHIEvent.h"
54     #include "DataFormats/PatCandidates/interface/Jet.h"
55     #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
56    
57     #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
58     #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
59 yilmaz 1.23 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
60 yilmaz 1.1 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
61     #include "DataFormats/EcalDetId/interface/EcalDetIdCollections.h"
62 yilmaz 1.6 #include "DataFormats/EgammaReco/interface/BasicClusterFwd.h"
63 yilmaz 1.1 #include "DataFormats/DetId/interface/DetId.h"
64    
65 frankma 1.14 #include "DataFormats/VertexReco/interface/Vertex.h"
66     #include "DataFormats/VertexReco/interface/VertexFwd.h"
67    
68 yilmaz 1.25 #include "CalibFormats/HcalObjects/interface/HcalCoderDb.h"
69     #include "CalibFormats/HcalObjects/interface/HcalDbService.h"
70     #include "CalibFormats/HcalObjects/interface/HcalDbRecord.h"
71     #include "RecoLocalCalo/HcalRecAlgos/interface/HcalCaloFlagLabels.h"
72 yilmaz 1.1
73     #include "TNtuple.h"
74    
75     using namespace std;
76    
77 yjlee 1.20 #define MAXHITS 100000
78 yilmaz 1.1
79 yilmaz 1.23
80 yilmaz 1.1 struct MyRecHit{
81 yilmaz 1.9 int depth[MAXHITS];
82 yilmaz 1.1 int n;
83    
84 yilmaz 1.21 int ieta[MAXHITS];
85     int iphi[MAXHITS];
86    
87 yilmaz 1.1 float e[MAXHITS];
88     float et[MAXHITS];
89     float eta[MAXHITS];
90     float phi[MAXHITS];
91 yilmaz 1.18 float perp[MAXHITS];
92     float emEt[MAXHITS];
93     float hadEt[MAXHITS];
94    
95 nart 1.3 bool isjet[MAXHITS];
96 yilmaz 1.18 float etVtx[MAXHITS];
97     float etaVtx[MAXHITS];
98     float phiVtx[MAXHITS];
99     float perpVtx[MAXHITS];
100 frankma 1.14 float emEtVtx[MAXHITS];
101     float hadEtVtx[MAXHITS];
102 yilmaz 1.1
103 yilmaz 1.6 float jtpt;
104     float jteta;
105     float jtphi;
106    
107 yilmaz 1.1 };
108    
109 yilmaz 1.23 struct MyZDCRecHit{
110     int n;
111     float e[18];
112     int zside[18];
113     int section [18];
114     int channel[18];
115     int saturation[18];
116     };
117    
118     struct MyZDCDigi{
119     int n;
120 yilmaz 1.25 float chargefC[10][18];
121     int adc[10][18];
122     int ts[10][18];
123     int zside[18];
124     int section [18];
125     int channel[18];
126 yilmaz 1.23 };
127 yilmaz 1.1
128 yilmaz 1.7 struct MyBkg{
129     int n;
130     float rho[50];
131     float sigma[50];
132     };
133    
134 yilmaz 1.1
135     //
136     // class declaration
137     //
138    
139     class RecHitTreeProducer : public edm::EDAnalyzer {
140     public:
141     explicit RecHitTreeProducer(const edm::ParameterSet&);
142     ~RecHitTreeProducer();
143 yilmaz 1.18 double getEt(const DetId &id, double energy, reco::Vertex::Point vtx = reco::Vertex::Point(0,0,0));
144     double getEta(const DetId &id, reco::Vertex::Point vtx = reco::Vertex::Point(0,0,0));
145     double getPhi(const DetId &id, reco::Vertex::Point vtx = reco::Vertex::Point(0,0,0));
146     double getPerp(const DetId &id, reco::Vertex::Point vtx = reco::Vertex::Point(0,0,0));
147    
148     math::XYZPoint getPosition(const DetId &id, reco::Vertex::Point vtx = reco::Vertex::Point(0,0,0));
149     double getEt(math::XYZPoint pos, double energy);
150    
151 frankma 1.14 reco::Vertex::Point getVtx(const edm::Event& ev);
152    
153 yilmaz 1.1
154    
155     private:
156     virtual void beginJob() ;
157     virtual void analyze(const edm::Event&, const edm::EventSetup&);
158     virtual void endJob() ;
159    
160     // ----------member data ---------------------------
161    
162     edm::Handle<reco::Centrality> cent;
163     edm::Handle<vector<double> > ktRhos;
164     edm::Handle<vector<double> > akRhos;
165    
166 yilmaz 1.2 edm::Handle<edm::SortedCollection<EcalRecHit,edm::StrictWeakOrdering<EcalRecHit> > > ebHits;
167     edm::Handle<edm::SortedCollection<EcalRecHit,edm::StrictWeakOrdering<EcalRecHit> > > eeHits;
168    
169     edm::Handle<HFRecHitCollection> hfHits;
170     edm::Handle<HBHERecHitCollection> hbheHits;
171 yilmaz 1.1
172 yilmaz 1.6 edm::Handle<reco::BasicClusterCollection> bClusters;
173     edm::Handle<CaloTowerCollection> towers;
174 frankma 1.14 edm::Handle<reco::VertexCollection> vtxs;
175 yilmaz 1.6
176 nart 1.3 typedef vector<EcalRecHit>::const_iterator EcalIterator;
177    
178     edm::Handle<reco::CaloJetCollection> jets;
179 yilmaz 1.7
180     edm::Handle<std::vector<double> > rhos;
181     edm::Handle<std::vector<double> > sigmas;
182 nart 1.3
183 yilmaz 1.1 MyRecHit hbheRecHit;
184     MyRecHit hfRecHit;
185 yilmaz 1.2 MyRecHit ebRecHit;
186     MyRecHit eeRecHit;
187 yilmaz 1.23 MyRecHit myBC;
188     MyRecHit myTowers;
189 yilmaz 1.21 MyRecHit castorRecHit;
190    
191 yilmaz 1.23 MyZDCRecHit zdcRecHit;
192     MyZDCDigi zdcDigi;
193    
194     MyBkg bkg;
195 yilmaz 1.7
196 yilmaz 1.9 TNtuple* nt;
197 yilmaz 1.1 TTree* hbheTree;
198     TTree* hfTree;
199 yilmaz 1.2 TTree* ebTree;
200     TTree* eeTree;
201 yilmaz 1.6 TTree* bcTree;
202     TTree* towerTree;
203 yilmaz 1.7 TTree* bkgTree;
204 yilmaz 1.21 TTree* castorTree;
205 yilmaz 1.23 TTree* zdcRecHitTree;
206     TTree* zdcDigiTree;
207 yilmaz 1.6
208 yilmaz 1.2 double cone;
209 yilmaz 1.9 double hfTowerThreshold_;
210     double hfLongThreshold_;
211     double hfShortThreshold_;
212     double hbheThreshold_;
213     double ebThreshold_;
214     double eeThreshold_;
215 frankma 1.13
216     double hbhePtMin_;
217     double hfPtMin_;
218     double ebPtMin_;
219     double eePtMin_;
220     double towerPtMin_;
221 yilmaz 1.25
222     int nZdcTs_;
223     bool calZDCDigi_;
224 frankma 1.13
225 yilmaz 1.1 edm::Service<TFileService> fs;
226     const CentralityBins * cbins_;
227     const CaloGeometry *geo;
228    
229     edm::InputTag HcalRecHitHFSrc_;
230     edm::InputTag HcalRecHitHBHESrc_;
231 yilmaz 1.2 edm::InputTag EBSrc_;
232     edm::InputTag EESrc_;
233 yilmaz 1.6 edm::InputTag BCSrc_;
234     edm::InputTag TowerSrc_;
235 frankma 1.14 edm::InputTag VtxSrc_;
236 yilmaz 1.6
237 nart 1.3 edm::InputTag JetSrc_;
238 yilmaz 1.6
239 yilmaz 1.7 edm::InputTag FastJetTag_;
240    
241 yilmaz 1.6 bool useJets_;
242     bool doBasicClusters_;
243 yilmaz 1.7 bool doTowers_;
244     bool doEcal_;
245     bool doHcal_;
246 yjlee 1.17 bool doHF_;
247 yilmaz 1.21 bool doCastor_;
248 yilmaz 1.23 bool doZDCRecHit_;
249     bool doZDCDigi_;
250 yilmaz 1.21
251 frankma 1.15 bool hasVtx_;
252 yilmaz 1.18 bool saveBothVtx_;
253 yilmaz 1.1
254 yilmaz 1.7 bool doFastJet_;
255 yilmaz 1.9
256     bool doEbyEonly_;
257 yilmaz 1.18
258 yilmaz 1.1 };
259    
260     //
261     // constants, enums and typedefs
262     //
263    
264     //
265     // static data member definitions
266     //
267    
268     //
269     // constructors and destructor
270     //
271     RecHitTreeProducer::RecHitTreeProducer(const edm::ParameterSet& iConfig) :
272     cbins_(0),
273     geo(0),
274     cone(0.5)
275     {
276     //now do what ever initialization is needed
277 yilmaz 1.2 EBSrc_ = iConfig.getUntrackedParameter<edm::InputTag>("EBRecHitSrc",edm::InputTag("ecalRecHit","EcalRecHitsEB"));
278     EESrc_ = iConfig.getUntrackedParameter<edm::InputTag>("EERecHitSrc",edm::InputTag("ecalRecHit","EcalRecHitsEE"));
279 yilmaz 1.1 HcalRecHitHFSrc_ = iConfig.getUntrackedParameter<edm::InputTag>("hcalHFRecHitSrc",edm::InputTag("hfreco"));
280     HcalRecHitHBHESrc_ = iConfig.getUntrackedParameter<edm::InputTag>("hcalHBHERecHitSrc",edm::InputTag("hbhereco"));
281 yilmaz 1.6 BCSrc_ = iConfig.getUntrackedParameter<edm::InputTag>("BasicClusterSrc1",edm::InputTag("ecalRecHit","EcalRecHitsEB","RECO"));
282     TowerSrc_ = iConfig.getUntrackedParameter<edm::InputTag>("towersSrc",edm::InputTag("towerMaker"));
283 frankma 1.14 VtxSrc_ = iConfig.getUntrackedParameter<edm::InputTag>("vtxSrc",edm::InputTag("hiSelectedVertex"));
284 yilmaz 1.10 JetSrc_ = iConfig.getUntrackedParameter<edm::InputTag>("JetSrc",edm::InputTag("iterativeConePu5CaloJets"));
285 yilmaz 1.7 useJets_ = iConfig.getUntrackedParameter<bool>("useJets",true);
286 yilmaz 1.6 doBasicClusters_ = iConfig.getUntrackedParameter<bool>("doBasicClusters",false);
287 yilmaz 1.7 doTowers_ = iConfig.getUntrackedParameter<bool>("doTowers",true);
288     doEcal_ = iConfig.getUntrackedParameter<bool>("doEcal",true);
289     doHcal_ = iConfig.getUntrackedParameter<bool>("doHcal",true);
290 yjlee 1.17 doHF_ = iConfig.getUntrackedParameter<bool>("doHF",true);
291 yilmaz 1.21 doCastor_ = iConfig.getUntrackedParameter<bool>("doCASTOR",true);
292 yilmaz 1.23 doZDCRecHit_ = iConfig.getUntrackedParameter<bool>("doZDCRecHit",true);
293     doZDCDigi_ = iConfig.getUntrackedParameter<bool>("doZDCDigi",true);
294 yilmaz 1.21
295 yilmaz 1.18 hasVtx_ = iConfig.getUntrackedParameter<bool>("hasVtx",true);
296     saveBothVtx_ = iConfig.getUntrackedParameter<bool>("saveBothVtx",false);
297    
298 yilmaz 1.7 doFastJet_ = iConfig.getUntrackedParameter<bool>("doFastJet",true);
299     FastJetTag_ = iConfig.getUntrackedParameter<edm::InputTag>("FastJetTag",edm::InputTag("kt4CaloJets"));
300 yilmaz 1.9 doEbyEonly_ = iConfig.getUntrackedParameter<bool>("doEbyEonly",false);
301     hfTowerThreshold_ = iConfig.getUntrackedParameter<double>("HFtowerMin",3.);
302 yilmaz 1.11 hfLongThreshold_ = iConfig.getUntrackedParameter<double>("HFlongMin",0.5);
303     hfShortThreshold_ = iConfig.getUntrackedParameter<double>("HFshortMin",0.85);
304 frankma 1.13 hbhePtMin_ = iConfig.getUntrackedParameter<double>("HBHETreePtMin",0);
305     hfPtMin_ = iConfig.getUntrackedParameter<double>("HFTreePtMin",0);
306     ebPtMin_ = iConfig.getUntrackedParameter<double>("EBTreePtMin",0);
307     eePtMin_ = iConfig.getUntrackedParameter<double>("EETreePtMin",0.);
308     towerPtMin_ = iConfig.getUntrackedParameter<double>("TowerTreePtMin",0.);
309 yilmaz 1.25 nZdcTs_=iConfig.getUntrackedParameter<int>("nZdcTs",10);
310     calZDCDigi_=iConfig.getUntrackedParameter<bool>("calZDCDigi",true);
311 yilmaz 1.1 }
312    
313    
314     RecHitTreeProducer::~RecHitTreeProducer()
315     {
316    
317     // do anything here that needs to be done at desctruction time
318     // (e.g. close files, deallocate resources etc.)
319    
320     }
321    
322    
323     //
324     // member functions
325     //
326    
327     // ------------ method called to for each event ------------
328     void
329     RecHitTreeProducer::analyze(const edm::Event& ev, const edm::EventSetup& iSetup)
330     {
331    
332     hfRecHit.n = 0;
333     hbheRecHit.n = 0;
334 yilmaz 1.2 ebRecHit.n = 0;
335     eeRecHit.n = 0;
336 yilmaz 1.7 myBC.n = 0;
337     myTowers.n = 0;
338     bkg.n = 0;
339 yilmaz 1.1
340 frankma 1.14 // get vertex
341 yilmaz 1.18 reco::Vertex::Point vtx(0,0,0);
342 frankma 1.15 if (hasVtx_) vtx = getVtx(ev);
343 frankma 1.14
344 yjlee 1.17 if(doEcal_){
345     ev.getByLabel(EBSrc_,ebHits);
346     ev.getByLabel(EESrc_,eeHits);
347 yilmaz 1.7 }
348 yjlee 1.17
349 yilmaz 1.7 if(doHcal_){
350 yjlee 1.17 ev.getByLabel(HcalRecHitHBHESrc_,hbheHits);
351     }
352     if(doHF_){
353     ev.getByLabel(HcalRecHitHFSrc_,hfHits);
354 yilmaz 1.7 }
355 yjlee 1.17
356 yilmaz 1.6 if(useJets_) {
357     ev.getByLabel(JetSrc_,jets);
358     }
359 nart 1.3
360 yilmaz 1.6 if(doBasicClusters_){
361     ev.getByLabel(BCSrc_,bClusters);
362 nart 1.3 }
363 yilmaz 1.6
364 yilmaz 1.7 if(doTowers_){
365     ev.getByLabel(TowerSrc_,towers);
366     }
367 yilmaz 1.6
368 yilmaz 1.7 if(doFastJet_){
369     ev.getByLabel(edm::InputTag(FastJetTag_.label(),"rhos",FastJetTag_.process()),rhos);
370     ev.getByLabel(edm::InputTag(FastJetTag_.label(),"sigmas",FastJetTag_.process()),sigmas);
371     bkg.n = rhos->size();
372     for(unsigned int i = 0; i < rhos->size(); ++i){
373     bkg.rho[i] = (*rhos)[i];
374     bkg.sigma[i] = (*sigmas)[i];
375     }
376     }
377 nart 1.3
378 yilmaz 1.6 if(0 && !cbins_) cbins_ = getCentralityBinsFromDB(iSetup);
379 yilmaz 1.1
380     if(!geo){
381     edm::ESHandle<CaloGeometry> pGeo;
382     iSetup.get<CaloGeometryRecord>().get(pGeo);
383     geo = pGeo.product();
384     }
385 yilmaz 1.9
386 yilmaz 1.12 int nHFlongPlus = 0;
387     int nHFshortPlus = 0;
388     int nHFtowerPlus = 0;
389     int nHFlongMinus = 0;
390     int nHFshortMinus = 0;
391     int nHFtowerMinus = 0;
392 yilmaz 1.18
393 yjlee 1.17 if(doHF_){
394 yilmaz 1.1 for(unsigned int i = 0; i < hfHits->size(); ++i){
395     const HFRecHit & hit= (*hfHits)[i];
396     hfRecHit.e[hfRecHit.n] = hit.energy();
397 yilmaz 1.18 math::XYZPoint pos = getPosition(hit.id(),vtx);
398    
399     if(!saveBothVtx_){
400     hfRecHit.et[hfRecHit.n] = getEt(pos,hit.energy());
401     hfRecHit.eta[hfRecHit.n] = pos.eta();
402     hfRecHit.phi[hfRecHit.n] = pos.phi();
403     hfRecHit.perp[hfRecHit.n] = pos.rho();
404     }else{
405     hfRecHit.et[hfRecHit.n] = getEt(hit.id(),hit.energy());
406     hfRecHit.eta[hfRecHit.n] = getEta(hit.id());
407     hfRecHit.phi[hfRecHit.n] = getPhi(hit.id());
408     hfRecHit.perp[hfRecHit.n] = getPerp(hit.id());
409    
410     hfRecHit.etVtx[hfRecHit.n] = getEt(pos,hit.energy());
411     hfRecHit.etaVtx[hfRecHit.n] = pos.eta();
412     hfRecHit.phiVtx[hfRecHit.n] = pos.phi();
413     hfRecHit.perpVtx[hfRecHit.n] = pos.rho();
414    
415     }
416    
417 nart 1.3 hfRecHit.isjet[hfRecHit.n] = false;
418 yilmaz 1.9 hfRecHit.depth[hfRecHit.n] = hit.id().depth();
419 yilmaz 1.12
420     if(hit.id().ieta() > 0){
421 yjlee 1.17 if(hit.energy() > hfShortThreshold_ && hit.id().depth() != 1) nHFshortPlus++;
422     if(hit.energy() > hfLongThreshold_ && hit.id().depth() == 1) nHFlongPlus++;
423 yilmaz 1.12 }else{
424     if(hit.energy() > hfShortThreshold_ && hit.id().depth() != 1) nHFshortMinus++;
425     if(hit.energy() > hfLongThreshold_ && hit.id().depth() == 1) nHFlongMinus++;
426     }
427 yilmaz 1.9
428 yilmaz 1.7 if(useJets_){
429 nart 1.3 for(unsigned int j = 0 ; j < jets->size(); ++j){
430     const reco::Jet& jet = (*jets)[j];
431     double dr = reco::deltaR(hfRecHit.eta[hfRecHit.n],hfRecHit.phi[hfRecHit.n],jet.eta(),jet.phi());
432     if(dr < cone){ hfRecHit.isjet[hfRecHit.n] = true; }
433     }
434     }
435 frankma 1.13 if (hfRecHit.et[hfRecHit.n]>=hfPtMin_) hfRecHit.n++;
436 yilmaz 1.1 }
437 yjlee 1.17
438     if(doHcal_ && !doEbyEonly_){
439 yilmaz 1.1 for(unsigned int i = 0; i < hbheHits->size(); ++i){
440     const HBHERecHit & hit= (*hbheHits)[i];
441 frankma 1.13 if (getEt(hit.id(),hit.energy())<hbhePtMin_) continue;
442 yilmaz 1.18
443 nart 1.3 hbheRecHit.e[hbheRecHit.n] = hit.energy();
444 yilmaz 1.18 math::XYZPoint pos = getPosition(hit.id(),vtx);
445    
446     if(!saveBothVtx_){
447     hbheRecHit.et[hbheRecHit.n] = getEt(pos,hit.energy());
448     hbheRecHit.eta[hbheRecHit.n] = pos.eta();
449     hbheRecHit.phi[hbheRecHit.n] = pos.phi();
450     hbheRecHit.perp[hbheRecHit.n] = pos.rho();
451     }else{
452     hbheRecHit.et[hbheRecHit.n] = getEt(hit.id(),hit.energy());
453     hbheRecHit.eta[hbheRecHit.n] = getEta(hit.id());
454     hbheRecHit.phi[hbheRecHit.n] = getPhi(hit.id());
455     hbheRecHit.perp[hbheRecHit.n] = getPerp(hit.id());
456    
457     hbheRecHit.etVtx[hbheRecHit.n] = getEt(pos,hit.energy());
458     hbheRecHit.etaVtx[hbheRecHit.n] = pos.eta();
459     hbheRecHit.phiVtx[hbheRecHit.n] = pos.phi();
460     hbheRecHit.perpVtx[hbheRecHit.n] = pos.rho();
461    
462     }
463    
464     hbheRecHit.isjet[hbheRecHit.n] = false;
465     hbheRecHit.depth[hbheRecHit.n] = hit.id().depth();
466    
467 yilmaz 1.7 if(useJets_){
468 nart 1.3 for(unsigned int j = 0 ; j < jets->size(); ++j){
469     const reco::Jet& jet = (*jets)[j];
470     double dr = reco::deltaR(hbheRecHit.eta[hbheRecHit.n],hbheRecHit.phi[hbheRecHit.n],jet.eta(),jet.phi());
471     if(dr < cone){ hbheRecHit.isjet[hbheRecHit.n] = true; }
472     }
473     }
474 yilmaz 1.2 hbheRecHit.n++;
475     }
476 yilmaz 1.7 }
477 yilmaz 1.9 }
478     if(doEcal_ && !doEbyEonly_){
479 yilmaz 1.2 for(unsigned int i = 0; i < ebHits->size(); ++i){
480     const EcalRecHit & hit= (*ebHits)[i];
481 frankma 1.13 if (getEt(hit.id(),hit.energy())<ebPtMin_) continue;
482 yilmaz 1.18
483 yilmaz 1.2 ebRecHit.e[ebRecHit.n] = hit.energy();
484 yilmaz 1.18 math::XYZPoint pos = getPosition(hit.id(),vtx);
485    
486     if(!saveBothVtx_){
487     ebRecHit.et[ebRecHit.n] = getEt(pos,hit.energy());
488     ebRecHit.eta[ebRecHit.n] = pos.eta();
489     ebRecHit.phi[ebRecHit.n] = pos.phi();
490     ebRecHit.perp[ebRecHit.n] = pos.rho();
491     }else{
492     ebRecHit.et[ebRecHit.n] = getEt(hit.id(),hit.energy());
493     ebRecHit.eta[ebRecHit.n] = getEta(hit.id());
494     ebRecHit.phi[ebRecHit.n] = getPhi(hit.id());
495     ebRecHit.perp[ebRecHit.n] = getPerp(hit.id());
496     ebRecHit.etVtx[ebRecHit.n] = getEt(pos,hit.energy());
497     ebRecHit.etaVtx[ebRecHit.n] = pos.eta();
498     ebRecHit.phiVtx[ebRecHit.n] = pos.phi();
499     ebRecHit.perpVtx[ebRecHit.n] = pos.rho();
500    
501     }
502    
503 nart 1.3 ebRecHit.isjet[ebRecHit.n] = false;
504 yilmaz 1.7 if(useJets_){
505 nart 1.3 for(unsigned int j = 0 ; j < jets->size(); ++j){
506     const reco::Jet& jet = (*jets)[j];
507     double dr = reco::deltaR(ebRecHit.eta[ebRecHit.n],ebRecHit.phi[ebRecHit.n],jet.eta(),jet.phi());
508     if(dr < cone){ ebRecHit.isjet[ebRecHit.n] = true; }
509     }
510     }
511 yilmaz 1.2 ebRecHit.n++;
512     }
513 nart 1.3
514 yilmaz 1.2 for(unsigned int i = 0; i < eeHits->size(); ++i){
515     const EcalRecHit & hit= (*eeHits)[i];
516 frankma 1.13 if (getEt(hit.id(),hit.energy())<eePtMin_) continue;
517 yilmaz 1.18
518 yilmaz 1.2 eeRecHit.e[eeRecHit.n] = hit.energy();
519 yilmaz 1.18 math::XYZPoint pos = getPosition(hit.id(),vtx);
520    
521     if(!saveBothVtx_){
522     eeRecHit.et[eeRecHit.n] = getEt(pos,hit.energy());
523     eeRecHit.eta[eeRecHit.n] = pos.eta();
524     eeRecHit.phi[eeRecHit.n] = pos.phi();
525     eeRecHit.perp[eeRecHit.n] = pos.rho();
526     }else{
527     eeRecHit.et[eeRecHit.n] = getEt(hit.id(),hit.energy());
528     eeRecHit.eta[eeRecHit.n] = getEta(hit.id());
529     eeRecHit.phi[eeRecHit.n] = getPhi(hit.id());
530     eeRecHit.perp[eeRecHit.n] = getPerp(hit.id());
531     eeRecHit.etVtx[eeRecHit.n] = getEt(pos,hit.energy());
532     eeRecHit.etaVtx[eeRecHit.n] = pos.eta();
533     eeRecHit.phiVtx[eeRecHit.n] = pos.phi();
534     eeRecHit.perpVtx[eeRecHit.n] = pos.rho();
535    
536     }
537    
538 nart 1.3 eeRecHit.isjet[eeRecHit.n] = false;
539 yilmaz 1.18
540 yilmaz 1.7 if(useJets_){
541 nart 1.3 for(unsigned int j = 0 ; j < jets->size(); ++j){
542     const reco::Jet& jet = (*jets)[j];
543     double dr = reco::deltaR(eeRecHit.eta[eeRecHit.n],eeRecHit.phi[eeRecHit.n],jet.eta(),jet.phi());
544     if(dr < cone){ eeRecHit.isjet[eeRecHit.n] = true; }
545     }
546     }
547 yilmaz 1.2 eeRecHit.n++;
548 yilmaz 1.1 }
549 yilmaz 1.7 }
550    
551     if(doTowers_){
552    
553     for(unsigned int i = 0; i < towers->size(); ++i){
554     const CaloTower & hit= (*towers)[i];
555 frankma 1.13 if (getEt(hit.id(),hit.energy())<towerPtMin_) continue;
556 yilmaz 1.18
557     myTowers.et[myTowers.n] = hit.p4(vtx).Et();
558     myTowers.eta[myTowers.n] = hit.p4(vtx).Eta();
559 yilmaz 1.19 myTowers.phi[myTowers.n] = hit.p4(vtx).Phi();
560 yilmaz 1.18 myTowers.emEt[myTowers.n] = hit.emEt(vtx);
561     myTowers.hadEt[myTowers.n] = hit.hadEt(vtx);
562    
563     if (saveBothVtx_) {
564     myTowers.e[myTowers.n] = hit.energy();
565     myTowers.et[myTowers.n] = getEt(hit.id(),hit.energy());
566     myTowers.eta[myTowers.n] = getEta(hit.id());
567     myTowers.phi[myTowers.n] = getPhi(hit.id());
568     myTowers.isjet[myTowers.n] = false;
569     myTowers.etVtx[myTowers.n] = hit.p4(vtx).Et();
570     myTowers.etaVtx[myTowers.n] = hit.p4(vtx).Eta();
571 frankma 1.15 myTowers.emEtVtx[myTowers.n] = hit.emEt(vtx);
572     myTowers.hadEtVtx[myTowers.n] = hit.hadEt(vtx);
573     }
574 yilmaz 1.9
575 yilmaz 1.18 myTowers.isjet[myTowers.n] = false;
576    
577 yilmaz 1.12 if(hit.ieta() > 29 && hit.energy() > hfTowerThreshold_) nHFtowerPlus++;
578     if(hit.ieta() < -29 && hit.energy() > hfTowerThreshold_) nHFtowerMinus++;
579 yilmaz 1.9
580 yilmaz 1.7 if(useJets_){
581     for(unsigned int j = 0 ; j < jets->size(); ++j){
582     const reco::Jet& jet = (*jets)[j];
583     double dr = reco::deltaR(myTowers.eta[myTowers.n],myTowers.phi[myTowers.n],jet.eta(),jet.phi());
584     if(dr < cone){ myTowers.isjet[myTowers.n] = true; }
585     }
586     }
587     myTowers.n++;
588     }
589 yilmaz 1.6
590 yilmaz 1.7 }
591 yilmaz 1.6
592 yilmaz 1.9 if(doBasicClusters_ && !doEbyEonly_){
593 yilmaz 1.6 for(unsigned int j = 0 ; j < jets->size(); ++j){
594     const reco::Jet& jet = (*jets)[j];
595     myBC.n = 0;
596     myBC.jtpt = jet.pt();
597     myBC.jteta = jet.eta();
598     myBC.jtphi = jet.phi();
599    
600     for(unsigned int i = 0; i < bClusters->size(); ++i){
601     const reco::BasicCluster & bc= (*bClusters)[i];
602     double dr = reco::deltaR(bc.eta(),bc.phi(),jet.eta(),jet.phi());
603     if(dr < cone){
604     myBC.e[myBC.n] = bc.energy();
605     myBC.et[myBC.n] = bc.energy()*sin(bc.position().theta());
606     myBC.eta[myBC.n] = bc.eta();
607     myBC.phi[myBC.n] = bc.phi();
608     myBC.n++;
609     }
610     }
611     bcTree->Fill();
612     }
613     }
614 yilmaz 1.7
615 yilmaz 1.21 if(doCastor_){
616    
617     edm::Handle<CastorRecHitCollection> casrechits;
618     try{ ev.getByLabel("castorreco",casrechits); }
619     catch(...) { edm::LogWarning(" CASTOR ") << " Cannot get Castor RecHits " << std::endl; }
620    
621     int nhits = 0;
622     double energyCastor = 0;
623    
624     if(casrechits.failedToGet()!=0 || !casrechits.isValid()) {
625     edm::LogWarning(" CASTOR ") << " Cannot read CastorRecHitCollection" << std::endl;
626     } else {
627     for(size_t i1 = 0; i1 < casrechits->size(); ++i1) {
628     const CastorRecHit & rh = (*casrechits)[i1];
629     HcalCastorDetId castorid = rh.id();
630     energyCastor += rh.energy();
631     if (nhits < 224) {
632     castorRecHit.e[nhits] = rh.energy();
633     castorRecHit.iphi[nhits] = castorid.sector();
634     castorRecHit.depth[nhits] = castorid.module();
635     castorRecHit.phi[nhits] = getPhi(castorid);
636     }
637    
638     nhits++;
639    
640     } // end loop castor rechits
641     }
642    
643     castorRecHit.n = nhits;
644     castorTree->Fill();
645     }
646    
647 yilmaz 1.23 if(doZDCRecHit_){
648    
649     edm::Handle<ZDCRecHitCollection> zdcrechits;
650    
651     try{ ev.getByLabel("zdcreco",zdcrechits); }
652     catch(...) { edm::LogWarning(" ZDC ") << " Cannot get ZDC RecHits " << std::endl; }
653    
654     int nhits = 0;
655    
656     if (zdcrechits.failedToGet()!=0 || !zdcrechits.isValid()) {
657     edm::LogWarning(" ZDC ") << " Cannot read ZDCRecHitCollection" << std::endl;
658     } else {
659     for(size_t i1 = 0; i1 < zdcrechits->size(); ++i1) {
660     const ZDCRecHit & rh = (*zdcrechits)[i1];
661     HcalZDCDetId zdcid = rh.id();
662     if (nhits < 18) {
663     zdcRecHit.e[nhits] = rh.energy();
664     zdcRecHit.zside[nhits] = zdcid.zside();
665     zdcRecHit.section[nhits] = zdcid.section();
666     zdcRecHit.channel[nhits] = zdcid.channel();
667 yilmaz 1.25 zdcRecHit.saturation[nhits] = static_cast<int>( rh.flagField(HcalCaloFlagLabels::ADCSaturationBit) );
668 yilmaz 1.23 }
669    
670     nhits++;
671    
672     } // end loop zdc rechits
673     }
674    
675     zdcRecHit.n = nhits;
676     zdcRecHitTree->Fill();
677    
678     }
679    
680     if(doZDCDigi_){
681    
682 yilmaz 1.25 edm::Handle<ZDCDigiCollection> zdcdigis;
683    
684 yilmaz 1.23 try{ ev.getByLabel("hcalDigis",zdcdigis); }
685     catch(...) { edm::LogWarning(" ZDC ") << " Cannot get ZDC Digis " << std::endl; }
686    
687     int nhits = 0;
688    
689     if (zdcdigis.failedToGet()!=0 || !zdcdigis.isValid()) {
690     edm::LogWarning(" ZDC ") << " Cannot read ZDCDigiCollection" << std::endl;
691 yilmaz 1.25 } else {
692    
693     edm::ESHandle<HcalDbService> conditions;
694     iSetup.get<HcalDbRecord>().get(conditions);
695    
696 yilmaz 1.23 for(size_t i1 = 0; i1 < zdcdigis->size(); ++i1) {
697 yilmaz 1.25 CaloSamples caldigi;
698 yilmaz 1.23 const ZDCDataFrame & rh = (*zdcdigis)[i1];
699     HcalZDCDetId zdcid = rh.id();
700 yilmaz 1.25
701     if(calZDCDigi_){
702     const HcalQIEShape* qieshape=conditions->getHcalShape();
703     const HcalQIECoder* qiecoder=conditions->getHcalCoder(zdcid);
704     HcalCoderDb coder(*qiecoder,*qieshape);
705     coder.adc2fC(rh,caldigi);
706     }
707    
708 yilmaz 1.23 if (nhits < 18) {
709    
710     int ts = 0;
711 yilmaz 1.25 zdcDigi.zside[nhits] = zdcid.zside();
712     zdcDigi.section[nhits] = zdcid.section();
713     zdcDigi.channel[nhits] = zdcid.channel();
714 yilmaz 1.23
715     for(int j1 = 0; j1 < rh.size(); j1++){
716    
717 yilmaz 1.25 zdcDigi.chargefC[ts][nhits] = calZDCDigi_?caldigi[ts]:rh[ts].nominal_fC();
718     zdcDigi.adc[ts][nhits] = rh[ts].adc();
719     zdcDigi.ts[ts][nhits] = ts;
720 yilmaz 1.23
721     ts++;
722     }
723     }
724     nhits++;
725     } // end loop zdc rechits
726     }
727    
728 yilmaz 1.25 zdcDigi.n = nhits;
729 yilmaz 1.23 zdcDigiTree->Fill();
730    
731     }
732 yilmaz 1.21
733 yilmaz 1.9 if(!doEbyEonly_){
734     towerTree->Fill();
735    
736     eeTree->Fill();
737     ebTree->Fill();
738    
739     hbheTree->Fill();
740     hfTree->Fill();
741    
742     if (doFastJet_) {
743     bkgTree->Fill();
744     }
745     }
746    
747 yilmaz 1.12 nt->Fill(nHFtowerPlus,nHFtowerMinus,nHFlongPlus,nHFlongMinus,nHFshortPlus,nHFshortMinus);
748 nart 1.3
749 yilmaz 1.1 }
750    
751    
752     // ------------ method called once each job just before starting event loop ------------
753     void
754     RecHitTreeProducer::beginJob()
755     {
756 nart 1.3
757 yjlee 1.16 hbheTree = fs->make<TTree>("hbhe",versionTag);
758 yilmaz 1.1 hbheTree->Branch("n",&hbheRecHit.n,"n/I");
759     hbheTree->Branch("e",hbheRecHit.e,"e[n]/F");
760     hbheTree->Branch("et",hbheRecHit.et,"et[n]/F");
761     hbheTree->Branch("eta",hbheRecHit.eta,"eta[n]/F");
762     hbheTree->Branch("phi",hbheRecHit.phi,"phi[n]/F");
763 yilmaz 1.18 hbheTree->Branch("perp",hbheRecHit.perp,"perp[n]/F");
764    
765 yilmaz 1.5 hbheTree->Branch("isjet",hbheRecHit.isjet,"isjet[n]/O");
766 yilmaz 1.18 hbheTree->Branch("depth",hfRecHit.depth,"depth[n]/I");
767    
768 yjlee 1.16 hfTree = fs->make<TTree>("hf",versionTag);
769 yilmaz 1.1 hfTree->Branch("n",&hfRecHit.n,"n/I");
770     hfTree->Branch("e",hfRecHit.e,"e[n]/F");
771     hfTree->Branch("et",hfRecHit.et,"et[n]/F");
772     hfTree->Branch("eta",hfRecHit.eta,"eta[n]/F");
773     hfTree->Branch("phi",hfRecHit.phi,"phi[n]/F");
774 yilmaz 1.18 hfTree->Branch("perp",hfRecHit.perp,"perp[n]/F");
775 yilmaz 1.9 hfTree->Branch("depth",hfRecHit.depth,"depth[n]/I");
776 yilmaz 1.5 hfTree->Branch("isjet",hfRecHit.isjet,"isjet[n]/O");
777 yilmaz 1.1
778 yjlee 1.16 eeTree = fs->make<TTree>("ee",versionTag);
779 yilmaz 1.2 eeTree->Branch("n",&eeRecHit.n,"n/I");
780     eeTree->Branch("e",eeRecHit.e,"e[n]/F");
781     eeTree->Branch("et",eeRecHit.et,"et[n]/F");
782     eeTree->Branch("eta",eeRecHit.eta,"eta[n]/F");
783     eeTree->Branch("phi",eeRecHit.phi,"phi[n]/F");
784 yilmaz 1.18 eeTree->Branch("perp",eeRecHit.perp,"perp[n]/F");
785    
786 yilmaz 1.5 eeTree->Branch("isjet",eeRecHit.isjet,"isjet[n]/O");
787 nart 1.3
788 yjlee 1.16 ebTree = fs->make<TTree>("eb",versionTag);
789 yilmaz 1.2 ebTree->Branch("n",&ebRecHit.n,"n/I");
790     ebTree->Branch("e",ebRecHit.e,"e[n]/F");
791     ebTree->Branch("et",ebRecHit.et,"et[n]/F");
792     ebTree->Branch("eta",ebRecHit.eta,"eta[n]/F");
793     ebTree->Branch("phi",ebRecHit.phi,"phi[n]/F");
794 yilmaz 1.18 ebTree->Branch("perp",ebRecHit.perp,"perp[n]/F");
795    
796 yilmaz 1.4 ebTree->Branch("isjet",ebRecHit.isjet,"isjet[n]/O");
797 yilmaz 1.2
798 yjlee 1.16 towerTree = fs->make<TTree>("tower",versionTag);
799 yilmaz 1.7 towerTree->Branch("n",&myTowers.n,"n/I");
800     towerTree->Branch("e",myTowers.e,"e[n]/F");
801     towerTree->Branch("et",myTowers.et,"et[n]/F");
802     towerTree->Branch("eta",myTowers.eta,"eta[n]/F");
803     towerTree->Branch("phi",myTowers.phi,"phi[n]/F");
804     towerTree->Branch("isjet",myTowers.isjet,"isjet[n]/O");
805 yilmaz 1.18 towerTree->Branch("emEt",myTowers.emEt,"emEt[n]/F");
806     towerTree->Branch("hadEt",myTowers.hadEt,"hadEt[n]/F");
807    
808 yilmaz 1.22
809 yilmaz 1.21 if(doCastor_){
810 yilmaz 1.22 castorTree = fs->make<TTree>("castor",versionTag);
811 yilmaz 1.21 castorTree->Branch("n",&castorRecHit.n,"n/I");
812     castorTree->Branch("e",castorRecHit.e,"e[n]/F");
813     castorTree->Branch("iphi",castorRecHit.iphi,"iphi[n]/I");
814     castorTree->Branch("phi",castorRecHit.phi,"phi[n]/F");
815     castorTree->Branch("depth",castorRecHit.depth,"depth[n]/I");
816     }
817    
818 yilmaz 1.23 if(doZDCRecHit_){
819 yilmaz 1.25 zdcRecHitTree = fs->make<TTree>("zdcrechit",versionTag);
820 yilmaz 1.23 zdcRecHitTree->Branch("n",&zdcRecHit.n,"n/I");
821     zdcRecHitTree->Branch("e",zdcRecHit.e,"e[n]/F");
822 yilmaz 1.25 zdcRecHitTree->Branch("saturation",zdcRecHit.saturation,"saturation[n]/F");
823 yilmaz 1.23 zdcRecHitTree->Branch("zside",zdcRecHit.zside,"zside[n]/I");
824     zdcRecHitTree->Branch("section",zdcRecHit.section,"section[n]/I");
825     zdcRecHitTree->Branch("channel",zdcRecHit.channel,"channel[n]/I");
826     }
827    
828     if(doZDCDigi_){
829 yilmaz 1.25 TString nZdcTsSt="";
830     nZdcTsSt+=nZdcTs_;
831    
832     zdcDigiTree = fs->make<TTree>("zdcdigi",versionTag);
833 yilmaz 1.23 zdcDigiTree->Branch("n",&zdcDigi.n,"n/I");
834 yilmaz 1.25 zdcDigiTree->Branch("zside",zdcDigi.zside,"zside[n]/I");
835     zdcDigiTree->Branch("section",zdcDigi.section,"section[n]/I");
836     zdcDigiTree->Branch("channel",zdcDigi.channel,"channel[n]/I");
837     // zdcDigiTree->Branch("ts",zdcDigi.ts,"ts["+nZdcTsSt+"][n]/I");
838     zdcDigiTree->Branch("adc",zdcDigi.adc,"adc["+nZdcTsSt+"][n]/I");
839     zdcDigiTree->Branch("chargefC",zdcDigi.chargefC,"chargefC["+nZdcTsSt+"][n]/F");
840 yilmaz 1.23 }
841    
842 yilmaz 1.18 if (saveBothVtx_) {
843     towerTree->Branch("etVtx",myTowers.etVtx,"etvtx[n]/F");
844     towerTree->Branch("etaVtx",myTowers.etaVtx,"etavtx[n]/F");
845 frankma 1.15 towerTree->Branch("emEtVtx",myTowers.emEtVtx,"emEtVtx[n]/F");
846     towerTree->Branch("hadEtVtx",myTowers.hadEtVtx,"hadEtVtx[n]/F");
847     }
848 yilmaz 1.7
849 yilmaz 1.6 if(doBasicClusters_){
850 yjlee 1.16 bcTree = fs->make<TTree>("bc",versionTag);
851 yilmaz 1.6 bcTree->Branch("n",&myBC.n,"n/I");
852     bcTree->Branch("e",myBC.e,"e[n]/F");
853     bcTree->Branch("et",myBC.et,"et[n]/F");
854     bcTree->Branch("eta",myBC.eta,"eta[n]/F");
855     bcTree->Branch("phi",myBC.phi,"phi[n]/F");
856     bcTree->Branch("jtpt",&myBC.jtpt,"jtpt/F");
857     bcTree->Branch("jteta",&myBC.jteta,"jteta/F");
858     bcTree->Branch("jtphi",&myBC.jtphi,"jtphi/F");
859     // bcTree->Branch("isjet",bcRecHit.isjet,"isjet[n]/O");
860     }
861    
862 yilmaz 1.7 if(doFastJet_){
863 yjlee 1.16 bkgTree = fs->make<TTree>("bkg",versionTag);
864 yilmaz 1.7 bkgTree->Branch("n",&bkg.n,"n/I");
865     bkgTree->Branch("rho",bkg.rho,"rho[n]/F");
866     bkgTree->Branch("sigma",bkg.sigma,"sigma[n]/F");
867     }
868 yilmaz 1.9
869 yilmaz 1.12 nt = fs->make<TNtuple>("ntEvent","","nHFplus:nHFminus:nHFlongPlus:nHFlongMinus:nHFshortPlus:nHFshortMinus");
870 yilmaz 1.6
871 yilmaz 1.1 }
872    
873     // ------------ method called once each job just after ending the event loop ------------
874     void
875     RecHitTreeProducer::endJob() {
876     }
877    
878 yilmaz 1.18 math::XYZPoint RecHitTreeProducer::getPosition(const DetId &id, reco::Vertex::Point vtx){
879     const GlobalPoint& pos=geo->getPosition(id);
880     math::XYZPoint posV(pos.x() - vtx.x(),pos.y() - vtx.y(),pos.z() - vtx.z());
881     return posV;
882     }
883    
884     double RecHitTreeProducer::getEt(math::XYZPoint pos, double energy){
885     double et = energy*sin(pos.theta());
886     return et;
887     }
888    
889     double RecHitTreeProducer::getEt(const DetId &id, double energy, reco::Vertex::Point vtx){
890 yilmaz 1.1 const GlobalPoint& pos=geo->getPosition(id);
891     double et = energy*sin(pos.theta());
892     return et;
893     }
894 nart 1.3
895 yilmaz 1.18 double RecHitTreeProducer::getEta(const DetId &id, reco::Vertex::Point vtx){
896 yilmaz 1.1 const GlobalPoint& pos=geo->getPosition(id);
897     double et = pos.eta();
898     return et;
899     }
900    
901 yilmaz 1.18 double RecHitTreeProducer::getPhi(const DetId &id, reco::Vertex::Point vtx){
902 yilmaz 1.1 const GlobalPoint& pos=geo->getPosition(id);
903     double et = pos.phi();
904     return et;
905     }
906    
907 yilmaz 1.18 double RecHitTreeProducer::getPerp(const DetId &id, reco::Vertex::Point vtx){
908     const GlobalPoint& pos=geo->getPosition(id);
909     double et = pos.perp();
910     return et;
911     }
912    
913 frankma 1.14 reco::Vertex::Point RecHitTreeProducer::getVtx(const edm::Event& ev)
914     {
915     ev.getByLabel(VtxSrc_,vtxs);
916     int greatestvtx = 0;
917     int nVertex = vtxs->size();
918    
919     for (unsigned int i = 0 ; i< vtxs->size(); ++i){
920     unsigned int daughter = (*vtxs)[i].tracksSize();
921     if( daughter > (*vtxs)[greatestvtx].tracksSize()) greatestvtx = i;
922     //cout <<"Vertex: "<< (*vtxs)[i].position().z()<<" "<<daughter<<endl;
923     }
924    
925     if(nVertex<=0){
926 yilmaz 1.18 return reco::Vertex::Point(0,0,0);
927 frankma 1.14 }
928     return (*vtxs)[greatestvtx].position();
929     }
930 yilmaz 1.1
931     //define this as a plug-in
932     DEFINE_FWK_MODULE(RecHitTreeProducer);