ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitEdm/Producers/src/ProducerD2SS.cc
Revision: 1.13
Committed: Thu Nov 13 17:08:31 2008 UTC (16 years, 5 months ago) by paus
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_011, Mit_010a, Mit_010, Mit_009c, Mit_009b, Mit_009a, Mit_009, Mit_008, Mit_008pre2, Mit_008pre1, Mit_006b, Mit_006a, Mit_006
Changes since 1.12: +66 -69 lines
Log Message:
Optimized MultiVertexFitter'D'.

File Contents

# User Rev Content
1 paus 1.13 // $Id: ProducerD2SS.cc,v 1.12 2008/10/24 19:57:47 paus Exp $
2 loizides 1.4
3 loizides 1.7 #include "MitEdm/Producers/interface/ProducerD2SS.h"
4 bendavid 1.1 #include "DataFormats/Common/interface/Handle.h"
5     #include "DataFormats/TrackReco/interface/Track.h"
6     #include "DataFormats/TrackReco/interface/TrackFwd.h"
7 bendavid 1.11 #include "MitEdm/Producers/interface/HitDropperRecord.h"
8     #include "MitEdm/Producers/interface/HitDropper.h"
9 bendavid 1.1 #include "MitEdm/DataFormats/interface/Types.h"
10 loizides 1.7 #include "MitEdm/DataFormats/interface/Collections.h"
11 bendavid 1.1 #include "MitEdm/DataFormats/interface/DecayPart.h"
12     #include "MitEdm/DataFormats/interface/StablePart.h"
13 bendavid 1.8 #include "MitEdm/DataFormats/interface/StableData.h"
14 bendavid 1.1 #include "MitEdm/VertexFitInterface/interface/MvfInterface.h"
15    
16     using namespace std;
17     using namespace edm;
18     using namespace reco;
19     using namespace mitedm;
20 loizides 1.4 using namespace mithep;
21 bendavid 1.1
22     //--------------------------------------------------------------------------------------------------
23     ProducerD2SS::ProducerD2SS(const ParameterSet& cfg) :
24 loizides 1.7 BaseCandProducer(cfg),
25     iStables1_(cfg.getUntrackedParameter<string>("iStables1","")),
26     iStables2_(cfg.getUntrackedParameter<string>("iStables2",""))
27 bendavid 1.1 {
28 paus 1.12 // Constructor
29 bendavid 1.1 produces<DecayPartCol>();
30     }
31    
32     //--------------------------------------------------------------------------------------------------
33     ProducerD2SS::~ProducerD2SS()
34     {
35 paus 1.12 // Destructor
36 bendavid 1.1 }
37    
38     //--------------------------------------------------------------------------------------------------
39     void ProducerD2SS::produce(Event &evt, const EventSetup &setup)
40     {
41 paus 1.12 // Produce the DecayPartCol for a topology: D -> S S
42 loizides 1.7
43 bendavid 1.1 // First input collection
44     Handle<StablePartCol> hStables1;
45     if (!GetProduct(iStables1_, hStables1, evt))
46 paus 1.13 return;
47 bendavid 1.1 const StablePartCol *pS1 = hStables1.product();
48     // Second input collection
49     Handle<StablePartCol> hStables2;
50     if (!GetProduct(iStables2_, hStables2, evt))
51     return;
52     const StablePartCol *pS2 = hStables2.product();
53    
54 paus 1.12 // Get hit dropper
55 bendavid 1.11 ESHandle<HitDropper> hDropper;
56     setup.get<HitDropperRecord>().get("HitDropper",hDropper);
57     const HitDropper *dropper = hDropper.product();
58 paus 1.13
59 bendavid 1.1 // Create the output collection
60     auto_ptr<DecayPartCol> pD(new DecayPartCol());
61    
62     // Simple double loop
63     for (UInt_t i = 0; i<pS1->size(); ++i) {
64     const StablePart &s1 = pS1->at(i);
65 paus 1.13
66 bendavid 1.1 UInt_t j;
67     if (iStables1_ == iStables2_)
68 paus 1.13 j = i+1;
69 bendavid 1.1 else
70     j = 0;
71 paus 1.13
72 bendavid 1.1 for (; j<pS2->size(); ++j) {
73     const StablePart &s2 = pS2->at(j);
74    
75     // Vertex fit now (temporary screwing around)
76 paus 1.13 MultiVertexFitterD fit;
77 loizides 1.7 fit.init(3.8); // Reset to the MC magnetic field of 4 Tesla
78 bendavid 1.1 MvfInterface fitInt(&fit);
79 paus 1.13 fitInt.addTrack(s1.track(),1,s1.mass(),MultiVertexFitterD::VERTEX_1);
80     fitInt.addTrack(s2.track(),2,s2.mass(),MultiVertexFitterD::VERTEX_1);
81 bendavid 1.1 if (fit.fit()) {
82 paus 1.13 DecayPart *d = new DecayPart(oPid_,DecayPart::Fast);
83    
84     // Update temporarily some of the quantities (prob, chi2, nDoF, mass, lxy, pt, fourMomentum)
85     d->setProb(fit.prob());
86     d->setChi2(fit.chisq());
87     d->setNdof(fit.ndof());
88    
89     FourVector p4Fitted(0.,0.,0.,0.);
90     p4Fitted += fit.getTrackP4(1);
91     p4Fitted += fit.getTrackP4(2);
92     d->setFourMomentum(p4Fitted);
93     d->setPosition (fit.getVertex (MultiVertexFitterD::VERTEX_1));
94     d->setError (fit.getErrorMatrix(MultiVertexFitterD::VERTEX_1));
95     float mass, massErr;
96     const int trksIds[2] = { 1, 2 };
97     mass = fit.getMass(2,trksIds,massErr);
98    
99     ThreeVector p3Fitted(p4Fitted.px(),p4Fitted.py(),p4Fitted.pz());
100 bendavid 1.8
101 paus 1.12 // Get decay length in xy plane
102 bendavid 1.8 float dl, dlErr;
103 paus 1.13 dl = fit.getDecayLength (MultiVertexFitterD::PRIMARY_VERTEX,MultiVertexFitterD::VERTEX_1,
104     p3Fitted,dlErr);
105    
106     // Get Z decay length
107 bendavid 1.8 float dlz, dlzErr;
108 paus 1.13 dlz = fit.getZDecayLength(MultiVertexFitterD::PRIMARY_VERTEX,MultiVertexFitterD::VERTEX_1,
109     p3Fitted, dlzErr);
110    
111     // Get impact parameter
112 bendavid 1.8 float dxy, dxyErr;
113 paus 1.13 dxy = fit.getImpactPar (MultiVertexFitterD::PRIMARY_VERTEX,MultiVertexFitterD::VERTEX_1,
114     p3Fitted, dxyErr);
115 loizides 1.4
116 bendavid 1.11 BasePartPtr ptr1(hStables1,i);
117 paus 1.13 BasePartPtr ptr2(hStables2,j);
118    
119     StableData c1(fit.getTrackP4(1).px(),fit.getTrackP4(1).py(), fit.getTrackP4(1).pz(), ptr1);
120     StableData c2(fit.getTrackP4(2).px(),fit.getTrackP4(2).py(), fit.getTrackP4(2).pz(), ptr2);
121    
122     const ThreeVector vtxPos = fit.getVertex(MultiVertexFitterD::VERTEX_1);
123 paus 1.12 const ThreeVector trkMom1(fit.getTrackP4(1).px(),fit.getTrackP4(1).py(),
124 paus 1.13 fit.getTrackP4(1).pz());
125 paus 1.12 const ThreeVector trkMom2(fit.getTrackP4(2).px(),fit.getTrackP4(2).py(),
126 paus 1.13 fit.getTrackP4(2).pz());
127    
128 paus 1.12 // Build corrected HitPattern for StableData, removing hits before the fit vertex
129 bendavid 1.11 reco::HitPattern hits1 = dropper->CorrectedHits(s1.track(), vtxPos, trkMom1, dlErr, dlzErr);
130     reco::HitPattern hits2 = dropper->CorrectedHits(s2.track(), vtxPos, trkMom2, dlErr, dlzErr);
131 paus 1.13
132 bendavid 1.11 c1.SetHits(hits1);
133     c2.SetHits(hits2);
134 paus 1.13
135     d->addStableChild (c1);
136     d->addStableChild (c2);
137 bendavid 1.8 d->setFittedMass (mass);
138     d->setFittedMassError(massErr);
139 paus 1.13 d->setLxy (dl);
140     d->setLxyError (dlErr);
141     d->setLxyToPv (dl);
142     d->setLxyToPvError (dlErr);
143     d->setLz (dlz);
144     d->setLzError (dlzErr);
145     d->setLzToPv (dlz);
146     d->setLzToPvError (dlzErr);
147     d->setDxy (dxy);
148     d->setDxyError (dxyErr);
149     d->setDxyToPv (dxy);
150     d->setDxyToPvError (dxyErr);
151    
152     // Put the result into our collection
153     pD->push_back(*d);
154 bendavid 1.1 delete d;
155     }
156     }
157     }
158    
159     // Write the collection even if it is empty
160 paus 1.13 if (0)
161 loizides 1.10 cout << " ProducerD2SS::produce - " << pD->size() << " entries collection created -"
162     << " (Pid: " << oPid_ << ")\n";
163 bendavid 1.1 evt.put(pD);
164     }
165    
166 paus 1.12 // Define this as a plug-in
167 bendavid 1.1 DEFINE_FWK_MODULE(ProducerD2SS);