ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerTracks.cc
Revision: 1.41
Committed: Fri Mar 11 04:03:55 2011 UTC (14 years, 1 month ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_024b, Mit_025pre1, Mit_024a, Mit_024, Mit_023, Mit_022a, Mit_022, Mit_020d, TMit_020d, Mit_020c, Mit_021, Mit_021pre2, Mit_021pre1, Mit_020b, Mit_020a, Mit_020, Mit_020pre1
Changes since 1.40: +2 -2 lines
Log Message:
various minor changes to acommodate new root and architecture

File Contents

# User Rev Content
1 bendavid 1.41 // $Id: FillerTracks.cc,v 1.40 2010/06/25 15:17:48 bendavid Exp $
2 loizides 1.1
3 bendavid 1.11 #include "MitProd/TreeFiller/interface/FillerTracks.h"
4 loizides 1.31 #include "DataFormats/RecoCandidate/interface/TrackAssociation.h"
5 bendavid 1.14 #include "DataFormats/TrackReco/interface/HitPattern.h"
6 loizides 1.1 #include "DataFormats/TrackReco/interface/Track.h"
7     #include "DataFormats/TrackReco/interface/TrackFwd.h"
8 bendavid 1.33 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
9 loizides 1.1 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h"
10     #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h"
11 loizides 1.31 #include "MagneticField/Engine/interface/MagneticField.h"
12     #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
13 bendavid 1.23 #include "TrackingTools/TrackAssociator/interface/TrackDetectorAssociator.h"
14 bendavid 1.28 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
15 loizides 1.31 #include "MitAna/DataTree/interface/Names.h"
16     #include "MitAna/DataTree/interface/TrackCol.h"
17     #include "MitProd/ObjectService/interface/ObjectService.h"
18 bendavid 1.26 #include "MitEdm/DataFormats/interface/Types.h"
19 loizides 1.1
20     using namespace std;
21     using namespace edm;
22     using namespace mithep;
23    
24 loizides 1.4 //--------------------------------------------------------------------------------------------------
25 loizides 1.29 FillerTracks::FillerTracks(const ParameterSet &cfg, const char *name, bool active) :
26 loizides 1.7 BaseFiller(cfg,name,active),
27 loizides 1.29 ecalAssocActive_(Conf().getUntrackedParameter<bool>("ecalAssocActive",0)),
28     edmName_(Conf().getUntrackedParameter<string>("edmName","generalTracks")),
29     mitName_(Conf().getUntrackedParameter<string>("mitName",Names::gkTrackBrn)),
30 loizides 1.19 edmSimAssocName_(Conf().getUntrackedParameter<string>("edmSimAssociationName","")),
31 bendavid 1.20 trackingMapName_(Conf().getUntrackedParameter<string>("trackingMapName","TrackingMap")),
32 loizides 1.29 barrelSuperClusterIdMapName_(Conf().getUntrackedParameter<string>
33     ("superClusterIdMapName","barrelSuperClusterIdMap")),
34     endcapSuperClusterIdMapName_(Conf().getUntrackedParameter<string>
35     ("endcapClusterIdMapName","endcapSuperClusterIdMap")),
36 loizides 1.13 trackMapName_(Conf().getUntrackedParameter<string>("trackMapName",
37     Form("%sMapName",mitName_.c_str()))),
38 bendavid 1.17 trackingMap_(0),
39 loizides 1.7 tracks_(new mithep::TrackArr(250)),
40 loizides 1.1 trackMap_(new mithep::TrackMap)
41     {
42 loizides 1.13 // Constructor.
43 bendavid 1.23
44 loizides 1.29 if (ecalAssocActive_) // initialize track associator configuration if needed
45     assocParams_.loadParameters(
46     cfg.getUntrackedParameter<ParameterSet>("TrackAssociatorParameters"));
47 loizides 1.1 }
48    
49 loizides 1.4 //--------------------------------------------------------------------------------------------------
50 loizides 1.1 FillerTracks::~FillerTracks()
51     {
52 loizides 1.13 // Destructor.
53    
54 loizides 1.5 delete tracks_;
55 loizides 1.1 delete trackMap_;
56     }
57    
58 loizides 1.4 //--------------------------------------------------------------------------------------------------
59 bendavid 1.37 void FillerTracks::BookDataBlock(TreeWriter &tws)
60 loizides 1.1 {
61 loizides 1.13 // Add tracks branch to tree, publish and get our objects.
62    
63 loizides 1.29 tws.AddBranch(mitName_,&tracks_);
64     OS()->add<TrackArr>(tracks_,mitName_);
65 loizides 1.12
66 loizides 1.29 if (!trackingMapName_.empty()) {
67     trackingMap_ = OS()->get<TrackingParticleMap>(trackingMapName_);
68     if (trackingMap_)
69     AddBranchDep(mitName_,trackingMap_->GetBrName());
70     }
71 loizides 1.30 if (ecalAssocActive_ && !barrelSuperClusterIdMapName_.empty()) {
72 loizides 1.29 barrelSuperClusterIdMap_ = OS()->get<SuperClusterIdMap>(barrelSuperClusterIdMapName_);
73     if (barrelSuperClusterIdMap_)
74     AddBranchDep(mitName_,barrelSuperClusterIdMap_->GetBrName());
75     }
76 loizides 1.30 if (ecalAssocActive_ && !endcapSuperClusterIdMapName_.empty()) {
77 loizides 1.29 endcapSuperClusterIdMap_ = OS()->get<SuperClusterIdMap>(endcapSuperClusterIdMapName_);
78     if (endcapSuperClusterIdMap_)
79     AddBranchDep(mitName_,endcapSuperClusterIdMap_->GetBrName());
80     }
81     if (!trackMapName_.empty()) {
82     trackMap_->SetBrName(mitName_);
83     OS()->add<TrackMap>(trackMap_,trackMapName_);
84     }
85 loizides 1.1 }
86    
87 loizides 1.4 //--------------------------------------------------------------------------------------------------
88 loizides 1.1 void FillerTracks::FillDataBlock(const edm::Event &event,
89     const edm::EventSetup &setup)
90     {
91 loizides 1.13 // Fill tracks from edm collection into our collection.
92    
93 bendavid 1.27 tracks_ ->Delete();
94 loizides 1.1 trackMap_->Reset();
95 loizides 1.6
96 loizides 1.29 // initialize handle and get product,
97     // this usage allows also to get collections of classes which inherit from reco::Track
98 bendavid 1.24 Handle<View<reco::Track> > hTrackProduct;
99 loizides 1.6 GetProduct(edmName_, hTrackProduct, event);
100 loizides 1.1
101 loizides 1.6 trackMap_->SetEdmProductId(hTrackProduct.id().id());
102 bendavid 1.24 const View<reco::Track> inTracks = *(hTrackProduct.product());
103 loizides 1.1
104 bendavid 1.32 if (verbose_>1)
105     printf("Track Collection: %s, id=%i\n",edmName_.c_str(),hTrackProduct.id().id());
106    
107 paus 1.10 // for MC SimParticle association (reco->sim mappings)
108 loizides 1.1 reco::RecoToSimCollection simAssociation;
109 loizides 1.19 if (trackingMap_ && !edmSimAssocName_.empty()) {
110 loizides 1.1 Handle<reco::RecoToSimCollection> simAssociationProduct;
111 loizides 1.19 GetProduct(edmSimAssocName_, simAssociationProduct, event);
112 loizides 1.1 simAssociation = *(simAssociationProduct.product());
113 loizides 1.29 if (verbose_>1)
114 bendavid 1.41 printf("SimAssociation Map Size = %i\n",(int)simAssociation.size());
115 loizides 1.1 }
116    
117 loizides 1.29 // set up associator for Track-Ecal associations
118 bendavid 1.23 TrackDetectorAssociator trackAssociator;
119     trackAssociator.useDefaultPropagator();
120 bendavid 1.28 edm::ESHandle<MagneticField> bField;
121 bendavid 1.36 if (ecalAssocActive_) {
122 bendavid 1.28 setup.get<IdealMagneticFieldRecord>().get(bField);
123 bendavid 1.36 }
124    
125    
126 paus 1.10 // loop through all tracks and fill the information
127 bendavid 1.24 for (View<reco::Track>::const_iterator it = inTracks.begin();
128     it != inTracks.end(); ++it) {
129    
130 loizides 1.5 mithep::Track *outTrack = tracks_->Allocate();
131 paus 1.10 // create track and set the core parameters
132 loizides 1.19 new (outTrack) mithep::Track(it->qoverp(),it->lambda(),
133     it->phi(),it->dxy(),it->dsz());
134     outTrack->SetErrors(it->qoverpError(),it->lambdaError(),
135     it->phiError(),it->dxyError(),it->dszError());
136 bendavid 1.39
137     outTrack->SetPtErr(it->ptError());
138 loizides 1.1
139 loizides 1.19 // fill track quality information
140 bendavid 1.14 outTrack->SetChi2(it->chi2());
141 loizides 1.16 outTrack->SetNdof(static_cast<Int_t>(it->ndof()));
142 bendavid 1.33
143     //fill algo enum
144     outTrack->SetAlgo(static_cast<mithep::Track::ETrackAlgorithm>(it->algo()));
145    
146 bendavid 1.35 //fill quality bitmask
147     outTrack->Quality().SetQualityMask(BitMask8(UChar_t(it->qualityMask())));
148    
149     if (verbose_>2) {
150     printf("reco::Track high purity = %i, ", it->quality(reco::TrackBase::highPurity));
151     printf("mithep::Track high purity = %i\n",outTrack->Quality().Quality(mithep::TrackQuality::highPurity));
152     }
153    
154 bendavid 1.33 //fill gsf flag, some type gymastics needed...
155     if (typeid(*it)==typeid(reco::GsfTrack))
156     outTrack->SetIsGsf(kTRUE);
157     else
158     outTrack->SetIsGsf(kFALSE);
159 bendavid 1.14
160 bendavid 1.40 if (verbose_>2) {
161     printf("Track pt = %5f, eta = %5f, phi = %5f, nhits = %i, numberofvalidhits = %i, numberofmissinghits = %i, expectedhitsinner = %i, expectedhitsouter = %i\n",it->pt(),it->eta(),it->phi(),it->hitPattern().numberOfHits(),it->numberOfValidHits(),it->hitPattern().numberOfLostHits(),it->trackerExpectedHitsInner().numberOfHits(),it->trackerExpectedHitsOuter().numberOfHits());
162     }
163    
164 bendavid 1.38 //fill hit layer map and missing hits
165 bendavid 1.14 const reco::HitPattern &hits = it->hitPattern();
166 bendavid 1.38 BitMask48 hitLayers;
167     BitMask48 missingHitLayers;
168 bendavid 1.14 for (Int_t i=0; i<hits.numberOfHits(); i++) {
169     uint32_t hit = hits.getHitPattern(i);
170 bendavid 1.38 if (hits.validHitFilter(hit)) {
171     if (hits.trackerHitFilter(hit)) {
172     hitLayers.SetBit(hitReader_.Layer(hit));
173 bendavid 1.40 if (verbose_>2)
174     printf("Found valid hit with layer %i\n",hitReader_.Layer(hit));
175 bendavid 1.38 }
176     }
177    
178     if (hits.getHitType(hit)==1) {
179     if (hits.trackerHitFilter(hit)) {
180     missingHitLayers.SetBit(hitReader_.Layer(hit));
181     }
182     }
183    
184 loizides 1.29 if (verbose_>2) {
185 loizides 1.19 if (hits.muonDTHitFilter(hit))
186     printf("Muon DT Layer = %i\n", hits.getLayer(hit));
187     if (hits.muonCSCHitFilter(hit))
188     printf("Muon CSC Layer = %i\n", hits.getLayer(hit));
189     if (hits.muonRPCHitFilter(hit))
190     printf("Muon RPC Layer = %i\n", hits.getLayer(hit));
191     }
192 bendavid 1.14 }
193 bendavid 1.23
194 bendavid 1.38 outTrack->SetHits(hitLayers);
195     outTrack->SetMissingHits(missingHitLayers);
196    
197 bendavid 1.40
198 bendavid 1.38 //set expected inner hits
199     const reco::HitPattern &expectedInnerHitPattern = it->trackerExpectedHitsInner();
200     BitMask48 expectedHitsInner;
201     // search for all good crossed layers (with or without hit)
202     for (Int_t hi=0; hi<expectedInnerHitPattern.numberOfHits(); hi++) {
203     uint32_t hit = expectedInnerHitPattern.getHitPattern(hi);
204     if (expectedInnerHitPattern.getHitType(hit)<=1) {
205     if (expectedInnerHitPattern.trackerHitFilter(hit)) {
206     expectedHitsInner.SetBit(hitReader_.Layer(hit));
207     }
208     }
209     }
210    
211     outTrack->SetExpectedHitsInner(expectedHitsInner);
212    
213     //set expected outer hits
214     const reco::HitPattern &expectedOuterHitPattern = it->trackerExpectedHitsOuter();
215     BitMask48 expectedHitsOuter;
216     // search for all good crossed layers (with or without hit)
217     for (Int_t hi=0; hi<expectedOuterHitPattern.numberOfHits(); hi++) {
218     uint32_t hit = expectedOuterHitPattern.getHitPattern(hi);
219     if (expectedOuterHitPattern.getHitType(hit)<=1) {
220     if (expectedOuterHitPattern.trackerHitFilter(hit)) {
221     expectedHitsOuter.SetBit(hitReader_.Layer(hit));
222     }
223     }
224     }
225    
226     outTrack->SetExpectedHitsOuter(expectedHitsOuter);
227    
228 bendavid 1.40 //fill actual hit counts
229     outTrack->SetNHits(it->numberOfValidHits());
230     outTrack->SetNPixelHits(it->hitPattern().numberOfValidPixelHits());
231     outTrack->SetNMissingHits(it->hitPattern().numberOfLostHits());
232     outTrack->SetNExpectedHitsInner(it->trackerExpectedHitsInner().numberOfHits());
233     outTrack->SetNExpectedHitsOuter(it->trackerExpectedHitsOuter().numberOfHits());
234    
235    
236     if (verbose_>2)
237     printf("OutTrack NHits = %i, NMissingHits = %i, NExpectedHitsInner = %i, NExpectedHitsOuter = %i\n",outTrack->NHits(),outTrack->NMissingHits(),outTrack->NExpectedHitsInner(),outTrack->NExpectedHitsOuter());
238    
239    
240 bendavid 1.23 //make ecal associations
241     if (ecalAssocActive_) {
242 bendavid 1.28 TrackDetMatchInfo matchInfo;
243     //Extra check to allow propagation to work in AOD where no TrackExtra is available
244     if (it->extra().isAvailable())
245     matchInfo = trackAssociator.associate(event,setup,*it,assocParams_);
246     else {
247     TrajectoryStateTransform tsTransform;
248     FreeTrajectoryState initialState = tsTransform.initialFreeState(*it,&*bField);
249     matchInfo = trackAssociator.associate(event, setup, assocParams_, &initialState);
250     }
251 bendavid 1.36
252     if (matchInfo.isGoodEcal) {
253     outTrack->SetEtaEcal(matchInfo.trkGlobPosAtEcal.eta());
254     outTrack->SetPhiEcal(matchInfo.trkGlobPosAtEcal.phi());
255     }
256 bendavid 1.23
257     //fill supercluster link
258     if (barrelSuperClusterIdMap_ || endcapSuperClusterIdMap_) {
259     mithep::SuperCluster *cluster = 0;
260 loizides 1.29 for (std::vector<const ::CaloTower*>::const_iterator iTower =
261     matchInfo.crossedTowers.begin();
262     iTower<matchInfo.crossedTowers.end() && !cluster; iTower++) {
263 bendavid 1.23
264     for (uint ihit=0; ihit<(*iTower)->constituentsSize() && !cluster; ihit++) {
265     DetId hit = (*iTower)->constituent(ihit);
266     if (barrelSuperClusterIdMap_ && barrelSuperClusterIdMap_->HasMit(hit))
267     cluster = barrelSuperClusterIdMap_->GetMit(hit);
268     else if (endcapSuperClusterIdMap_ && endcapSuperClusterIdMap_->HasMit(hit))
269     cluster = endcapSuperClusterIdMap_->GetMit(hit);
270     }
271     }
272     if (cluster)
273     outTrack->SetSCluster(cluster);
274     }
275     }
276 bendavid 1.14
277 loizides 1.1 // add reference between mithep and edm object
278 loizides 1.30 if (trackMap_) {
279     mitedm::TrackPtr thePtr = inTracks.ptrAt(it - inTracks.begin());
280     trackMap_->Add(thePtr, outTrack);
281     }
282    
283 bendavid 1.35 //do sim associations
284 loizides 1.19 if (trackingMap_ && !edmSimAssocName_.empty()) {
285 loizides 1.29 if (verbose_>1)
286     printf("Trying Track-Sim association\n");
287 bendavid 1.24 reco::TrackBaseRef theBaseRef = inTracks.refAt(it - inTracks.begin());
288 loizides 1.1 vector<pair<TrackingParticleRef, double> > simRefs;
289 paus 1.10 Bool_t noSimParticle = 0;
290 loizides 1.1 try {
291     simRefs = simAssociation[theBaseRef]; //try to get the sim references if existing
292     }
293 loizides 1.5 catch (edm::Exception &ex) {
294 paus 1.10 noSimParticle = 1;
295 loizides 1.1 }
296 paus 1.10
297 loizides 1.1 if (!noSimParticle) { //loop through sim match candidates
298 loizides 1.29 if (verbose_>1)
299     printf("Applying track-sim association\n");
300 loizides 1.1 for (vector<pair<TrackingParticleRef, double> >::const_iterator simRefPair=simRefs.begin();
301     simRefPair != simRefs.end(); ++simRefPair)
302 paus 1.10 if (simRefPair->second > 0.5) // require more than 50% shared hits between reco and sim
303 bendavid 1.17 outTrack->SetMCPart(trackingMap_->GetMit(simRefPair->first)); //add reco->sim reference
304 loizides 1.1 }
305     }
306     }
307     tracks_->Trim();
308     }