ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitEdm/Producers/src/ProducerConversions.cc
Revision: 1.6
Committed: Tue Sep 30 12:59:14 2008 UTC (16 years, 7 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_004
Changes since 1.5: +92 -27 lines
Log Message:
updated producer for changes to DecayPart and added primary vertex

File Contents

# User Rev Content
1 bendavid 1.6 // $Id: ProducerConversions.cc,v 1.5 2008/09/27 05:48:25 loizides Exp $
2 bendavid 1.1
3 loizides 1.5 #include "MitEdm/Producers/interface/ProducerConversions.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.6 #include "DataFormats/VertexReco/interface/Vertex.h"
8     #include "DataFormats/VertexReco/interface/VertexFwd.h"
9 bendavid 1.1 #include "MitEdm/DataFormats/interface/Types.h"
10 loizides 1.5 #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.6 #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     using namespace mithep;
21    
22     //--------------------------------------------------------------------------------------------------
23     ProducerConversions::ProducerConversions(const ParameterSet& cfg) :
24 loizides 1.5 BaseCandProducer(cfg),
25     iStables1_(cfg.getUntrackedParameter<string>("iStables1","")),
26     iStables2_(cfg.getUntrackedParameter<string>("iStables2","")),
27 bendavid 1.6 iPVertexes_(cfg.getUntrackedParameter<string>("iPVertexes","offlinePrimaryVerticesWithBS")),
28     usePVertex_(cfg.getUntrackedParameter<bool>("usePVertex",true)),
29 loizides 1.5 convConstraint_(cfg.getUntrackedParameter<bool>("convConstraint",false)),
30     convConstraint3D_(cfg.getUntrackedParameter<bool>("convConstraint3D",true)),
31     rhoMin_(cfg.getUntrackedParameter<double>("rhoMin",0.0))
32 bendavid 1.1 {
33 loizides 1.5 // Constructor.
34    
35 bendavid 1.1 produces<DecayPartCol>();
36     }
37    
38     //--------------------------------------------------------------------------------------------------
39     ProducerConversions::~ProducerConversions()
40     {
41 loizides 1.5 // Destructor.
42 bendavid 1.1 }
43    
44     //--------------------------------------------------------------------------------------------------
45     void ProducerConversions::produce(Event &evt, const EventSetup &setup)
46     {
47 loizides 1.5 // Produce our DecayPartCol.
48    
49 bendavid 1.1 // First input collection
50     Handle<StablePartCol> hStables1;
51     if (!GetProduct(iStables1_, hStables1, evt))
52     return;
53     const StablePartCol *pS1 = hStables1.product();
54     // Second input collection
55     Handle<StablePartCol> hStables2;
56     if (!GetProduct(iStables2_, hStables2, evt))
57     return;
58     const StablePartCol *pS2 = hStables2.product();
59    
60 bendavid 1.6 const reco::Vertex *vertex = 0;
61     mitedm::VertexPtr vPtr;
62     if (usePVertex_) {
63     // Primary vertex collection
64     Handle<reco::VertexCollection> hVertexes;
65     if (!GetProduct(iPVertexes_, hVertexes, evt))
66     return;
67     const reco::VertexCollection *pV = hVertexes.product();
68    
69     //Choose the primary vertex with the largest number of tracks
70     UInt_t maxTracks=0;
71     for (UInt_t i=0; i<pV->size(); ++i) {
72     const reco::Vertex &v = pV->at(i);
73     UInt_t nTracks = v.tracksSize();
74     if (nTracks >= maxTracks) {
75     maxTracks = nTracks;
76     vertex = &v;
77     vPtr = mitedm::VertexPtr(hVertexes,i);
78     }
79     }
80     }
81    
82 bendavid 1.1 // Create the output collection
83     auto_ptr<DecayPartCol> pD(new DecayPartCol());
84 bendavid 1.6
85 bendavid 1.1 // Simple double loop
86     for (UInt_t i = 0; i<pS1->size(); ++i) {
87     const StablePart &s1 = pS1->at(i);
88    
89     UInt_t j;
90     if (iStables1_ == iStables2_)
91     j = i+1;
92     else
93     j = 0;
94    
95     for (; j<pS2->size(); ++j) {
96     const StablePart &s2 = pS2->at(j);
97    
98     // Vertex fit now, possibly with conversion constraint
99     MultiVertexFitter fit;
100 loizides 1.5 fit.init(3.8); // Reset to the MC magnetic field of 3.8 Tesla
101 bendavid 1.1 MvfInterface fitInt(&fit);
102     fitInt.addTrack(s1.track(),1,s1.mass(),MultiVertexFitter::VERTEX_1);
103     fitInt.addTrack(s2.track(),2,s2.mass(),MultiVertexFitter::VERTEX_1);
104 bendavid 1.3 if (convConstraint3D_) {
105     fit.conversion_3d(MultiVertexFitter::VERTEX_1);
106     //printf("applying 3d conversion constraint\n");
107     }
108     else if (convConstraint_) {
109     fit.conversion_2d(MultiVertexFitter::VERTEX_1);
110     //printf("applying 2d conversion constraint\n");
111     }
112 bendavid 1.6 //initialize primary vertex parameters in the fitter
113     if (usePVertex_) {
114     float vErr[3][3];
115     for (UInt_t vi=0; vi<3; ++vi)
116     for (UInt_t vj=0; vj<3; ++vj)
117     vErr[vi][vj] = vertex->covariance(vi,vj);
118    
119     fit.setPrimaryVertex(vertex->x(),vertex->y(),vertex->z());
120     fit.setPrimaryVertexError(vErr);
121     }
122    
123     //only perform fit for oppositely-charged tracks
124     int trackCharge = s1.track()->charge() + s2.track()->charge();
125     int fitStatus = 0;
126     if (trackCharge==0)
127     fitStatus = fit.fit();
128    
129     if (fitStatus) {
130 bendavid 1.3 DecayPart *d = new DecayPart(oPid_,DecayPart::Fast);
131 bendavid 1.1
132 bendavid 1.4 BasePartPtr ptr1(hStables1,i);
133     BasePartPtr ptr2(hStables2,j);
134 bendavid 1.6
135     StableData c1(fit.getTrackP4(1).px(),fit.getTrackP4(1).py(), fit.getTrackP4(1).pz(), ptr1);
136     StableData c2(fit.getTrackP4(2).px(),fit.getTrackP4(2).py(), fit.getTrackP4(2).pz(), ptr2);
137    
138     d->addStableChild(c1);
139     d->addStableChild(c2);
140    
141 bendavid 1.3 // Update temporarily some of the quantities (prob, chi2, nDoF, mass, lxy, pt, fourMomentum)
142     d->setProb(fit.prob());
143     d->setChi2(fit.chisq());
144     d->setNdof(fit.ndof());
145    
146     FourVector p4Fitted(0.,0.,0.,0.);
147     p4Fitted += fit.getTrackP4(1);
148     p4Fitted += fit.getTrackP4(2);
149     d->setFourMomentum(p4Fitted);
150     d->setPosition(fit.getVertex (MultiVertexFitter::VERTEX_1));
151     d->setError (fit.getErrorMatrix(MultiVertexFitter::VERTEX_1));
152     float mass, massErr;
153     const int trksIds[2] = { 1, 2 };
154     mass = fit.getMass(2,trksIds,massErr);
155    
156 bendavid 1.6 ThreeVector p3Fitted(p4Fitted.px(), p4Fitted.py(), p4Fitted.pz());
157    
158     //Get decay length in xy plane
159     float dl, dlErr;
160     dl = fit.getDecayLength(MultiVertexFitter::PRIMARY_VERTEX, MultiVertexFitter::VERTEX_1,
161     p3Fitted, dlErr);
162    
163     //Get Z decay length
164     float dlz, dlzErr;
165     dlz = fit.getZDecayLength(MultiVertexFitter::PRIMARY_VERTEX, MultiVertexFitter::VERTEX_1,
166     p3Fitted, dlzErr);
167    
168     //get impact parameter
169     float dxy, dxyErr;
170     dxy = fit.getImpactPar(MultiVertexFitter::PRIMARY_VERTEX, MultiVertexFitter::VERTEX_1,
171     p3Fitted, dxyErr);
172 bendavid 1.1
173 bendavid 1.6 d->setFittedMass (mass);
174     d->setFittedMassError(massErr);
175    
176     d->setLxy(dl);
177     d->setLxyError(dlErr);
178     d->setLxyToPv(dl);
179     d->setLxyToPvError(dlErr);
180    
181     d->setLz(dlz);
182     d->setLzError(dlzErr);
183     d->setLzToPv(dlz);
184     d->setLzToPvError(dlzErr);
185    
186     d->setDxy(dxy);
187     d->setDxyError(dxyErr);
188     d->setDxyToPv(dxy);
189     d->setDxyToPvError(dxyErr);
190    
191     if (usePVertex_)
192     d->setPrimaryVertex(vPtr);
193    
194     // Put the result into our collection
195 bendavid 1.1 if (d->position().rho() > rhoMin_)
196 bendavid 1.3 pD->push_back(*d);
197 loizides 1.5
198 bendavid 1.1 delete d;
199     }
200     }
201     }
202    
203     // Write the collection even if it is empty
204 loizides 1.5 if (0) {
205     cout << " ProducerConversions::produce - " << pD->size() << " entries collection created -"
206     << " (Pid: " << oPid_ << ")\n";
207     }
208 bendavid 1.1 evt.put(pD);
209     }
210    
211     //define this as a plug-in
212     DEFINE_FWK_MODULE(ProducerConversions);