ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/DTDPGAnalysis/src/TTreeGenerator.cc
Revision: 1.29
Committed: Wed Sep 21 15:16:19 2011 UTC (13 years, 7 months ago) by pellicci
Content type: text/plain
Branch: MAIN
CVS Tags: V00-01-00
Changes since 1.28: +10 -3 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pellicci 1.1 // -*- C++ -*-
2     //
3     // Package: TTreeGenerator
4     // Class: TTreeGenerator
5     //
6     /**\class TTreeGenerator TTreeGenerator.cc MyTools/TTreeGenerator/src/TTreeGenerator.cc
7    
8     Description: <one line class summary>
9    
10     Implementation:
11     <Notes on implementation>
12     */
13     //
14     // Original Author: Carlo BATTILANA, Mario PELLICCIONI
15     // Created: Mon Jan 11 14:59:51 CET 2010
16 pellicci 1.29 // $Id: TTreeGenerator.cc,v 1.28 2011/04/06 12:49:23 pellicci Exp $
17 pellicci 1.1 //
18     //
19    
20     // user include files
21     #include "DataFormats/CSCRecHit/interface/CSCSegmentCollection.h"
22    
23     #include "DataFormats/DTDigi/interface/DTDigi.h"
24     #include "DataFormats/DTDigi/interface/DTDigiCollection.h"
25     #include "DataFormats/DTDigi/interface/DTLocalTriggerCollection.h"
26    
27     #include "DataFormats/DTRecHit/interface/DTRecSegment4DCollection.h"
28    
29     #include "DataFormats/GeometrySurface/interface/Cylinder.h"
30    
31     #include "DataFormats/L1DTTrackFinder/interface/L1MuDTChambPhContainer.h"
32 gmasetti 1.15 #include "DataFormats/L1DTTrackFinder/interface/L1MuDTChambThContainer.h"
33 pellicci 1.1 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTReadoutCollection.h"
34    
35 battilan 1.17 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutRecord.h"
36 pellicci 1.22
37 pellicci 1.28 #include "DataFormats/Luminosity/interface/LumiDetails.h"
38    
39 battilan 1.17 #include "CondFormats/L1TObjects/interface/L1GtTriggerMenu.h"
40     #include "CondFormats/DataRecord/interface/L1GtTriggerMenuRcd.h"
41    
42 pellicci 1.1 #include "DataFormats/MuonReco/interface/Muon.h"
43     #include "DataFormats/MuonReco/interface/MuonFwd.h"
44    
45     #include "DataFormats/TrackReco/interface/Track.h"
46    
47     #include "DataFormats/Common/interface/TriggerResults.h"
48    
49 pellicci 1.26 #include "DataFormats/Scalers/interface/LumiScalers.h"
50    
51 pellicci 1.1 #include "DataFormats/VertexReco/interface/Vertex.h"
52     #include "DataFormats/VertexReco/interface/VertexFwd.h"
53    
54 pellicci 1.3 #include "FWCore/Common/interface/TriggerNames.h"
55 pellicci 1.1 #include "FWCore/Framework/interface/MakerMacros.h"
56 pellicci 1.22 #include "FWCore/Framework/interface/LuminosityBlock.h"
57 pellicci 1.1
58     #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
59     #include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h"
60     #include "Geometry/CommonDetUnit/interface/GeomDet.h"
61    
62     #include "MagneticField/Engine/interface/MagneticField.h"
63    
64     #include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
65    
66     #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
67     #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
68    
69 pellicci 1.2 #include "UserCode/DTDPGAnalysis/interface/TTreeGenerator.h"
70 pellicci 1.1
71     TTreeGenerator::TTreeGenerator(const edm::ParameterSet& pset)
72     {
73     //get parameters from the configuration file
74     //names of the different event collections
75     dtDigiLabel_ = pset.getParameter<edm::InputTag>("dtDigiLabel");
76     dtSegmentLabel_ = pset.getParameter<edm::InputTag>("dtSegmentLabel");
77     cscSegmentLabel_ = pset.getParameter<edm::InputTag>("cscSegmentLabel");
78     dtTrigDCCLabel_ = pset.getParameter<edm::InputTag>("dtTrigDCCLabel");
79     dtTrigDDULabel_ = pset.getParameter<edm::InputTag>("dtTrigDDULabel");
80     staMuLabel_ = pset.getParameter<edm::InputTag>("staMuLabel");
81     gmtLabel_ = pset.getParameter<edm::InputTag>("gmtLabel");
82     triggerTag_ = pset.getParameter<edm::InputTag>("TriggerTag");
83 battilan 1.17 gtLabel_ = pset.getParameter<edm::InputTag>("gtLabel");
84 pellicci 1.1
85     //max size of the different saved objects (per event)
86     digisSize_ = pset.getParameter<int>("dtDigiSize");
87     dtsegmentsSize_ = pset.getParameter<int>("dtSegmentSize");
88     cscsegmentsSize_ = pset.getParameter<int>("cscSegmentSize");
89     dtltDCCSize_ = pset.getParameter<int>("dtTrigDCCSize");
90 gmasetti 1.15 dtltDCCThSize_ = pset.getParameter<int>("dtTrigDCCThSize");
91 pellicci 1.1 dtltDDUSize_ = pset.getParameter<int>("dtTrigDDUSize");
92     gmtSize_ = pset.getParameter<int>("gmtSize");
93     STAMuSize_ = pset.getParameter<int>("STAMuSize");
94    
95 pellicci 1.26 PrimaryVertexTag_ = pset.getParameter<edm::InputTag>("PrimaryVertexTag");
96     beamSpotTag_ = pset.getParameter<edm::InputTag>("beamSpotTag");
97     scalersSource_ = pset.getParameter<edm::InputTag>("scalersResults");
98 pellicci 1.1
99 pellicci 1.26 runOnRaw_ = pset.getParameter<bool>("runOnRaw");
100     runOnSimulation_ = pset.getParameter<bool>("runOnSimulation");
101 battilan 1.14
102 pellicci 1.26 outFile_ = pset.getParameter<std::string>("outputFile");
103 pellicci 1.4
104 pellicci 1.1 initialize_Tree_variables();
105    
106     //counters
107     idigis = 0;
108     idtsegments = 0;
109     icscsegments = 0;
110     idtltDCC = 0;
111 gmasetti 1.15 idtltDCC_th = 0;
112 pellicci 1.1 idtltDDU = 0;
113     imuons = 0;
114     igmtdt = 0;
115     igmtcands = 0;
116 pellicci 1.25 igtalgo = 0;
117     igttt = 0;
118     ihlt = 0;
119 pellicci 1.1 }
120    
121     void TTreeGenerator::analyze(const edm::Event& event, const edm::EventSetup& context)
122     {
123 pellicci 1.9 //retrieve the beamspot info
124     edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
125     event.getByLabel(beamSpotTag_ ,recoBeamSpotHandle);
126     beamspot = *recoBeamSpotHandle;
127    
128 pellicci 1.26 //retrieve the luminosity
129     edm::Handle<LumiScalersCollection> lumiScalers;
130     event.getByLabel(scalersSource_, lumiScalers);
131     LumiScalersCollection::const_iterator lumiIt = lumiScalers->begin();
132     lumiperblock = lumiIt->instantLumi();
133    
134 pellicci 1.1 //retrieve the collections you are interested on in the event
135     edm::Handle<DTDigiCollection> dtdigis;
136 pellicci 1.21 if(runOnRaw_ && !runOnSimulation_) event.getByLabel(dtDigiLabel_, dtdigis);
137 pellicci 1.1
138     edm::Handle<DTRecSegment4DCollection> dtsegments4D;
139     event.getByLabel(dtSegmentLabel_, dtsegments4D);
140    
141     context.get<GlobalTrackingGeometryRecord>().get(theTrackingGeometry);
142    
143     edm::Handle<reco::VertexCollection> privtxs;
144     event.getByLabel(PrimaryVertexTag_, privtxs);
145    
146     edm::Handle<CSCSegmentCollection> cscsegments;
147     event.getByLabel(cscSegmentLabel_, cscsegments);
148    
149     edm::Handle<L1MuDTChambPhContainer> localTriggerDCC;
150 pellicci 1.4 if(runOnRaw_) event.getByLabel(dtTrigDCCLabel_,localTriggerDCC);
151 pellicci 1.1
152 gmasetti 1.15 edm::Handle<L1MuDTChambThContainer> localTriggerDCC_Th;
153     if(runOnRaw_) event.getByLabel(dtTrigDCCLabel_,localTriggerDCC_Th);
154    
155 pellicci 1.1 edm::Handle<DTLocalTriggerCollection> localTriggerDDU;
156 battilan 1.14 if(runOnRaw_ && !runOnSimulation_) event.getByLabel(dtTrigDDULabel_,localTriggerDDU);
157 pellicci 1.1
158     edm::Handle<reco::MuonCollection> MuList;
159     event.getByLabel(staMuLabel_,MuList);
160    
161     edm::Handle<L1MuGMTReadoutCollection> gmtrc;
162 pellicci 1.4 if(runOnRaw_) event.getByLabel(gmtLabel_,gmtrc);
163 pellicci 1.1
164 battilan 1.17 edm::Handle< L1GlobalTriggerReadoutRecord > gtrc;
165     if(runOnRaw_) event.getByLabel(gtLabel_, gtrc);
166    
167     edm::ESHandle<L1GtTriggerMenu> menuRcd;
168     context.get<L1GtTriggerMenuRcd>().get(menuRcd) ;
169     const L1GtTriggerMenu* menu = menuRcd.product();
170    
171     edm::Handle<edm::TriggerResults> hltresults;
172     event.getByLabel(triggerTag_, hltresults);
173    
174 pellicci 1.1 //clear the containers
175     clear_Arrays();
176    
177     //get the magnetic field
178     context.get<IdealMagneticFieldRecord>().get(theBField);
179    
180     // Get the propagators
181     context.get<TrackingComponentsRecord>().get("SmartPropagatorAny",propagatorAlong);
182     context.get<TrackingComponentsRecord>().get("SmartPropagatorAnyOpposite", propagatorOpposite);
183    
184     //Fill the event info block
185     runnumber = event.run();
186     lumiblock = event.getLuminosityBlock().luminosityBlock();
187     eventNumber = event.eventAuxiliary().event();
188     timestamp = event.eventAuxiliary().time().value();
189     bunchXing = event.eventAuxiliary().bunchCrossing();
190     orbitNum = event.eventAuxiliary().orbitNumber();
191    
192 pellicci 1.28 edm::Handle<LumiDetails> lumiDetails;
193     event.getLuminosityBlock().getByLabel("lumiProducer", lumiDetails);
194 pellicci 1.29 if(lumiDetails->isValid()){
195     beam1Intensity = lumiDetails->lumiBeam1Intensity(bunchXing);
196     beam2Intensity = lumiDetails->lumiBeam2Intensity(bunchXing);
197     }
198 pellicci 1.28
199 pellicci 1.1 //Primary vertex
200     if((*privtxs).size() != 0){
201     PV_x = (*privtxs)[0].position().x();
202     PV_y = (*privtxs)[0].position().y();
203     PV_z = (*privtxs)[0].position().z();
204    
205     PV_xxE = (*privtxs)[0].covariance(0,0);
206     PV_yyE = (*privtxs)[0].covariance(1,1);
207     PV_zzE = (*privtxs)[0].covariance(2,2);
208     PV_xyE = (*privtxs)[0].covariance(0,1);
209     PV_xzE = (*privtxs)[0].covariance(0,2);
210     PV_yzE = (*privtxs)[0].covariance(1,2);
211    
212     PV_normchi2 = (*privtxs)[0].chi2()/(*privtxs)[0].ndof();
213 pellicci 1.29
214     PV_Nvtx = (*privtxs).size();
215 pellicci 1.1 }
216     else{
217     PV_x = -999.;
218     PV_y = -999.;
219     PV_z = -999.;
220     PV_xxE = -999.;
221     PV_yyE = -999.;
222     PV_zzE = -999.;
223     PV_xyE = -999.;
224     PV_xzE = -999.;
225     PV_yzE = -999.;
226     PV_normchi2 = -999.;
227 pellicci 1.29 PV_Nvtx = -999;
228 pellicci 1.1 }
229    
230     //DIGIS
231 pellicci 1.21 if(runOnRaw_ && !runOnSimulation_) fill_digi_variables(dtdigis);
232 pellicci 1.1
233     //DT SEGMENTS
234     fill_dtsegments_variables(dtsegments4D);
235    
236     //CSC SEGMENTS
237     fill_cscsegments_variables(cscsegments);
238    
239     //DCC
240 pellicci 1.4 if(runOnRaw_) fill_dcc_variables(localTriggerDCC);
241 gmasetti 1.15 if(runOnRaw_) fill_dccth_variables(localTriggerDCC_Th);
242 pellicci 1.1
243     //DDU
244 battilan 1.14 if(runOnRaw_ && !runOnSimulation_) fill_ddu_variables(localTriggerDDU);
245 pellicci 1.1
246     //MUONS
247     fill_muons_variables(MuList);
248    
249     //GMT
250 pellicci 1.4 if(runOnRaw_) fill_gmt_variables(gmtrc);
251 pellicci 1.1
252 battilan 1.17 //GT
253     if(runOnRaw_) fill_gt_variables(gtrc,menu);
254    
255     //HLT
256     fill_hlt_variables(event,hltresults);
257    
258 pellicci 1.1 tree_->Fill();
259    
260     return;
261     }
262    
263     void TTreeGenerator::fill_digi_variables(edm::Handle<DTDigiCollection> dtdigis)
264     {
265     idigis = 0;
266    
267     for (DTDigiCollection::DigiRangeIterator dtLayerIdIt = dtdigis->begin(); dtLayerIdIt!=dtdigis->end(); dtLayerIdIt++){
268    
269     for (DTDigiCollection::const_iterator digiIt = ((*dtLayerIdIt).second).first;digiIt!=((*dtLayerIdIt).second).second; ++digiIt){
270    
271     if(idigis >= digisSize_) return;
272    
273     digi_wheel.push_back((*dtLayerIdIt).first.wheel());
274     digi_sector.push_back((*dtLayerIdIt).first.sector());
275     digi_station.push_back((*dtLayerIdIt).first.station());
276     digi_sl.push_back((*dtLayerIdIt).first.superLayer());
277     digi_layer.push_back((*dtLayerIdIt).first.layer());
278    
279     digi_wire.push_back((*digiIt).wire());
280     digi_time.push_back((*digiIt).time());
281    
282     idigis++;
283     }
284     }
285    
286     return;
287     }
288    
289     void TTreeGenerator::fill_dtsegments_variables(edm::Handle<DTRecSegment4DCollection> segments4D)
290     {
291     idtsegments = 0;
292    
293     static TVectorF dummyfloat(1); dummyfloat(0) = -999.;
294    
295     for (DTRecSegment4DCollection::id_iterator chambIt = segments4D->id_begin(); chambIt != segments4D->id_end(); ++chambIt){
296    
297     DTRecSegment4DCollection::range range = segments4D->get(*chambIt);
298     for (DTRecSegment4DCollection::const_iterator segment4D = range.first; segment4D!=range.second; ++segment4D){
299    
300     if(idtsegments >= dtsegmentsSize_) return;
301    
302     segm4D_wheel.push_back((*chambIt).wheel());
303     segm4D_sector.push_back((*chambIt).sector());
304     segm4D_station.push_back((*chambIt).station());
305    
306     const bool hasPhi = segment4D->hasPhi();
307     const bool hasZed = segment4D->hasZed();
308 dtdqm 1.19 segm4D_hasPhi.push_back(hasPhi);
309     segm4D_hasZed.push_back(hasZed);
310 pellicci 1.1
311 battilan 1.11 segm4D_x_pos_loc.push_back(segment4D->localPosition().x());
312     segm4D_y_pos_loc.push_back(segment4D->localPosition().y());
313     segm4D_z_pos_loc.push_back(segment4D->localPosition().x());
314     segm4D_x_dir_loc.push_back(segment4D->localDirection().x());
315     segm4D_y_dir_loc.push_back(segment4D->localDirection().y());
316     segm4D_z_dir_loc.push_back(segment4D->localDirection().z());
317 pellicci 1.1
318 pellicci 1.25 const GeomDet* geomDet = theTrackingGeometry->idToDet(segment4D->geographicalId());
319 pellicci 1.8 const GlobalVector point_glb = geomDet->toGlobal(segment4D->localDirection());
320 pellicci 1.1
321 pellicci 1.8 segm4D_cosx.push_back(point_glb.x());
322     segm4D_cosy.push_back(point_glb.y());
323     segm4D_cosz.push_back(point_glb.z());
324 pellicci 1.9 segm4D_phi.push_back(point_glb.phi());
325     segm4D_theta.push_back(point_glb.theta());
326     segm4D_eta.push_back(point_glb.eta());
327 pellicci 1.1
328 battilan 1.24 if(hasPhi) fill_dtphi_info(segment4D->phiSegment(),geomDet);
329 pellicci 1.1 else{
330     segm4D_t0.push_back(-999.);
331 dtdqm 1.16 segm4D_vdrift.push_back(-999.);
332 pellicci 1.1 segm4D_phinormchi2.push_back(-999.);
333     segm4D_phinhits.push_back(-999);
334    
335     new ((*segm4D_phiHits_Pos)[idtsegments]) TVectorF(dummyfloat);
336 battilan 1.24 new ((*segm4D_phiHits_PosCh)[idtsegments]) TVectorF(dummyfloat);
337 pellicci 1.1 new ((*segm4D_phiHits_PosErr)[idtsegments]) TVectorF(dummyfloat);
338     new ((*segm4D_phiHits_Side)[idtsegments]) TVectorF(dummyfloat);
339 pellicci 1.23 new ((*segm4D_phiHits_Wire)[idtsegments]) TVectorF(dummyfloat);
340     new ((*segm4D_phiHits_Layer)[idtsegments]) TVectorF(dummyfloat);
341     }
342 pellicci 1.1
343 battilan 1.24 if(hasZed) fill_dtz_info(segment4D->zSegment(),geomDet);
344 pellicci 1.1 else{
345     segm4D_znormchi2.push_back(-999.);
346     segm4D_znhits.push_back(-999);
347    
348     new ((*segm4D_zHits_Pos)[idtsegments]) TVectorF(dummyfloat);
349 battilan 1.24 new ((*segm4D_zHits_PosCh)[idtsegments]) TVectorF(dummyfloat);
350 pellicci 1.1 new ((*segm4D_zHits_PosErr)[idtsegments]) TVectorF(dummyfloat);
351     new ((*segm4D_zHits_Side)[idtsegments]) TVectorF(dummyfloat);
352 pellicci 1.23 new ((*segm4D_zHits_Wire)[idtsegments]) TVectorF(dummyfloat);
353 battilan 1.24 new ((*segm4D_zHits_Layer)[idtsegments]) TVectorF(dummyfloat);
354 pellicci 1.1 }
355    
356     idtsegments++;
357     }
358     }
359    
360     return;
361     }
362    
363 battilan 1.24 void TTreeGenerator::fill_dtphi_info(const DTChamberRecSegment2D* phiSeg, const GeomDet* chamb)
364 pellicci 1.1 {
365     std::vector<DTRecHit1D> phirecHitslist = phiSeg->specificRecHits();
366    
367     //segment information
368     segm4D_t0.push_back(phiSeg->t0());
369 dtdqm 1.16 segm4D_vdrift.push_back(phiSeg->vDrift());
370    
371 pellicci 1.1 segm4D_phinormchi2.push_back(phiSeg->chi2()/phiSeg->degreesOfFreedom());
372    
373     //rechits information
374     const int nphirecHits = phirecHitslist.size();
375     segm4D_phinhits.push_back(nphirecHits);
376    
377     TVectorF phiPosRechits(nphirecHits);
378 battilan 1.24 TVectorF phiPosChRechits(nphirecHits);
379 pellicci 1.1 TVectorF phiPosErrRechits(nphirecHits);
380     TVectorF phiSideRechits(nphirecHits);
381 pellicci 1.23 TVectorF phiwireRechits(nphirecHits);
382     TVectorF philayerRechits(nphirecHits);
383    
384 pellicci 1.1 int rechitscounter = 0;
385     for(std::vector<DTRecHit1D>::const_iterator recHitsIt = phirecHitslist.begin(); recHitsIt!=phirecHitslist.end(); ++recHitsIt){
386 battilan 1.24 const GeomDet * layer = theTrackingGeometry->idToDet(recHitsIt->wireId().layerId());
387 pellicci 1.1 phiPosRechits(rechitscounter) = recHitsIt->localPosition().x();
388 battilan 1.24 phiPosChRechits(rechitscounter) = chamb->toLocal(layer->toGlobal(recHitsIt->localPosition())).x();
389 pellicci 1.1 phiPosErrRechits(rechitscounter) = recHitsIt->localPositionError().xx();
390     phiSideRechits(rechitscounter) = recHitsIt->lrSide();
391 pellicci 1.23 phiwireRechits(rechitscounter) = recHitsIt->wireId().wire();
392     philayerRechits(rechitscounter) = recHitsIt->wireId().layerId().layer();
393 pellicci 1.1 rechitscounter++;
394     }
395    
396     new ((*segm4D_phiHits_Pos)[idtsegments]) TVectorF(phiPosRechits);
397 battilan 1.24 new ((*segm4D_phiHits_PosCh)[idtsegments]) TVectorF(phiPosChRechits);
398 pellicci 1.1 new ((*segm4D_phiHits_PosErr)[idtsegments]) TVectorF(phiPosErrRechits);
399     new ((*segm4D_phiHits_Side)[idtsegments]) TVectorF(phiSideRechits);
400 pellicci 1.23 new ((*segm4D_phiHits_Wire)[idtsegments]) TVectorF(phiwireRechits);
401     new ((*segm4D_phiHits_Layer)[idtsegments]) TVectorF(philayerRechits);
402 pellicci 1.1
403     return;
404     }
405    
406 battilan 1.24 void TTreeGenerator::fill_dtz_info(const DTSLRecSegment2D* zSeg, const GeomDet* chamb)
407 pellicci 1.1 {
408     std::vector<DTRecHit1D> zrecHitslist = zSeg->specificRecHits();
409    
410     segm4D_znormchi2.push_back(zSeg->chi2()/zSeg->degreesOfFreedom());
411    
412     //rechits information
413     const int nzrecHits = zrecHitslist.size();
414     segm4D_znhits.push_back(nzrecHits);
415    
416     TVectorF zPosRechits(nzrecHits);
417 battilan 1.24 TVectorF zPosChRechits(nzrecHits);
418 pellicci 1.1 TVectorF zPosErrRechits(nzrecHits);
419     TVectorF zSideRechits(nzrecHits);
420 pellicci 1.23 TVectorF zwireRechits(nzrecHits);
421     TVectorF zlayerRechits(nzrecHits);
422    
423 pellicci 1.1 int rechitscounter = 0;
424     for(std::vector<DTRecHit1D>::const_iterator recHitsIt = zrecHitslist.begin(); recHitsIt!=zrecHitslist.end(); ++recHitsIt){
425 battilan 1.24 const GeomDet * layer = theTrackingGeometry->idToDet(recHitsIt->wireId().layerId());
426 pellicci 1.1 zPosRechits(rechitscounter) = recHitsIt->localPosition().y();
427 battilan 1.24 zPosChRechits(rechitscounter) = chamb->toLocal(layer->toGlobal(recHitsIt->localPosition())).y();
428 pellicci 1.1 zPosErrRechits(rechitscounter) = recHitsIt->localPositionError().yy();
429     zSideRechits(rechitscounter) = recHitsIt->lrSide();
430 pellicci 1.23 zwireRechits(rechitscounter) = recHitsIt->wireId().wire();
431     zlayerRechits(rechitscounter) = recHitsIt->wireId().layerId().layer();
432 pellicci 1.1 rechitscounter++;
433     }
434    
435     new ((*segm4D_zHits_Pos)[idtsegments]) TVectorF(zPosRechits);
436 battilan 1.24 new ((*segm4D_zHits_PosCh)[idtsegments]) TVectorF(zPosChRechits);
437 pellicci 1.1 new ((*segm4D_zHits_PosErr)[idtsegments]) TVectorF(zPosErrRechits);
438     new ((*segm4D_zHits_Side)[idtsegments]) TVectorF(zSideRechits);
439 pellicci 1.23 new ((*segm4D_zHits_Wire)[idtsegments]) TVectorF(zwireRechits);
440     new ((*segm4D_zHits_Layer)[idtsegments]) TVectorF(zlayerRechits);
441 pellicci 1.1
442     return;
443     }
444    
445     void TTreeGenerator::fill_cscsegments_variables(edm::Handle<CSCSegmentCollection> cscsegments)
446     {
447     icscsegments = 0;
448     for (CSCSegmentCollection::id_iterator chambIt = cscsegments->id_begin(); chambIt != cscsegments->id_end(); ++chambIt){
449    
450     CSCSegmentCollection::range range = cscsegments->get(*chambIt);
451     for (CSCSegmentCollection::const_iterator cscsegment = range.first; cscsegment!=range.second; ++cscsegment){
452    
453     if(icscsegments >= cscsegmentsSize_) return;
454    
455     cscsegm_ring.push_back((*chambIt).ring());
456     cscsegm_chamber.push_back((*chambIt).chamber());
457     cscsegm_station.push_back((*chambIt).station());
458    
459     const GeomDet* geomDet = theTrackingGeometry->idToDet(cscsegment->geographicalId());
460    
461 pellicci 1.8 const GlobalVector point_glb = geomDet->toGlobal(cscsegment->localDirection());
462    
463     cscsegm_cosx.push_back(point_glb.x());
464     cscsegm_cosy.push_back(point_glb.y());
465     cscsegm_cosz.push_back(point_glb.y());
466    
467 pellicci 1.1
468     cscsegm_normchi2.push_back(cscsegment->chi2()/cscsegment->degreesOfFreedom());
469     cscsegm_nRecHits.push_back(cscsegment->nRecHits());
470    
471     icscsegments++;
472     }
473     }
474    
475     return;
476     }
477    
478     void TTreeGenerator::fill_dcc_variables(edm::Handle<L1MuDTChambPhContainer> localTriggerDCC)
479     {
480     idtltDCC = 0;
481     std::vector<L1MuDTChambPhDigi>* phTrigs = localTriggerDCC->getContainer();
482     for(std::vector<L1MuDTChambPhDigi>::const_iterator iph = phTrigs->begin(); iph != phTrigs->end() ; ++iph){
483    
484     if(idtltDCC >= dtltDCCSize_) break;
485    
486     ltDCC_wheel.push_back(iph->whNum());
487     ltDCC_sector.push_back(iph->scNum() + 1); // DTTF[0-11] -> DT[1-12] Sector Numbering
488     ltDCC_station.push_back(iph->stNum());
489     ltDCC_quality.push_back(iph->code());
490     ltDCC_bx.push_back(iph->bxNum());
491     ltDCC_phi.push_back(iph->phi());
492     ltDCC_phiB.push_back(iph->phiB());
493     ltDCC_is2nd.push_back(iph->Ts2Tag());
494    
495     idtltDCC++;
496     }
497 gmasetti 1.15 return;
498     }
499    
500     void TTreeGenerator::fill_dccth_variables(edm::Handle<L1MuDTChambThContainer> localTriggerDCC_Th)
501     {
502     idtltDCC_th = 0;
503     std::vector<L1MuDTChambThDigi>* thTrigs = localTriggerDCC_Th->getContainer();
504     for(std::vector<L1MuDTChambThDigi>::const_iterator ith = thTrigs->begin(); ith != thTrigs->end() ; ++ith){
505    
506     if(idtltDCC_th >= dtltDCCThSize_) break;
507    
508     ltDCC_thWheel.push_back(ith->whNum());
509     ltDCC_thSector.push_back(ith->scNum() + 1); // DTTF[0-11] -> DT[1-12] Sector Numbering
510     ltDCC_thStation.push_back(ith->stNum());
511     ltDCC_thBx.push_back(ith->bxNum());
512 pellicci 1.1
513 gmasetti 1.15 idtltDCC_th++;
514     }
515 pellicci 1.1 return;
516     }
517    
518     void TTreeGenerator::fill_ddu_variables(edm::Handle<DTLocalTriggerCollection> localTriggerDDU)
519     {
520     idtltDDU = 0;
521     for (DTLocalTriggerCollection::DigiRangeIterator trigUnitIt = localTriggerDDU->begin();trigUnitIt!=localTriggerDDU->end();++trigUnitIt){
522    
523     const DTChamberId& chambId = (*trigUnitIt).first;
524     const DTLocalTriggerCollection::Range& range = (*trigUnitIt).second;
525    
526     for (DTLocalTriggerCollection::const_iterator trigIt = range.first; trigIt!=range.second;++trigIt){
527    
528     if(idtltDDU >= dtltDDUSize_) return;
529    
530     ltDDU_wheel.push_back(chambId.wheel());
531     ltDDU_sector.push_back(chambId.sector());
532     ltDDU_station.push_back(chambId.station());
533     ltDDU_bx.push_back(trigIt->bx());
534     ltDDU_phiQual.push_back(trigIt->quality());
535     ltDDU_thQual.push_back(trigIt->trTheta());
536     ltDDU_is2nd.push_back(trigIt->secondTrack());
537    
538     idtltDDU++;
539     }
540     }
541    
542     return;
543     }
544    
545     void TTreeGenerator::fill_muons_variables(edm::Handle<reco::MuonCollection> MuList)
546     {
547     imuons = 0;
548     for (reco::MuonCollection::const_iterator nmuon = MuList->begin(); nmuon != MuList->end(); ++nmuon){
549    
550     if(!(nmuon->isStandAloneMuon())) continue;
551    
552     if(imuons >= STAMuSize_) break;
553    
554     const reco::TrackRef mutrackref = nmuon->outerTrack();
555    
556     STAMu_isMuGlobal.push_back(nmuon->isGlobalMuon());
557 pellicci 1.10 STAMu_isMuTracker.push_back(nmuon->isTrackerMuon());
558 pellicci 1.1 STAMu_numberOfChambers.push_back(nmuon->numberOfChambers());
559     STAMu_numberOfMatches.push_back(nmuon->numberOfMatches());
560     STAMu_numberOfHits.push_back(mutrackref->numberOfValidHits());
561    
562     Mu_px_mu.push_back(nmuon->px());
563     Mu_py_mu.push_back(nmuon->py());
564     Mu_pz_mu.push_back(nmuon->pz());
565     Mu_phi_mu.push_back(nmuon->phi());
566     Mu_eta_mu.push_back(nmuon->eta());
567    
568     STAMu_recHitsSize.push_back(mutrackref->recHitsSize());
569     STAMu_normchi2Mu.push_back(mutrackref->chi2()/mutrackref->ndof());
570     STAMu_chargeMu.push_back(mutrackref->charge());
571 pellicci 1.9 STAMu_dxyMu.push_back(mutrackref->dxy(beamspot.position()));
572     STAMu_dzMu.push_back(mutrackref->dz(beamspot.position()));
573 pellicci 1.1
574 pellicci 1.8 int segmIndex = 0;
575     int segmWord = 0;
576    
577     std::vector<int> segmIndex_container;
578    
579 pellicci 1.1 for (trackingRecHit_iterator recMu = mutrackref->recHitsBegin(); recMu!=mutrackref->recHitsEnd(); recMu++){
580     DetId detid = (*recMu)->geographicalId();
581     if(detid.subdetId() != MuonSubdetId::DT) continue;
582    
583     DTChamberId recChamb(detid);
584    
585     const short recWheel = recChamb.wheel();
586     const short recSector = recChamb.sector();
587     const short recStation = recChamb.station();
588    
589     //loop over the saved segments and find the position of the rechits
590     //This is the quickest way to do this search: find the sector (highest number of
591     //combinations), loop over the find iterator, and search for wheel and stations
592     std::vector<short>::iterator sectorIt = std::find(segm4D_sector.begin(),segm4D_sector.end(),recSector);
593     while(sectorIt != segm4D_sector.end()){
594    
595 pellicci 1.8 segmIndex = (short) distance(segm4D_sector.begin(),sectorIt);
596 pellicci 1.1
597     if(recWheel == segm4D_wheel.at(segmIndex) && recStation == segm4D_station.at(segmIndex))
598 pellicci 1.8 if(find(segmIndex_container.begin(),segmIndex_container.end(),segmIndex) == segmIndex_container.end()){
599     segmIndex_container.push_back(segmIndex);
600     segmWord |= (1 << segmIndex);
601     }
602 pellicci 1.1 sectorIt = std::find(sectorIt+1,segm4D_sector.end(),recSector);
603     }
604     }
605    
606 pellicci 1.8 STAMu_segmIndex.push_back(segmWord);
607    
608 pellicci 1.1 if(nmuon->isGlobalMuon()){
609     const reco::TrackRef glbmutrackref = nmuon->innerTrack();
610     GLBMu_normchi2Mu.push_back(glbmutrackref->chi2()/glbmutrackref->ndof());
611 pellicci 1.9 GLBMu_dxyMu.push_back(glbmutrackref->dxy(beamspot.position()));
612     GLBMu_dzMu.push_back(glbmutrackref->dz(beamspot.position()));
613 pellicci 1.1
614 battilan 1.17 GLBMu_numberOfPixelHits.push_back(glbmutrackref->hitPattern().numberOfValidPixelHits());
615     GLBMu_numberOfTrackerHits.push_back(glbmutrackref->hitPattern().numberOfValidTrackerHits());
616    
617 pellicci 1.1 GLBMu_tkIsoR03.push_back(nmuon->isolationR03().sumPt);
618     GLBMu_ntkIsoR03.push_back(nmuon->isolationR03().nTracks);
619     GLBMu_emIsoR03.push_back(nmuon->isolationR03().emEt);
620     GLBMu_hadIsoR03.push_back(nmuon->isolationR03().hadEt);
621     }
622     else{
623     GLBMu_normchi2Mu.push_back(-999.);
624     GLBMu_dxyMu.push_back(-999.);
625     GLBMu_dzMu.push_back(-999.);
626    
627 battilan 1.17 GLBMu_numberOfPixelHits.push_back(-999);
628     GLBMu_numberOfTrackerHits.push_back(-999);
629    
630 pellicci 1.1 GLBMu_tkIsoR03.push_back(-999.);
631     GLBMu_ntkIsoR03.push_back(-999.);
632     GLBMu_emIsoR03.push_back(-999.);
633     GLBMu_hadIsoR03.push_back(-999.);
634     }
635    
636     if(nmuon->isCaloCompatibilityValid()) STAMu_caloCompatibility.push_back(nmuon->caloCompatibility());
637     else STAMu_caloCompatibility.push_back(-999.);
638    
639     //extrapolate the muon to the MB2
640     TrajectoryStateOnSurface tsos;
641     tsos = cylExtrapTrkSam(mutrackref,500.); // track at MB2 radius - extrapolation
642    
643     if (tsos.isValid()){
644     static const float pig = acos(-1.);
645    
646     const double xx = tsos.globalPosition().x();
647     const double yy = tsos.globalPosition().y();
648     const double zz = tsos.globalPosition().z();
649    
650     const double rr = sqrt(xx*xx + yy*yy);
651     const double cosphi = xx/rr;
652     const double abspseta = -log(tan(atan(fabs(rr/zz))/2.));
653    
654     STAMu_z_mb2.push_back(zz);
655    
656     if (yy>=0) STAMu_phi_mb2.push_back(acos(cosphi));
657     else STAMu_phi_mb2.push_back(2*pig-acos(cosphi));
658    
659    
660     if (zz>=0) STAMu_pseta_mb2.push_back(abspseta);
661     else STAMu_pseta_mb2.push_back(-abspseta);
662     }
663     else{
664     STAMu_z_mb2.push_back(-999.);
665     STAMu_phi_mb2.push_back(-999.);
666     STAMu_pseta_mb2.push_back(-999.);
667     }
668    
669     imuons++;
670     }
671    
672     return;
673     }
674    
675     void TTreeGenerator::fill_gmt_variables(edm::Handle<L1MuGMTReadoutCollection> gmtrc)
676     {
677     igmtdt = 0;
678     igmtcands = 0;
679    
680     std::vector<L1MuGMTReadoutRecord> gmt_records = gmtrc->getRecords();
681     for(std::vector<L1MuGMTReadoutRecord>::const_iterator igmtrr=gmt_records.begin(); igmtrr!=gmt_records.end(); igmtrr++) {
682    
683     //loop over the different subdetector cands
684     for(int i=0;i<4;i++){
685    
686     std::vector<L1MuRegionalCand> cands = getBXCands(&(*igmtrr),i);
687    
688     for(std::vector<L1MuRegionalCand>::const_iterator candIt = cands.begin(); candIt!=cands.end(); ++candIt){
689    
690     if(igmtdt >= gmtSize_) break;
691    
692     if(!candIt->empty()){
693     gmt_bx.push_back((*candIt).bx());
694     gmt_phi.push_back((*candIt).phiValue());
695     gmt_eta.push_back((*candIt).etaValue());
696     gmt_pt.push_back((*candIt).ptValue());
697     gmt_qual.push_back((*candIt).quality());
698     gmt_detector.push_back(i);
699    
700     igmtdt++;
701     }
702     }
703     }
704    
705     std::vector<L1MuGMTExtendedCand> candsOut = igmtrr->getGMTCands();
706     for(std::vector<L1MuGMTExtendedCand>::const_iterator candOutIt = candsOut.begin(); candOutIt!=candsOut.end(); ++candOutIt){
707    
708     if(igmtcands >= gmtSize_) break;
709    
710     if(!candOutIt->empty()){
711     gmt_cands_fwd.push_back((*candOutIt).isFwd());
712     gmt_cands_isRpc.push_back((*candOutIt).isRPC());
713     gmt_cands_bx.push_back((*candOutIt).bx());
714     gmt_cands_phi.push_back((*candOutIt).phiValue());
715     gmt_cands_eta.push_back((*candOutIt).etaValue());
716     gmt_cands_pt.push_back((*candOutIt).ptValue());
717     gmt_cands_qual.push_back((*candOutIt).quality());
718 pellicci 1.6 gmt_cands_ismatched.push_back((*candOutIt).isMatchedCand());
719 pellicci 1.1
720     igmtcands++;
721     }
722     }
723    
724     }
725    
726     return;
727     }
728    
729 battilan 1.17 void TTreeGenerator::fill_gt_variables(edm::Handle<L1GlobalTriggerReadoutRecord> gtrr, const L1GtTriggerMenu* menu) // CB FIXME speedup
730     {
731     igtalgo = 0;
732     igttt = 0;
733    
734     const AlgorithmMap algoMap = menu->gtAlgorithmMap();
735     const AlgorithmMap ttMap = menu->gtTechnicalTriggerMap();
736    
737     for(int ibx=0; ibx<5; ibx++) {
738     DecisionWord gtDecisionWord = gtrr->decisionWord(ibx-2);
739    
740     if (!gtDecisionWord.empty()) {
741    
742     CItAlgo algoMapIt = algoMap.begin();
743     CItAlgo algoMapEnd = algoMap.end();
744    
745     for(; algoMapIt!=algoMapEnd; ++algoMapIt) {
746     if( menu->gtAlgorithmResult((*algoMapIt).first, gtDecisionWord) ) {
747     // gt_algo_bit.push_back(TString((*algoMapIt).first));
748     gt_algo_bit.push_back((algoMapIt->second).algoBitNumber());
749     gt_algo_bx.push_back(ibx-2);
750     igtalgo++;
751     }
752     }
753     }
754    
755     TechnicalTriggerWord gtTTWord = gtrr->technicalTriggerWord(ibx-2);
756    
757     if (!gtTTWord.empty()) {
758    
759     CItAlgo ttMapIt = ttMap.begin();
760     CItAlgo ttMapEnd = ttMap.end();
761    
762     for(; ttMapIt!=ttMapEnd; ++ttMapIt) {
763    
764     int bitNumber = (ttMapIt->second).algoBitNumber();
765     if (gtTTWord.at(bitNumber)) {
766     // gt_tt_bit.push_back(TString(ttMapIt->first));
767     gt_tt_bit.push_back((ttMapIt->second).algoBitNumber());
768     gt_tt_bx.push_back(ibx-2);
769     igttt++;
770     }
771    
772     }
773     }
774    
775     }
776    
777     return;
778     }
779    
780     void TTreeGenerator::fill_hlt_variables(const edm::Event &e, edm::Handle<edm::TriggerResults> hltresults)
781     {
782     ihlt = 0;
783     const edm::TriggerNames TrigNames_ = e.triggerNames(*hltresults);
784     const int ntrigs = hltresults->size();
785    
786     for (int itr=0; itr<ntrigs; itr++){
787     TString trigName=TrigNames_.triggerName(itr);
788     if (hltresults->accept(itr)) {
789     hlt_path.push_back(trigName);
790     ihlt++;
791     }
792     }
793    
794     return;
795     }
796    
797 pellicci 1.1 std::vector<L1MuRegionalCand> TTreeGenerator::getBXCands(const L1MuGMTReadoutRecord* igmtrr, const int DetectorType) const
798     {
799     if(DetectorType == 0) return igmtrr->getDTBXCands();
800     else if(DetectorType == 1) return igmtrr->getCSCCands();
801     else if(DetectorType == 2) return igmtrr->getBrlRPCCands();
802     else if(DetectorType == 3) return igmtrr->getFwdRPCCands();
803    
804     return igmtrr->getDTBXCands();
805     }
806    
807    
808     void TTreeGenerator::beginJob()
809     {
810 battilan 1.14 outFile = new TFile(outFile_.c_str(), "RECREATE", "");
811 pellicci 1.1 outFile->cd();
812    
813     tree_ = new TTree ("DTTree", "CMSSW DT tree");
814    
815     //Event info
816     tree_->Branch("runnumber",&runnumber,"runnumber/I");
817     tree_->Branch("lumiblock",&lumiblock,"lumiblock/I");
818     tree_->Branch("eventNumber",&eventNumber,"eventNumber/I");
819     tree_->Branch("timestamp",&timestamp,"timestamp/F");
820     tree_->Branch("bunchXing",&bunchXing,"bunchXing/I");
821     tree_->Branch("orbitNum",&orbitNum,"orbitNum/I");
822    
823     //Primary vertex
824     tree_->Branch("PV_x",&PV_x,"PV_x/F");
825     tree_->Branch("PV_y",&PV_y,"PV_y/F");
826     tree_->Branch("PV_z",&PV_z,"PV_z/F");
827    
828     tree_->Branch("PV_xxE",&PV_xxE,"PV_xxE/F");
829     tree_->Branch("PV_yyE",&PV_yyE,"PV_yyE/F");
830     tree_->Branch("PV_zzE",&PV_zzE,"PV_zzE/F");
831     tree_->Branch("PV_xyE",&PV_xyE,"PV_xyE/F");
832     tree_->Branch("PV_xzE",&PV_xzE,"PV_xzE/F");
833     tree_->Branch("PV_yzE",&PV_yzE,"PV_yzE/F");
834    
835     tree_->Branch("PV_normchi2",&PV_normchi2,"PV_normch2/F");
836 pellicci 1.29 tree_->Branch("PV_Nvtx",&PV_Nvtx,"PV_Nvtx/F");
837 pellicci 1.1
838 pellicci 1.26 //luminosity
839     tree_->Branch("lumiperblock",&lumiperblock,"lumiperblock/F");
840 pellicci 1.28 tree_->Branch("beam1Intensity",&beam1Intensity,"beam1Intensity/F");
841     tree_->Branch("beam2Intensity",&beam2Intensity,"beam2Intensity/F");
842 pellicci 1.26
843 pellicci 1.1 //HLT
844 battilan 1.17 tree_->Branch("hlt_path",&hlt_path,32000,-1);
845 pellicci 1.1
846     //digi variables
847     tree_->Branch("digi_wheel",&digi_wheel);
848     tree_->Branch("digi_sector",&digi_sector);
849     tree_->Branch("digi_station",&digi_station);
850     tree_->Branch("digi_sl",&digi_sl);
851     tree_->Branch("digi_layer",&digi_layer);
852     tree_->Branch("digi_wire",&digi_wire);
853     tree_->Branch("digi_time",&digi_time);
854    
855     //DT segment variables
856     tree_->Branch("dtsegm4D_wheel",&segm4D_wheel);
857     tree_->Branch("dtsegm4D_sector",&segm4D_sector);
858     tree_->Branch("dtsegm4D_station",&segm4D_station);
859    
860     tree_->Branch("dtsegm4D_hasPhi",&segm4D_hasPhi);
861     tree_->Branch("dtsegm4D_hasZed",&segm4D_hasZed);
862 battilan 1.11 tree_->Branch("dtsegm4D_x_pos_loc",&segm4D_x_pos_loc);
863     tree_->Branch("dtsegm4D_y_pos_loc",&segm4D_y_pos_loc);
864     tree_->Branch("dtsegm4D_z_pos_loc",&segm4D_z_pos_loc);
865     tree_->Branch("dtsegm4D_x_dir_loc",&segm4D_x_dir_loc);
866     tree_->Branch("dtsegm4D_y_dir_loc",&segm4D_y_dir_loc);
867     tree_->Branch("dtsegm4D_z_dir_loc",&segm4D_z_dir_loc);
868 pellicci 1.8 tree_->Branch("dtsegm4D_cosx",&segm4D_cosx);
869     tree_->Branch("dtsegm4D_cosy",&segm4D_cosy);
870     tree_->Branch("dtsegm4D_cosz",&segm4D_cosz);
871 pellicci 1.1 tree_->Branch("dtsegm4D_phi",&segm4D_phi);
872     tree_->Branch("dtsegm4D_theta",&segm4D_theta);
873     tree_->Branch("dtsegm4D_eta",&segm4D_eta);
874     tree_->Branch("dtsegm4D_t0",&segm4D_t0);
875 dtdqm 1.16 tree_->Branch("dtsegm4D_vdrift",&segm4D_vdrift);
876 pellicci 1.1 tree_->Branch("dtsegm4D_phinormchisq",&segm4D_phinormchi2);
877     tree_->Branch("dtsegm4D_phinhits",&segm4D_phinhits);
878     tree_->Branch("dtsegm4D_znormchisq",&segm4D_znormchi2);
879     tree_->Branch("dtsegm4D_znhits",&segm4D_znhits);
880    
881     //rechits info
882     tree_->Branch("dtsegm4D_phi_hitsPos",&segm4D_phiHits_Pos,2048000,0);
883 battilan 1.24 tree_->Branch("dtsegm4D_phi_hitsPosCh",&segm4D_phiHits_PosCh,2048000,0);
884 pellicci 1.1 tree_->Branch("dtsegm4D_phi_hitsPosErr",&segm4D_phiHits_PosErr,2048000,0);
885     tree_->Branch("dtsegm4D_phi_hitsSide",&segm4D_phiHits_Side,2048000,0);
886 pellicci 1.23 tree_->Branch("dtsegm4D_phi_hitsWire",&segm4D_phiHits_Wire,2048000,0);
887     tree_->Branch("dtsegm4D_phi_hitsLayer",&segm4D_phiHits_Layer,2048000,0);
888 pellicci 1.1
889     tree_->Branch("dtsegm4D_z_hitsPos",&segm4D_zHits_Pos,2048000,0);
890 battilan 1.24 tree_->Branch("dtsegm4D_z_hitsPosCh",&segm4D_zHits_PosCh,2048000,0);
891 pellicci 1.1 tree_->Branch("dtsegm4D_z_hitsPosErr",&segm4D_zHits_PosErr,2048000,0);
892     tree_->Branch("dtsegm4D_z_hitsSide",&segm4D_zHits_Side,2048000,0);
893 pellicci 1.23 tree_->Branch("dtsegm4D_z_hitsWire",&segm4D_zHits_Wire,2048000,0);
894     tree_->Branch("dtsegm4D_z_hitsLayer",&segm4D_zHits_Layer,2048000,0);
895 pellicci 1.1
896     //CSC segment variables
897     tree_->Branch("cscsegm_ring",&cscsegm_ring);
898     tree_->Branch("cscsegm_chamber",&cscsegm_chamber);
899     tree_->Branch("cscsegm_station",&cscsegm_station);
900 pellicci 1.8 tree_->Branch("cscsegm_cosx",&cscsegm_cosx);
901     tree_->Branch("cscsegm_cosy",&cscsegm_cosy);
902     tree_->Branch("cscsegm_cosz",&cscsegm_cosz);
903 pellicci 1.1 tree_->Branch("cscsegm_phi",&cscsegm_phi);
904     tree_->Branch("cscsegm_eta",&cscsegm_eta);
905     tree_->Branch("cscsegm_normchisq",&cscsegm_normchi2);
906     tree_->Branch("cscsegm_nRecHits",&cscsegm_nRecHits);
907    
908     //DCC variables
909     tree_->Branch("ltDCC_wheel",&ltDCC_wheel);
910     tree_->Branch("ltDCC_sector",&ltDCC_sector);
911     tree_->Branch("ltDCC_station",&ltDCC_station);
912     tree_->Branch("ltDCC_quality",&ltDCC_quality);
913     tree_->Branch("ltDCC_bx",&ltDCC_bx);
914     tree_->Branch("ltDCC_phi",&ltDCC_phi);
915     tree_->Branch("ltDCC_phiB",&ltDCC_phiB);
916     tree_->Branch("ltDCC_is2nd",&ltDCC_is2nd);
917    
918 gmasetti 1.15 tree_->Branch("ltDCC_thWheel",&ltDCC_thWheel);
919     tree_->Branch("ltDCC_thSector",&ltDCC_thSector);
920     tree_->Branch("ltDCC_thStation",&ltDCC_thStation);
921     tree_->Branch("ltDCC_thBx",&ltDCC_thBx);
922    
923 pellicci 1.1 //DDU variables
924     tree_->Branch("ltDDU_wheel",&ltDDU_wheel);
925     tree_->Branch("ltDDU_sector",&ltDDU_sector);
926     tree_->Branch("ltDDU_station",&ltDDU_station);
927     tree_->Branch("ltDDU_bx",&ltDDU_bx);
928     tree_->Branch("ltDDU_phiQual",&ltDDU_phiQual);
929     tree_->Branch("ltDDU_thQual",&ltDDU_thQual);
930     tree_->Branch("ltDDU_is2nd",&ltDDU_is2nd);
931    
932     //muon variables
933     tree_->Branch("Mu_isMuGlobal",&STAMu_isMuGlobal);
934 pellicci 1.10 tree_->Branch("Mu_isMuTracker",&STAMu_isMuTracker);
935 pellicci 1.1 tree_->Branch("Mu_numberOfChambers_sta",&STAMu_numberOfChambers);
936     tree_->Branch("Mu_numberOfMatches_sta",&STAMu_numberOfMatches);
937     tree_->Branch("Mu_numberOfHits_sta",&STAMu_numberOfHits);
938     tree_->Branch("Mu_segmentIndex_sta",&STAMu_segmIndex);
939    
940     tree_->Branch("Mu_px",&Mu_px_mu);
941     tree_->Branch("Mu_py",&Mu_py_mu);
942     tree_->Branch("Mu_pz",&Mu_pz_mu);
943     tree_->Branch("Mu_phi",&Mu_phi_mu);
944     tree_->Branch("Mu_eta",&Mu_eta_mu);
945     tree_->Branch("Mu_recHitsSize",&STAMu_recHitsSize);
946     tree_->Branch("Mu_normchi2_sta",&STAMu_normchi2Mu);
947     tree_->Branch("Mu_charge",&STAMu_chargeMu);
948     tree_->Branch("Mu_dxy_sta",&STAMu_dxyMu);
949     tree_->Branch("Mu_dz_sta",&STAMu_dzMu);
950    
951     tree_->Branch("Mu_normchi2_glb",&GLBMu_normchi2Mu);
952     tree_->Branch("Mu_dxy_glb",&GLBMu_dxyMu);
953     tree_->Branch("Mu_dz_glb",&GLBMu_dzMu);
954    
955 battilan 1.17 tree_->Branch("Mu_numberOfPixelHits_glb",&GLBMu_numberOfPixelHits);
956     tree_->Branch("Mu_numberOfTrackerHits_glb",&GLBMu_numberOfTrackerHits);
957    
958 pellicci 1.1 tree_->Branch("Mu_tkIsoR03_glb",&GLBMu_tkIsoR03);
959     tree_->Branch("Mu_ntkIsoR03_glb",&GLBMu_ntkIsoR03);
960     tree_->Branch("Mu_emIsoR03_glb",&GLBMu_emIsoR03);
961     tree_->Branch("Mu_hadIsoR03_glb",&GLBMu_hadIsoR03);
962    
963     tree_->Branch("STAMu_caloCompatibility",&STAMu_caloCompatibility);
964    
965     tree_->Branch("Mu_z_mb2_mu",&STAMu_z_mb2);
966     tree_->Branch("Mu_phi_mb2_mu",&STAMu_phi_mb2);
967     tree_->Branch("Mu_pseta_mb2_mu",&STAMu_pseta_mb2);
968    
969     //GMT
970     tree_->Branch("gmt_bx",&gmt_bx);
971     tree_->Branch("gmt_phi",&gmt_phi);
972     tree_->Branch("gmt_eta",&gmt_eta);
973     tree_->Branch("gmt_pt",&gmt_pt);
974     tree_->Branch("gmt_qual",&gmt_qual);
975     tree_->Branch("gmt_detector",&gmt_detector);
976    
977     tree_->Branch("gmt_cands_fwd",&gmt_cands_fwd);
978     tree_->Branch("gmt_cands_isRpc",&gmt_cands_isRpc);
979     tree_->Branch("gmt_cands_bx",&gmt_cands_bx);
980     tree_->Branch("gmt_cands_phi",&gmt_cands_phi);
981     tree_->Branch("gmt_cands_eta",&gmt_cands_eta);
982     tree_->Branch("gmt_cands_pt",&gmt_cands_pt);
983     tree_->Branch("gmt_cands_qual",&gmt_cands_qual);
984 pellicci 1.6 tree_->Branch("gmt_cands_ismatched",&gmt_cands_ismatched);
985 pellicci 1.1
986 battilan 1.17 //GT
987     tree_->Branch("gt_algo_bit",&gt_algo_bit);
988     tree_->Branch("gt_algo_bx",&gt_algo_bx);
989     tree_->Branch("gt_tt_bit",&gt_tt_bit);
990     tree_->Branch("gt_tt_bx",&gt_tt_bx);
991    
992 pellicci 1.1 //counters
993     tree_->Branch("Ndigis",&idigis,"Ndigis/S");
994     tree_->Branch("Ndtsegments",&idtsegments,"Ndtsegments/S");
995     tree_->Branch("Ncscsegments",&icscsegments,"Ncscsegments/S");
996 gmasetti 1.15 tree_->Branch("NdtltDCC_th",&idtltDCC_th,"NdtltDCC_th/S");
997 pellicci 1.1 tree_->Branch("NdtltDCC",&idtltDCC,"NdtltDCC/S");
998 battilan 1.11 tree_->Branch("NdtltDDU",&idtltDDU,"NdtltDDU/S");
999 pellicci 1.1 tree_->Branch("Nmuons",&imuons,"Nmuons/S");
1000 pellicci 1.6 tree_->Branch("Ngmt",&igmtdt,"Ngmt/S");
1001 pellicci 1.1 tree_->Branch("Ngmtcands",&igmtcands,"Ngmtcands/S");
1002 battilan 1.18 tree_->Branch("Ngtalgo",&igtalgo,"Ngtalgo/S");
1003     tree_->Branch("Ngttechtrig",&igttt,"Ngttt/S");
1004     tree_->Branch("Nhlt",&ihlt,"Nhlt/S");
1005 pellicci 1.1
1006     return;
1007     }
1008    
1009     void TTreeGenerator::endJob()
1010     {
1011     outFile->cd();
1012     tree_->Write();
1013     outFile->Close();
1014    
1015     return;
1016     }
1017    
1018     inline void TTreeGenerator::clear_Arrays()
1019     {
1020     //digi variables
1021     digi_wheel.clear();
1022     digi_sector.clear();
1023     digi_station.clear();
1024     digi_sl.clear();
1025     digi_layer.clear();
1026     digi_wire.clear();
1027     digi_time.clear();
1028    
1029     //DT segment variables
1030     segm4D_wheel.clear();
1031     segm4D_sector.clear();
1032     segm4D_station.clear();
1033     segm4D_hasPhi.clear();
1034     segm4D_hasZed.clear();
1035 battilan 1.11 segm4D_x_pos_loc.clear();
1036     segm4D_y_pos_loc.clear();
1037     segm4D_z_pos_loc.clear();
1038     segm4D_x_dir_loc.clear();
1039     segm4D_y_dir_loc.clear();
1040     segm4D_z_dir_loc.clear();
1041 pellicci 1.8 segm4D_cosx.clear();
1042     segm4D_cosy.clear();
1043     segm4D_cosz.clear();
1044 pellicci 1.1 segm4D_phi.clear();
1045     segm4D_theta.clear();
1046     segm4D_eta.clear();
1047     segm4D_t0.clear();
1048 dtdqm 1.16 segm4D_vdrift.clear();
1049 pellicci 1.1 segm4D_phinormchi2.clear();
1050     segm4D_phinhits.clear();
1051     segm4D_znormchi2.clear();
1052     segm4D_znhits.clear();
1053    
1054     segm4D_phiHits_Pos->Clear();
1055 battilan 1.24 segm4D_phiHits_PosCh->Clear();
1056 pellicci 1.1 segm4D_phiHits_PosErr->Clear();
1057     segm4D_phiHits_Side->Clear();
1058 pellicci 1.23 segm4D_phiHits_Wire->Clear();
1059     segm4D_phiHits_Layer->Clear();
1060 pellicci 1.1
1061     segm4D_zHits_Pos->Clear();
1062 battilan 1.24 segm4D_zHits_PosCh->Clear();
1063 pellicci 1.1 segm4D_zHits_PosErr->Clear();
1064     segm4D_zHits_Side->Clear();
1065 pellicci 1.23 segm4D_zHits_Wire->Clear();
1066     segm4D_zHits_Layer->Clear();
1067 pellicci 1.1
1068     //CSC segment variables
1069     cscsegm_ring.clear();
1070     cscsegm_chamber.clear();
1071     cscsegm_station.clear();
1072 pellicci 1.8 cscsegm_cosx.clear();
1073     cscsegm_cosy.clear();
1074     cscsegm_cosz.clear();
1075 pellicci 1.1 cscsegm_phi.clear();
1076     cscsegm_eta.clear();
1077     cscsegm_normchi2.clear();
1078     cscsegm_nRecHits.clear();
1079    
1080     //DCC variables
1081     ltDCC_wheel.clear();
1082     ltDCC_sector.clear();
1083     ltDCC_station.clear();
1084     ltDCC_quality.clear();
1085     ltDCC_bx.clear();
1086     ltDCC_phi.clear();
1087     ltDCC_phiB.clear();
1088     ltDCC_is2nd.clear();
1089    
1090 gmasetti 1.15 ltDCC_thWheel.clear();
1091     ltDCC_thSector.clear();
1092     ltDCC_thStation.clear();
1093     ltDCC_thBx.clear();
1094    
1095 pellicci 1.1 //DDU variables
1096     ltDDU_wheel.clear();
1097     ltDDU_sector.clear();
1098     ltDDU_station.clear();
1099     ltDDU_bx.clear();
1100     ltDDU_phiQual.clear();
1101     ltDDU_thQual.clear();
1102     ltDDU_is2nd.clear();
1103    
1104     //muon variables
1105     STAMu_isMuGlobal.clear();
1106 pellicci 1.10 STAMu_isMuTracker.clear();
1107 pellicci 1.1 STAMu_numberOfChambers.clear();
1108     STAMu_numberOfMatches.clear();
1109     STAMu_numberOfHits.clear();
1110     STAMu_segmIndex.clear();
1111    
1112     Mu_px_mu.clear();
1113     Mu_py_mu.clear();
1114     Mu_pz_mu.clear();
1115     Mu_phi_mu.clear();
1116     Mu_eta_mu.clear();
1117     STAMu_recHitsSize.clear();
1118     STAMu_normchi2Mu.clear();
1119     STAMu_chargeMu.clear();
1120     STAMu_dxyMu.clear();
1121     STAMu_dzMu.clear();
1122    
1123     GLBMu_normchi2Mu.clear();
1124     GLBMu_dxyMu.clear();
1125     GLBMu_dzMu.clear();
1126    
1127 battilan 1.17 GLBMu_numberOfPixelHits.clear();
1128     GLBMu_numberOfTrackerHits.clear();
1129    
1130 pellicci 1.1 GLBMu_tkIsoR03.clear();
1131     GLBMu_ntkIsoR03.clear();
1132     GLBMu_emIsoR03.clear();
1133     GLBMu_hadIsoR03.clear();
1134    
1135     STAMu_caloCompatibility.clear();
1136    
1137     STAMu_z_mb2.clear();
1138     STAMu_phi_mb2.clear();
1139     STAMu_pseta_mb2.clear();
1140    
1141     //GMT
1142     gmt_bx.clear();
1143     gmt_phi.clear();
1144     gmt_eta.clear();
1145     gmt_pt.clear();
1146     gmt_qual.clear();
1147     gmt_detector.clear();
1148    
1149     gmt_cands_fwd.clear();
1150     gmt_cands_isRpc.clear();
1151     gmt_cands_bx.clear();
1152     gmt_cands_phi.clear();
1153     gmt_cands_eta.clear();
1154     gmt_cands_pt.clear();
1155     gmt_cands_qual.clear();
1156 pellicci 1.6 gmt_cands_ismatched.clear();
1157 pellicci 1.1
1158 battilan 1.17 //GT
1159     gt_algo_bit.clear();
1160     gt_algo_bx.clear();
1161     gt_tt_bit.clear();
1162     gt_tt_bx.clear();
1163    
1164     //HLT
1165     hlt_path.clear();
1166    
1167 pellicci 1.1 return;
1168     }
1169    
1170     void TTreeGenerator::initialize_Tree_variables()
1171     {
1172     //Event variables
1173     runnumber = 0;
1174     lumiblock = 0;
1175     eventNumber = 0;
1176     timestamp = 0.;
1177     bunchXing = 0;
1178     orbitNum = 0;
1179    
1180     PV_x = 0.;
1181     PV_y = 0.;
1182     PV_z = 0.;
1183     PV_xxE = 0.;
1184     PV_yyE = 0.;
1185     PV_zzE = 0.;
1186     PV_xyE = 0.;
1187     PV_xzE = 0.;
1188     PV_yzE = 0.;
1189     PV_normchi2 = 0.;
1190 pellicci 1.29 PV_Nvtx = 0.;
1191 pellicci 1.1
1192 pellicci 1.28 lumiperblock = 0.;
1193     beam1Intensity = 0.;
1194     beam2Intensity = 0.;
1195    
1196 pellicci 1.1 segm4D_phiHits_Pos = new TClonesArray("TVectorF",dtsegmentsSize_);
1197 battilan 1.24 segm4D_phiHits_PosCh = new TClonesArray("TVectorF",dtsegmentsSize_);
1198 pellicci 1.1 segm4D_phiHits_PosErr = new TClonesArray("TVectorF",dtsegmentsSize_);
1199     segm4D_phiHits_Side = new TClonesArray("TVectorF",dtsegmentsSize_);
1200 pellicci 1.23 segm4D_phiHits_Wire = new TClonesArray("TVectorF",dtsegmentsSize_);
1201     segm4D_phiHits_Layer = new TClonesArray("TVectorF",dtsegmentsSize_);
1202 pellicci 1.1
1203     segm4D_zHits_Pos = new TClonesArray("TVectorF",dtsegmentsSize_);
1204 battilan 1.24 segm4D_zHits_PosCh = new TClonesArray("TVectorF",dtsegmentsSize_);
1205 pellicci 1.1 segm4D_zHits_PosErr = new TClonesArray("TVectorF",dtsegmentsSize_);
1206     segm4D_zHits_Side = new TClonesArray("TVectorF",dtsegmentsSize_);
1207 pellicci 1.23 segm4D_zHits_Wire = new TClonesArray("TVectorF",dtsegmentsSize_);
1208     segm4D_zHits_Layer = new TClonesArray("TVectorF",dtsegmentsSize_);
1209 pellicci 1.1
1210     return;
1211     }
1212    
1213     TrajectoryStateOnSurface TTreeGenerator::cylExtrapTrkSam(reco::TrackRef track, const float rho) const
1214     {
1215     Cylinder::PositionType pos(0.,0.,0.);
1216     Cylinder::RotationType rot;
1217     Cylinder::CylinderPointer myCylinder = Cylinder::build(pos, rot, rho);
1218    
1219     FreeTrajectoryState recoStart = freeTrajStateMuon(track);
1220     TrajectoryStateOnSurface recoProp;
1221     recoProp = propagatorAlong->propagate(recoStart, *myCylinder);
1222     if (!recoProp.isValid()) {
1223     recoProp = propagatorOpposite->propagate(recoStart, *myCylinder);
1224     }
1225     return recoProp;
1226     }
1227    
1228     FreeTrajectoryState TTreeGenerator::freeTrajStateMuon(const reco::TrackRef track) const
1229     {
1230     const GlobalPoint innerPoint(track->innerPosition().x(),track->innerPosition().y(),track->innerPosition().z());
1231     const GlobalVector innerVec (track->innerMomentum().x(),track->innerMomentum().y(),track->innerMomentum().z());
1232    
1233     FreeTrajectoryState recoStart(innerPoint, innerVec, track->charge(), &*theBField);
1234    
1235     return recoStart;
1236     }
1237    
1238    
1239     //define this as a plug-in
1240     DEFINE_FWK_MODULE(TTreeGenerator);