ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitEdm/Producers/src/ProducerV2SS.cc
Revision: 1.16
Committed: Tue Dec 1 01:33:39 2009 UTC (15 years, 5 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_012c
Changes since 1.15: +40 -26 lines
Log Message:
Replace slow,buggy helix intersector with equivalent cmssw code

File Contents

# User Rev Content
1 bendavid 1.16 // $Id: ProducerV2SS.cc,v 1.15 2009/11/02 22:56:18 bendavid Exp $
2 loizides 1.7
3 mrudolph 1.3 #include "DataFormats/Common/interface/Handle.h"
4     #include "DataFormats/TrackReco/interface/Track.h"
5     #include "DataFormats/TrackReco/interface/TrackFwd.h"
6 bendavid 1.15 #include "MagneticField/Engine/interface/MagneticField.h"
7     #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
8 bendavid 1.16 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
9     #include "TrackingTools/PatternTools/interface/ClosestApproachInRPhi.h"
10 bendavid 1.8 #include "MitEdm/Producers/interface/HitDropperRecord.h"
11     #include "MitEdm/Producers/interface/HitDropper.h"
12 mrudolph 1.3 #include "MitEdm/DataFormats/interface/Types.h"
13 mrudolph 1.4 #include "MitEdm/DataFormats/interface/Collections.h"
14 mrudolph 1.3 #include "MitEdm/DataFormats/interface/DecayPart.h"
15     #include "MitEdm/DataFormats/interface/StablePart.h"
16 bendavid 1.5 #include "MitEdm/DataFormats/interface/StableData.h"
17 mrudolph 1.3 #include "MitEdm/VertexFitInterface/interface/MvfInterface.h"
18     #include "MitEdm/Producers/interface/ProducerV2SS.h"
19    
20     using namespace std;
21     using namespace edm;
22     using namespace mitedm;
23 bendavid 1.5 using namespace mithep;
24 mrudolph 1.3
25     //--------------------------------------------------------------------------------------------------
26     ProducerV2SS::ProducerV2SS(const ParameterSet& cfg) :
27     ProducerD2SS(cfg),
28 paus 1.10 rhoMin_ (cfg.getUntrackedParameter<double>("minRadius", 0.0)),
29     massMin_ (cfg.getUntrackedParameter<double>("minMass", 0.0)),
30     massMax_ (cfg.getUntrackedParameter<double>("maxMass", 3.0)),
31 bendavid 1.11 dZMax_ (cfg.getUntrackedParameter<double>("maxZDistance",5.0)),
32     useHitDropper_(cfg.getUntrackedParameter<bool>("useHitDropper",true))
33 mrudolph 1.3 {
34 loizides 1.12 // Constructor.
35 mrudolph 1.3 }
36    
37     //--------------------------------------------------------------------------------------------------
38     ProducerV2SS::~ProducerV2SS()
39     {
40 loizides 1.12 // Destructor.
41 mrudolph 1.3 }
42    
43     //--------------------------------------------------------------------------------------------------
44     void ProducerV2SS::produce(Event &evt, const EventSetup &setup)
45     {
46 loizides 1.12 // Produce the output collection.
47    
48 mrudolph 1.3 auto_ptr<DecayPartCol> pD(new DecayPartCol());
49    
50     // First input collection
51     Handle<StablePartCol> hStables1;
52     Handle<StablePartCol> hStables2;
53     if (!GetProduct(iStables1_, hStables1, evt) ) {
54     cout << "Couldn't get in collection in Producer V2SS" << endl;
55     evt.put(pD);
56     return;
57     }
58 loizides 1.7 const StablePartCol *pS1 = hStables1.product();
59 mrudolph 1.3
60 loizides 1.7 // Second input collection
61 mrudolph 1.3 if(!GetProduct(iStables2_, hStables2, evt)) {
62     cout << "Couldn't get in collection in Producer V2SS" << endl;
63     evt.put(pD);
64     return;
65     }
66     const StablePartCol *pS2 = hStables2.product();
67 bendavid 1.8
68     //get hit dropper
69     ESHandle<HitDropper> hDropper;
70 bendavid 1.11 const HitDropper *dropper = 0;
71     if (useHitDropper_) {
72     setup.get<HitDropperRecord>().get("HitDropper",hDropper);
73     dropper = hDropper.product();
74     }
75 bendavid 1.15
76     //Get Magnetic Field from event setup, taking value at (0,0,0)
77     edm::ESHandle<MagneticField> magneticField;
78     setup.get<IdealMagneticFieldRecord>().get(magneticField);
79     const double bfield = magneticField->inTesla(GlobalPoint(0.,0.,0.)).z();
80 mrudolph 1.3
81     // -----------------------------------------------------------------------------------------------
82     // Simple double loop
83     // -----------------------------------------------------------------------------------------------
84 loizides 1.7 if (0)
85     cout << "Starting V finder loop" << endl;
86 mrudolph 1.3
87 bendavid 1.16 ClosestApproachInRPhi helixIntersector;
88    
89    
90 loizides 1.7 //sX_y: X= pion or proton collection.
91     //i, j = 2 loop particles.
92     //ex.: s1_i and s2_i are same particle as pion and proton
93 mrudolph 1.3 for (UInt_t i=0; i<pS1->size(); ++i) {
94     const StablePart &s1 = pS1->at(i);
95    
96     UInt_t j;
97     if (iStables1_ == iStables2_)
98     j = i+1;
99     else
100     j = 0;
101    
102 bendavid 1.16 TrajectoryStateTransform tsTransform;
103    
104     FreeTrajectoryState initialState1 = tsTransform.initialFreeState(*s1.track(),&*magneticField);
105    
106    
107 mrudolph 1.3 for (; j<pS2->size(); ++j) {
108     const StablePart &s2 = pS2->at(j);
109    
110     if(s1.charge() + s2.charge() != 0) continue;
111    
112 loizides 1.12 // do fast helix fit to check if there's any hope
113 mrudolph 1.3 const reco::Track * t1 = s1.track();
114     const reco::Track * t2 = s2.track();
115 bendavid 1.16
116 mrudolph 1.3 double dZ0 = -999;
117     double dR0 = -999;
118 bendavid 1.16 double mass0 = 0.0;
119    
120     FreeTrajectoryState initialState2 = tsTransform.initialFreeState(*s2.track(),&*magneticField);
121     helixIntersector.calculate(initialState1, initialState2);
122     if (helixIntersector.status()) {
123     dZ0 = fabs(helixIntersector.points().first.z() - helixIntersector.points().second.z());
124     dR0 = helixIntersector.crossingPoint().perp();
125    
126     GlobalVector v1, v2;
127     v1 = helixIntersector.trajectoryParameters().first.momentum();
128     v2 = helixIntersector.trajectoryParameters().second.momentum();
129    
130     double e1 = sqrt(v1.mag2()+s1.mass()*s1.mass());
131     double x1 = v1.x();
132     double y1 = v1.y();
133     double z1 = v1.z();
134    
135     double e2 = sqrt(v2.mag2()+s2.mass()*s2.mass());
136     double x2 = v2.x();
137     double y2 = v2.y();
138     double z2 = v2.z();
139    
140     FourVector sum(x1+x2, y1+y2, z1+z2, e1+e2);
141    
142     mass0 = sqrt(sum.M2());
143     }
144    
145    
146 loizides 1.12 // Basic cuts on helix intersection
147 mrudolph 1.3 if(mass0 > massMax_ || mass0<massMin_ || fabs(dZ0) > dZMax_ || dR0 < rhoMin_) continue;
148    
149     // -------------------------------------------------------------------------------------------
150     // Do vertex fit for all pairs
151 loizides 1.7 // -------------------------------------------------------------------------------------------
152 paus 1.10 mithep::MultiVertexFitterD fit;
153 bendavid 1.15 fit.init(bfield); // Reset to the magnetic field from the event setup
154 mrudolph 1.3 fit.setChisqMax(100);
155     MvfInterface fitInt(&fit);
156 paus 1.10 fitInt.addTrack(s1.track(),1,s1.mass(),mithep::MultiVertexFitterD::VERTEX_1);
157     fitInt.addTrack(s2.track(),2,s2.mass(),mithep::MultiVertexFitterD::VERTEX_1);
158 mrudolph 1.3
159    
160     if (fit.fit()){
161    
162     DecayPart *d = new DecayPart(oPid_,DecayPart::Fast);
163 bendavid 1.5
164     // Update temporarily some of the quantities (prob, chi2, nDoF, mass, lxy, pt, fourMomentum)
165     d->setProb(fit.prob());
166     d->setChi2(fit.chisq());
167     d->setNdof(fit.ndof());
168    
169     FourVector p4Fitted(0.,0.,0.,0.);
170     p4Fitted += fit.getTrackP4(1);
171     p4Fitted += fit.getTrackP4(2);
172     d->setFourMomentum(p4Fitted);
173 paus 1.10 d->setPosition (fit.getVertex (MultiVertexFitterD::VERTEX_1));
174     d->setError (fit.getErrorMatrix(MultiVertexFitterD::VERTEX_1));
175 bendavid 1.5 float mass, massErr;
176     const int trksIds[2] = { 1, 2 };
177     mass = fit.getMass(2,trksIds,massErr);
178    
179     ThreeVector p3Fitted(p4Fitted.px(), p4Fitted.py(), p4Fitted.pz());
180    
181     //Get decay length in xy plane
182     float dl, dlErr;
183 paus 1.10 dl = fit.getDecayLength (MultiVertexFitterD::PRIMARY_VERTEX, MultiVertexFitterD::VERTEX_1,
184     p3Fitted, dlErr);
185 bendavid 1.5
186     //Get Z decay length
187     float dlz, dlzErr;
188 paus 1.10 dlz = fit.getZDecayLength(MultiVertexFitterD::PRIMARY_VERTEX, MultiVertexFitterD::VERTEX_1,
189     p3Fitted, dlzErr);
190 bendavid 1.5
191     //get impact parameter
192     float dxy, dxyErr;
193 paus 1.10 dxy = fit.getImpactPar (MultiVertexFitterD::PRIMARY_VERTEX, MultiVertexFitterD::VERTEX_1,
194     p3Fitted, dxyErr);
195 bendavid 1.5
196 bendavid 1.8 BasePartPtr ptr1(hStables1,i);
197     BasePartPtr ptr2(hStables2,j);
198    
199 paus 1.10 StableData c1(fit.getTrackP4(1).px(),fit.getTrackP4(1).py(), fit.getTrackP4(1).pz(), ptr1);
200     StableData c2(fit.getTrackP4(2).px(),fit.getTrackP4(2).py(), fit.getTrackP4(2).pz(), ptr2);
201 bendavid 1.8
202 paus 1.10 const ThreeVector vtxPos = fit.getVertex(MultiVertexFitterD::VERTEX_1);
203     const ThreeVector trkMom1(fit.getTrackP4(1).px(),fit.getTrackP4(1).py(),
204     fit.getTrackP4(1).pz());
205     const ThreeVector trkMom2(fit.getTrackP4(2).px(),fit.getTrackP4(2).py(),
206     fit.getTrackP4(2).pz());
207 bendavid 1.8
208     //build corrected HitPattern for StableData, removing hits before the fit vertex
209 bendavid 1.11 if (useHitDropper_) {
210 bendavid 1.14 reco::HitPattern hits1 = dropper->CorrectedHitsAOD(s1.track(),
211 loizides 1.12 vtxPos,
212     trkMom1,
213     dlErr,
214     dlzErr);
215 bendavid 1.14 reco::HitPattern hits2 = dropper->CorrectedHitsAOD(s2.track(),
216 loizides 1.12 vtxPos,
217     trkMom2,
218     dlErr,
219     dlzErr);
220 bendavid 1.11
221     c1.SetHits(hits1);
222     c2.SetHits(hits2);
223     c1.SetHitsFilled();
224     c2.SetHitsFilled();
225     }
226 bendavid 1.8
227 paus 1.10 d->addStableChild (c1);
228     d->addStableChild (c2);
229     d->setFittedMass (mass);
230 bendavid 1.5 d->setFittedMassError(massErr);
231 paus 1.10 d->setLxy (dl);
232     d->setLxyError (dlErr);
233     d->setLxyToPv (dl);
234     d->setLxyToPvError (dlErr);
235     d->setLz (dlz);
236     d->setLzError (dlzErr);
237     d->setLzToPv (dlz);
238     d->setLzToPvError (dlzErr);
239     d->setDxy (dxy);
240     d->setDxyError (dxyErr);
241     d->setDxyToPv (dxy);
242     d->setDxyToPvError (dxyErr);
243    
244 loizides 1.12 // put the result into our collection
245 mrudolph 1.3 pD->push_back(*d);
246 loizides 1.13 delete d;
247 mrudolph 1.3 } //done processing fit
248 loizides 1.7 } //end j loop
249 mrudolph 1.3 } //end i loop
250    
251     // -----------------------------------------------------------------------------------------------
252     // Write the collection even if it is empty
253     // -----------------------------------------------------------------------------------------------
254 loizides 1.7 if (0)
255     cout << " V2SS::produce - " << pD->size() << " entries collection created -"
256     << " (Pid: " << oPid_ << ")\n";
257 mrudolph 1.3 evt.put(pD);
258     }
259    
260 loizides 1.12 // define this as a plug-in
261 mrudolph 1.3 DEFINE_FWK_MODULE(ProducerV2SS);