ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitEdm/Producers/src/ProducerV2SS.cc
Revision: 1.15
Committed: Mon Nov 2 22:56:18 2009 UTC (15 years, 6 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_012b, Mit_012a, Mit_012
Changes since 1.14: +9 -2 lines
Log Message:
Use magnetic field from event setup instead of hardcoded 3.8T

File Contents

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