ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerDCASig.cc
Revision: 1.1
Committed: Sun Mar 11 23:11:55 2012 UTC (13 years, 1 month ago) by pharris
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_028, Mit_027a, Mit_027, Mit_026, Mit_025e, Mit_025d
Log Message:
Adding DCA Significance + PF No Pileup Flag + Charge Hadron Subtracted Jets

File Contents

# Content
1 #include "MitProd/TreeFiller/interface/FillerDCASig.h"
2 #include "DataFormats/Common/interface/RefToPtr.h"
3 #include "MitEdm/DataFormats/interface/RefToBaseToPtr.h"
4 #include "MitAna/DataTree/interface/DCASigCol.h"
5 #include "MitAna/DataTree/interface/Names.h"
6 #include "MitProd/ObjectService/interface/ObjectService.h"
7
8 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
9 #include "TrackingTools/Records/interface/TransientTrackRecord.h"
10 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
11 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
12 #include "TrackingTools/PatternTools/interface/Trajectory.h"
13 #include "TrackingTools/PatternTools/interface/TrajectoryMeasurement.h"
14 #include "TrackingTools/PatternTools/interface/ClosestApproachInRPhi.h"
15 #include "TrackingTools/PatternTools/interface/TwoTrackMinimumDistance.h"
16 #include "RecoVertex/KinematicFitPrimitives/interface/KinematicParticleFactoryFromTransientTrack.h"
17
18 using namespace std;
19 using namespace edm;
20 using namespace mithep;
21
22 //--------------------------------------------------------------------------------------------------
23 FillerDCASig::FillerDCASig(const ParameterSet &cfg, const char *name, bool active) :
24 BaseFiller(cfg,name,active),
25 edmElectronName_(Conf().getUntrackedParameter<string>("edmElectronName","gsfElectrons")),
26 edmMuonName_(Conf().getUntrackedParameter<string>("edmMuonName","muons")),
27 edmTauName_(Conf().getUntrackedParameter<string>("edmTauName","hpsPFTauProducer")),
28 mitName_(Conf().getUntrackedParameter<string>("mitName","DCASig")),
29 electronMapName_(Conf().getUntrackedParameter<string>("electronMapName","")),
30 muonMapName_(Conf().getUntrackedParameter<string>("muonMapName","")),
31 tauMapName_(Conf().getUntrackedParameter<string>("tauMapName","")),
32 electronPtMin_(Conf().getUntrackedParameter<double>("electronPtMin",5.)),
33 muonPtMin_(Conf().getUntrackedParameter<double>("muonPtMin",5.)),
34 tauPtMin_(Conf().getUntrackedParameter<double>("tauPtMin",10.)),
35 checkDCARef_(Conf().getUntrackedParameter<bool>("checkDCARef","False")),
36 DCASigs_(new mithep::DCASigArr),
37 transientTrackBuilder_(0)
38 {
39 }
40
41 //--------------------------------------------------------------------------------------------------
42 FillerDCASig::~FillerDCASig()
43 {
44 // Destructor.
45 delete DCASigs_;
46 }
47
48 //--------------------------------------------------------------------------------------------------
49 void FillerDCASig::BookDataBlock(TreeWriter &tws)
50 {
51 // Add DCA to the tree
52 tws.AddBranch(mitName_,&DCASigs_);
53 OS()->add<mithep::DCASigArr>(DCASigs_,mitName_);
54
55 //Load Lepton Maps
56 if (!muonMapName_.empty()) {
57 muonMap_ = OS()->get<MuonMap>(muonMapName_);
58 if (muonMap_)
59 AddBranchDep(mitName_,muonMap_->GetBrName());
60 }
61 if (!electronMapName_.empty()) {
62 electronMap_ = OS()->get<ElectronMap>(electronMapName_);
63 if (electronMap_)
64 AddBranchDep(mitName_,electronMap_->GetBrName());
65 }
66 if (!tauMapName_.empty()) {
67 tauMap_ = OS()->get<PFTauMap>(tauMapName_);
68 if (tauMap_)
69 AddBranchDep(mitName_,tauMap_->GetBrName());
70 }
71 }
72 //--------------------------------------------------------------------------------------------------
73 void FillerDCASig::FillDataBlock(const edm::Event &event,
74 const edm::EventSetup &setup)
75 {
76 // Fill conversions data structure and maps.
77
78 DCASigs_->Delete();
79
80
81 //Transient Track Buildder
82 edm::ESHandle<TransientTrackBuilder> builder;
83 setup.get<TransientTrackRecord>().get("TransientTrackBuilder",builder);
84 transientTrackBuilder_ = builder.product();
85
86 //handle for the electron collection
87 Handle<reco::GsfElectronCollection> hElectronProduct;
88 GetProduct(edmElectronName_, hElectronProduct, event);
89 const reco::GsfElectronCollection inElectrons = *(hElectronProduct.product());
90
91 //handle for the muon collection
92 Handle<reco::MuonCollection> hMuonProduct;
93 GetProduct(edmMuonName_, hMuonProduct, event);
94 const reco::MuonCollection inMuons = *(hMuonProduct.product());
95
96 // handle for the tau collection
97 Handle<reco::PFTauCollection> hTauProduct;
98 GetProduct(edmTauName_, hTauProduct, event);
99 const reco::PFTauCollection inTaus = *(hTauProduct.product());
100
101 //Declare some variables
102 Double_t lDCA3D = 0; //3D x-y DCA
103 Double_t lDCA3DE = 0; //3D x-y DCA Err
104 Double_t lDCA2D = 0; //2D x-y DCA
105 Double_t lDCA2DE = 0; //2D x-y DCA Err
106 Double_t lDCARPhi3D = 0; //3D r-phi DCA
107 Double_t lDCARPhi3DE = 0; //3D r-phi DCA Err
108 Double_t lDCARPhi2D = 0; //2D r-phi DCA
109 Double_t lDCARPhi2DE = 0; //2D r-phi DCA Err
110 //Loop through the electrons
111 for (reco::GsfElectronCollection::const_iterator iElectron = inElectrons.begin();
112 iElectron != inElectrons.end(); ++iElectron) {
113 if(iElectron->pt() < electronPtMin_) continue;
114 //Loop through the muons
115 for (reco::MuonCollection::const_iterator iMuon = inMuons.begin(); iMuon != inMuons.end(); ++iMuon) {
116 if(iMuon->pt() < muonPtMin_) continue;
117 //Declare the Object
118
119 const reco::Track * trackElec = (const reco::Track*)(iElectron->gsfTrack().get()); // electron Track
120 const reco::Track * trackMuon = (const reco::Track*)(iMuon->innerTrack() .get()); // muon inner track
121 if(trackMuon == NULL || trackElec == NULL || trackElec == trackMuon) continue;
122 mithep::DCASig *outDCASig = DCASigs_->AddNew();
123 calculateDCA(lDCA3D ,lDCA3DE ,lDCA2D ,lDCA2DE,
124 lDCARPhi3D,lDCARPhi3DE,lDCARPhi2D,lDCARPhi2DE,
125 trackElec,trackMuon,DCASig::eEMu);
126
127 outDCASig->SetDCA2D (lDCA2D); outDCASig->SetDCA2DErr (lDCA2DE);
128 outDCASig->SetDCA3D (lDCA3D); outDCASig->SetDCA3DErr (lDCA3DE);
129 outDCASig->SetDCA2DRPhi(lDCARPhi2D); outDCASig->SetDCA2DRPhiErr(lDCARPhi2DE);
130 outDCASig->SetDCA3DRPhi(lDCARPhi3D); outDCASig->SetDCA3DRPhiErr(lDCARPhi3DE);
131 outDCASig->SetType(DCASig::eEMu);
132
133 //Now the references
134 edm::Ptr<reco::GsfElectron> pElectronPtr(hElectronProduct, iElectron - inElectrons.begin());
135 try{outDCASig->SetElectron(electronMap_->GetMit(pElectronPtr));}
136 catch(...) {
137 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
138 << "Error! Electron unmapped collection " << edmElectronName_ << endl;
139 }
140 edm::Ptr<reco::Muon> pMuonPtr(hMuonProduct, iMuon - inMuons.begin());
141 try{outDCASig->SetMuon (muonMap_->GetMit(pMuonPtr));}
142 catch(...) {
143 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
144 << "Error! Muon unmapped collection " << edmMuonName_ << endl;
145 }
146 }
147 //E+Tau objects
148 for (reco::PFTauCollection::const_iterator iTau = inTaus.begin();
149 iTau != inTaus.end(); ++iTau) {
150 if(iTau->pt() < tauPtMin_) continue;
151 //Declare the Object
152
153 const reco::Track * trackElec = (const reco::Track*)(iElectron->gsfTrack() .get()); // electron Track
154 if(iTau ->leadPFChargedHadrCand().isNull()) { continue;}
155 const reco::Track * trackTau = (const reco::Track*)(iTau ->leadPFChargedHadrCand()->trackRef().get()); // Tau lead track
156 if(trackTau == NULL || trackElec == NULL || trackTau == trackElec) continue;
157 mithep::DCASig *outDCASig = DCASigs_->AddNew();
158 calculateDCA(lDCA3D ,lDCA3DE ,lDCA2D ,lDCA2DE,
159 lDCARPhi3D,lDCARPhi3DE,lDCARPhi2D,lDCARPhi2DE,
160 trackElec,trackTau,DCASig::eETau);
161
162 outDCASig->SetDCA2D (lDCA2D); outDCASig->SetDCA2DErr (lDCA2DE);
163 outDCASig->SetDCA3D (lDCA3D); outDCASig->SetDCA3DErr (lDCA3DE);
164 outDCASig->SetDCA2DRPhi(lDCARPhi2D); outDCASig->SetDCA2DRPhiErr(lDCARPhi2DE);
165 outDCASig->SetDCA3DRPhi(lDCARPhi3D); outDCASig->SetDCA3DRPhiErr(lDCARPhi3DE);
166 outDCASig->SetType(DCASig::eETau);
167
168 //Now the references
169 edm::Ptr<reco::GsfElectron> pElectronPtr(hElectronProduct, iElectron - inElectrons.begin());
170 try{outDCASig->SetElectron(electronMap_->GetMit(pElectronPtr));}
171 catch(...) {
172 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
173 << "Error! Electron unmapped collection " << edmElectronName_ << endl;
174 }
175 edm::Ptr<reco::PFTau> pTauPtr (hTauProduct, iTau - inTaus.begin());
176 //std::cout << " ===> Tau Ref : " << &pTauPtr << " -- " << ((tauMap_->GetMit(pTauPtr))) << endl;
177 try{outDCASig->SetTau (tauMap_ ->GetMit(pTauPtr));}
178 catch(...) {
179 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
180 << "Error! Tau unmapped collection " << edmTauName_ << endl;
181 }
182 }
183 //E + E Objects
184 for (reco::GsfElectronCollection::const_iterator iElectron1 = iElectron+1;
185 iElectron1 != inElectrons.end(); ++iElectron1) {
186 if(iElectron1->pt() < electronPtMin_) continue;
187
188 //Declare the Object
189 const reco::Track * trackElec0 = (const reco::Track*)(iElectron ->gsfTrack().get()); // electron Track
190 const reco::Track * trackElec1 = (const reco::Track*)(iElectron1->gsfTrack().get()); // electron Track
191
192 if(trackElec1 == NULL || trackElec0 == NULL || trackElec0 == trackElec1) continue;
193 mithep::DCASig *outDCASig = DCASigs_->AddNew();
194 calculateDCA(lDCA3D ,lDCA3DE ,lDCA2D ,lDCA2DE,
195 lDCARPhi3D,lDCARPhi3DE,lDCARPhi2D,lDCARPhi2DE,
196 trackElec0,trackElec1,DCASig::eEE);
197
198 outDCASig->SetDCA2D (lDCA2D); outDCASig->SetDCA2DErr (lDCA2DE);
199 outDCASig->SetDCA3D (lDCA3D); outDCASig->SetDCA3DErr (lDCA3DE);
200 outDCASig->SetDCA2DRPhi(lDCARPhi2D); outDCASig->SetDCA2DRPhiErr(lDCARPhi2DE);
201 outDCASig->SetDCA3DRPhi(lDCARPhi3D); outDCASig->SetDCA3DRPhiErr(lDCARPhi3DE);
202 outDCASig->SetType(DCASig::eEE);
203
204 //Now the references
205 edm::Ptr<reco::GsfElectron> pElectronPtr (hElectronProduct, iElectron - inElectrons.begin());
206 try{outDCASig->SetElectron(electronMap_->GetMit(pElectronPtr));}
207 catch(...) {
208 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
209 << "Error! Electron unmapped collection " << edmElectronName_ << endl;
210 }
211 edm::Ptr<reco::GsfElectron> pElectron1Ptr(hElectronProduct, iElectron1 - inElectrons.begin());
212 try{outDCASig->SetElectron(electronMap_->GetMit(pElectron1Ptr),true);}
213 catch(...) {
214 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
215 << "Error! Electron unmapped collection " << edmElectronName_ << endl;
216 }
217 }
218 }
219 //Now the Mu Tau combination
220 for (reco::MuonCollection::const_iterator iMuon = inMuons.begin(); iMuon != inMuons.end(); ++iMuon) {
221 if(iMuon->pt() < muonPtMin_) continue;
222 for (reco::PFTauCollection::const_iterator iTau = inTaus.begin();
223 iTau != inTaus.end(); ++iTau) {
224 if(iTau->pt() < tauPtMin_) continue;
225 const reco::Track * trackMuon = (const reco::Track*)(iMuon->innerTrack() .get()); // muon inner track
226 if(iTau ->leadPFChargedHadrCand().isNull()) { continue;}
227 const reco::Track * trackTau = (const reco::Track*)(iTau ->leadPFChargedHadrCand()->trackRef().get()); // Tau lead track
228
229 if(trackTau == NULL || trackMuon == NULL || trackTau == trackMuon) continue;
230 calculateDCA(lDCA3D ,lDCA3DE ,lDCA2D ,lDCA2DE,
231 lDCARPhi3D,lDCARPhi3DE,lDCARPhi2D,lDCARPhi2DE,
232 trackMuon,trackTau,DCASig::eMuTau);
233
234 mithep::DCASig *outDCASig = DCASigs_->AddNew();
235 outDCASig->SetDCA2D (lDCA2D); outDCASig->SetDCA2DErr (lDCA2DE);
236 outDCASig->SetDCA3D (lDCA3D); outDCASig->SetDCA3DErr (lDCA3DE);
237 outDCASig->SetDCA2DRPhi(lDCARPhi2D); outDCASig->SetDCA2DRPhiErr(lDCARPhi2DE);
238 outDCASig->SetDCA3DRPhi(lDCARPhi3D); outDCASig->SetDCA3DRPhiErr(lDCARPhi3DE);
239 outDCASig->SetType(DCASig::eMuTau);
240
241 //Now the references
242 edm::Ptr<reco::Muon> pMuonPtr(hMuonProduct, iMuon - inMuons.begin());
243 try{outDCASig->SetMuon (muonMap_->GetMit(pMuonPtr));}
244 catch(...) {
245 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
246 << "Error! Muon unmapped collection " << edmMuonName_ << endl;
247 }
248 edm::Ptr<reco::PFTau> pTauPtr (hTauProduct, iTau - inTaus.begin());
249 try{outDCASig->SetTau (tauMap_ ->GetMit(pTauPtr));}
250 catch(...) {
251 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
252 << "Error! Tau unmapped collection " << edmTauName_ << endl;
253 }
254 }
255 //Mu + MU
256 for (reco::MuonCollection::const_iterator iMuon1 = iMuon+1;
257 iMuon1 != inMuons.end(); ++iMuon1) {
258 if(iMuon1->pt() < muonPtMin_) continue;
259
260 const reco::Track * trackMuon0 = (const reco::Track*)(iMuon ->innerTrack() .get()); // muon inner track
261 const reco::Track * trackMuon1 = (const reco::Track*)(iMuon1->innerTrack() .get()); // muon inner track
262
263 if(trackMuon1 == NULL || trackMuon0 == NULL || trackMuon0 == trackMuon1) continue;
264 calculateDCA(lDCA3D ,lDCA3DE ,lDCA2D ,lDCA2DE,
265 lDCARPhi3D,lDCARPhi3DE,lDCARPhi2D,lDCARPhi2DE,
266 trackMuon0,trackMuon1,DCASig::eMuMu);
267
268 mithep::DCASig *outDCASig = DCASigs_->AddNew();
269 outDCASig->SetDCA2D (lDCA2D); outDCASig->SetDCA2DErr (lDCA2DE);
270 outDCASig->SetDCA3D (lDCA3D); outDCASig->SetDCA3DErr (lDCA3DE);
271 outDCASig->SetDCA2DRPhi(lDCARPhi2D); outDCASig->SetDCA2DRPhiErr(lDCARPhi2DE);
272 outDCASig->SetDCA3DRPhi(lDCARPhi3D); outDCASig->SetDCA3DRPhiErr(lDCARPhi3DE);
273 outDCASig->SetType(DCASig::eMuMu);
274 //Now the references
275 edm::Ptr<reco::Muon> pMuon0Ptr(hMuonProduct, iMuon - inMuons.begin());
276 try{outDCASig->SetMuon (muonMap_->GetMit(pMuon0Ptr));}
277 catch(...) {
278 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
279 << "Error! Muon unmapped collection " << edmMuonName_ << endl;
280 }
281 edm::Ptr<reco::Muon> pMuon1Ptr(hMuonProduct, iMuon1 - inMuons.begin());
282 try{outDCASig->SetMuon (muonMap_->GetMit(pMuon1Ptr),true);}
283 catch(...) {
284 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
285 << "Error! Muon unmapped collection " << edmMuonName_ << endl;
286 }
287 }
288 }
289 for (reco::PFTauCollection::const_iterator iTau0 = inTaus.begin();
290 iTau0 != inTaus.end(); ++iTau0) {
291 if(iTau0->pt() < tauPtMin_) continue;
292 for (reco::PFTauCollection::const_iterator iTau1 = iTau0+1;
293 iTau1 != inTaus.end(); ++iTau1) {
294 if(iTau0 == iTau1) continue;
295 if(iTau1->pt() < tauPtMin_) continue;
296
297 if(iTau0 ->leadPFChargedHadrCand().isNull()) { continue;}
298 if(iTau1 ->leadPFChargedHadrCand().isNull()) { continue;}
299 const reco::Track * trackTau0 = (const reco::Track*)(iTau0 ->leadPFChargedHadrCand()->trackRef().get()); // Tau lead track
300 const reco::Track * trackTau1 = (const reco::Track*)(iTau1 ->leadPFChargedHadrCand()->trackRef().get()); // Tau lead track
301
302 if(trackTau1 == NULL || trackTau0 == NULL || trackTau0 == trackTau1) continue;
303 calculateDCA(lDCA3D ,lDCA3DE ,lDCA2D ,lDCA2DE,
304 lDCARPhi3D,lDCARPhi3DE,lDCARPhi2D,lDCARPhi2DE,
305 trackTau0,trackTau1,DCASig::eTauTau);
306
307 mithep::DCASig *outDCASig = DCASigs_->AddNew();
308
309 outDCASig->SetDCA2D (lDCA2D); outDCASig->SetDCA2DErr (lDCA2DE);
310 outDCASig->SetDCA3D (lDCA3D); outDCASig->SetDCA3DErr (lDCA3DE);
311 outDCASig->SetDCA2DRPhi(lDCARPhi2D); outDCASig->SetDCA2DRPhiErr(lDCARPhi2DE);
312 outDCASig->SetDCA3DRPhi(lDCARPhi3D); outDCASig->SetDCA3DRPhiErr(lDCARPhi3DE);
313 outDCASig->SetType(DCASig::eTauTau);
314 //Now the references
315 edm::Ptr<reco::PFTau> pTau0Ptr (hTauProduct, iTau0 - inTaus.begin());
316 try{outDCASig->SetTau (tauMap_ ->GetMit(pTau0Ptr));}
317 catch(...) {
318 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
319 << "Error! Tau unmapped collection " << edmTauName_ << endl;
320 }
321 edm::Ptr<reco::PFTau> pTau1Ptr (hTauProduct, iTau1 - inTaus.begin());
322 try{outDCASig->SetTau (tauMap_ ->GetMit(pTau1Ptr),true);}
323 catch(...) {
324 if(checkDCARef_) throw edm::Exception(edm::errors::Configuration, "FillerDCASig:FillDataBlock()\n")
325 << "Error! Tau unmapped collection " << edmTauName_ << endl;
326 }
327 }
328 }
329 DCASigs_->Trim();
330 }
331 //--------------------------------------------------------------------------------------------------
332 //Get DCA Significane
333 void FillerDCASig::calculateDCA(Double_t &iDCA3D ,Double_t &iDCA3DE ,Double_t &iDCA2D ,Double_t &iDCA2DE,
334 Double_t &iDCARPhi3D,Double_t &iDCARPhi3DE,Double_t &iDCARPhi2D,Double_t &iDCARPhi2DE,
335 const reco::Track *iTrack1,const reco::Track *iTrack2,mithep::DCASig::EDCAType iType) {
336 iDCA3D = -1.0;
337 iDCA3DE = -1.0;
338 iDCA2D = -1.0;
339 iDCA2DE = -1.0;
340 iDCARPhi3D = -1.0;
341 iDCARPhi3DE = -1.0;
342 iDCARPhi2D = -1.0;
343 iDCARPhi2DE = -1.0;
344
345 if (iTrack1==NULL) return;
346 if (iTrack2==NULL) return;
347
348 ParticleMass pion_mass = 0.139657;
349 float pion_sigma = pion_mass*1.e-6;
350
351 ParticleMass muon_mass = 0.105658;
352 float muon_sigma = muon_mass*1.e-6;
353
354 ParticleMass elec_mass = 0.000511;
355 float elec_sigma = elec_mass*1.e-6;
356
357 float mass1 = elec_mass;
358 float mass2 = muon_mass;
359
360 float mass_sigma1 = elec_sigma;
361 float mass_sigma2 = muon_sigma;
362
363 if(iType == DCASig::eETau ) mass1 = pion_sigma;
364 if(iType == DCASig::eEE ) mass2 = elec_sigma;
365
366 if(iType == DCASig::eMuTau ) {mass1 = muon_sigma; mass2 = pion_sigma;}
367 if(iType == DCASig::eMuMu ) {mass1 = muon_sigma; mass2 = muon_sigma;}
368
369 if(iType == DCASig::eTauTau ) {mass1 = pion_sigma; mass2 = pion_sigma;}
370
371 if(iType == DCASig::eETau ) mass_sigma2 = pion_sigma;
372 if(iType == DCASig::eEE ) mass_sigma2 = elec_sigma;
373
374 if(iType == DCASig::eMuTau ) {mass_sigma1 = muon_sigma; mass_sigma2 = pion_sigma;}
375 if(iType == DCASig::eMuMu ) {mass_sigma1 = muon_sigma; mass_sigma2 = muon_sigma;}
376
377 if(iType == DCASig::eTauTau ) {mass_sigma1 = pion_sigma; mass_sigma2 = pion_sigma;}
378
379 reco::TransientTrack transientTrack1;
380 reco::TransientTrack transientTrack2;
381
382 transientTrack1 = transientTrackBuilder_->build(*iTrack1);
383 transientTrack2 = transientTrackBuilder_->build(*iTrack2);
384 reco::TransientTrack * trk1Ptr = & transientTrack1;
385 reco::TransientTrack * trk2Ptr = & transientTrack2;
386
387 FreeTrajectoryState track1State = trk1Ptr->impactPointTSCP().theState();
388 FreeTrajectoryState track2State = trk2Ptr->impactPointTSCP().theState();
389
390 if (trk1Ptr->impactPointTSCP().isValid() && trk2Ptr->impactPointTSCP().isValid()) {
391
392 ClosestApproachInRPhi cApp;
393 TwoTrackMinimumDistance minDist;
394
395 typedef ROOT::Math::SVector<double, 3> SVector3;
396 typedef ROOT::Math::SMatrix<double, 3, 3, ROOT::Math::MatRepSym<double, 3> > SMatrixSym3D;
397 cApp.calculate(track1State,track2State);
398 minDist.calculate(track1State,track2State);
399 if (minDist.status()) {
400
401 minDist.distance();
402 std::pair<GlobalPoint,GlobalPoint> pcaLeptons = minDist.points();
403 GlobalPoint track1PCA = pcaLeptons.first;
404 GlobalPoint track2PCA = pcaLeptons.second;
405
406 //Creating a KinematicParticleFactory
407 KinematicParticleFactoryFromTransientTrack pFactory;
408
409 //initial chi2 and ndf before kinematic fits.
410 float chi = 0.;
411 float ndf = 0.;
412 RefCountedKinematicParticle track1Part = pFactory.particle(transientTrack1,mass1,chi,ndf,mass_sigma1);
413 RefCountedKinematicParticle track2Part = pFactory.particle(transientTrack2,mass2,chi,ndf,mass_sigma2);
414
415 SVector3 distanceVector(track1PCA.x()-track2PCA.x(),
416 track1PCA.y()-track2PCA.y(),
417 track1PCA.z()-track2PCA.z());
418
419 iDCA3D = ROOT::Math::Mag(distanceVector);
420
421 std::vector<float> vvv(6);
422
423 vvv[0] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(0,0);
424 vvv[1] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(0,1);
425 vvv[2] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(1,1);
426 vvv[3] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(0,2);
427 vvv[4] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(1,2);
428 vvv[5] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(2,2);
429
430 SMatrixSym3D track1PCACov(vvv.begin(),vvv.end());
431
432 vvv[0] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(0,0);
433 vvv[1] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(0,1);
434 vvv[2] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(1,1);
435 vvv[3] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(0,2);
436 vvv[4] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(1,2);
437 vvv[5] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(2,2);
438
439 SMatrixSym3D track2PCACov(vvv.begin(),vvv.end());
440
441 SMatrixSym3D totCov = track1PCACov + track2PCACov;
442
443 if(iDCA3D != 0) iDCA3DE = sqrt(ROOT::Math::Similarity(totCov, distanceVector))/iDCA3D;
444 if(iDCA3D == 0) iDCA3DE = 0.;
445
446 distanceVector(2) = 0.0;
447 iDCA2D = ROOT::Math::Mag(distanceVector);
448 if(iDCA2D != 0) iDCA2DE = sqrt(ROOT::Math::Similarity(totCov, distanceVector))/iDCA2D;
449 if(iDCA2D == 0) iDCA2DE = 0.;
450 }
451 if (cApp.status()) {
452
453 cApp.distance();
454 std::pair<GlobalPoint,GlobalPoint> pcaLeptons = cApp.points();
455 GlobalPoint track1PCA = pcaLeptons.first;
456 GlobalPoint track2PCA = pcaLeptons.second;
457
458 //Creating a KinematicParticleFactory
459 KinematicParticleFactoryFromTransientTrack pFactory;
460
461 //initial chi2 and ndf before kinematic fits.
462 float chi = 0.;
463 float ndf = 0.;
464 RefCountedKinematicParticle track1Part = pFactory.particle(transientTrack1,mass1,chi,ndf,mass_sigma1);
465 RefCountedKinematicParticle track2Part = pFactory.particle(transientTrack2,mass2,chi,ndf,mass_sigma2);
466
467 SVector3 distanceVector(track1PCA.x()-track2PCA.x(),
468 track1PCA.y()-track2PCA.y(),
469 track1PCA.z()-track2PCA.z());
470 iDCARPhi3D = ROOT::Math::Mag(distanceVector);
471
472 std::vector<float> vvv(6);
473
474 vvv[0] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(0,0);
475 vvv[1] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(0,1);
476 vvv[2] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(1,1);
477 vvv[3] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(0,2);
478 vvv[4] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(1,2);
479 vvv[5] = track1Part->stateAtPoint(track1PCA).kinematicParametersError().matrix()(2,2);
480
481 SMatrixSym3D track1PCACov(vvv.begin(),vvv.end());
482
483 vvv[0] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(0,0);
484 vvv[1] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(0,1);
485 vvv[2] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(1,1);
486 vvv[3] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(0,2);
487 vvv[4] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(1,2);
488 vvv[5] = track2Part->stateAtPoint(track2PCA).kinematicParametersError().matrix()(2,2);
489
490 SMatrixSym3D track2PCACov(vvv.begin(),vvv.end());
491
492 SMatrixSym3D totCov = track1PCACov + track2PCACov;
493
494 if(iDCARPhi3D != 0) iDCARPhi3DE = sqrt(ROOT::Math::Similarity(totCov, distanceVector))/iDCARPhi3D;
495 if(iDCARPhi3D == 0) iDCARPhi3DE = 0.;
496
497 distanceVector(2) = 0.0;
498 iDCARPhi2D = ROOT::Math::Mag(distanceVector);
499 if(iDCARPhi2D != 0) iDCARPhi2DE = sqrt(ROOT::Math::Similarity(totCov, distanceVector))/iDCARPhi2D;
500 if(iDCARPhi2D == 0) iDCARPhi2DE = 0.;
501 }
502 }
503 }
504