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

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