ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitEdm/Producers/src/ProducerV2SS.cc
Revision: 1.19
Committed: Fri Dec 11 17:46:24 2009 UTC (15 years, 5 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_012f, Mit_012e
Changes since 1.18: +5 -13 lines
Log Message:
Remove track quality cuts, which do not really belong here

File Contents

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