ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Morgan/src/ZeeVertexAnalyzer.cc
Revision: 1.1
Committed: Sat Oct 10 20:35:19 2009 UTC (15 years, 6 months ago) by lethuill
Content type: text/plain
Branch: MAIN
Log Message:
Add private primary vertex reconstruction for Zee events

File Contents

# User Rev Content
1 lethuill 1.1 #include "../interface/ZeeVertexAnalyzer.h"
2    
3     using namespace std;
4     using namespace reco;
5     using namespace edm;
6    
7     ZeeVertexAnalyzer::ZeeVertexAnalyzer(const edm::ParameterSet& iConfig, const edm::ParameterSet& producersNames, int verbosity):verbosity_(verbosity), config_(iConfig)
8     {
9     allowMissingCollection_ = producersNames.getUntrackedParameter<bool>("allowMissingCollection", false);
10     primaryVertexProducer_ = producersNames.getParameter<edm::InputTag>("primaryVertexProducer");
11     beamSpotProducer_ = producersNames.getParameter<edm::InputTag>("beamSpotProducer");
12     trackProducer_ = producersNames.getParameter<edm::InputTag>("trackProducer");
13     electronProducer_ = producersNames.getParameter<edm::InputTag>("electronProducer");
14     }
15    
16    
17     ZeeVertexAnalyzer::~ZeeVertexAnalyzer()
18     {
19     }
20    
21    
22     bool ZeeVertexAnalyzer::getVertices(const edm::Event& iEvent, const edm::EventSetup& iSetup, TClonesArray* rootVertices)
23     {
24     using namespace edm;
25     int iRootVertex = 0;
26    
27     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
28     // Very simple Zee selection: at least 2 electrons pT>10 GeV, |eta|<2.5, 60 < Mee < 120
29     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
30    
31     edm::Handle< reco::GsfElectronCollection > electrons;
32     iEvent.getByLabel(electronProducer_, electrons);
33     int nElectrons = electrons->size();
34    
35     if(verbosity_>4) std::cout << std::endl << " Number of electrons = " << nElectrons << " (" << electronProducer_.label() << " producer)" << std::endl;
36     if(nElectrons<2) return false;
37    
38     // Highest ET electron
39     Float_t maxPt = 0;
40     unsigned int iElectron1 = 999999;
41     for (unsigned int j=0; j<electrons->size(); j++)
42     {
43     const reco::GsfElectron* electron = & (electrons->at(j));
44     if ( electron->pt() > maxPt && abs(electron->eta()) < 2.5 )
45     {
46     maxPt = electron->pt();
47     iElectron1 = j;
48     }
49     }
50     if(iElectron1==999999) return false;
51    
52    
53     // Second highest ET electron
54     maxPt = 0;
55     unsigned int iElectron2 = 999999;
56     for (unsigned int j=0; j<electrons->size(); j++)
57     {
58     const reco::GsfElectron* electron = & (electrons->at(j));
59     if ( electron->pt() > maxPt && abs(electron->eta()) < 2.5 && j!=iElectron1 )
60     {
61     maxPt = electron->pt();
62     iElectron2 = j;
63     }
64     }
65     if(iElectron2==999999) return false;
66    
67    
68     // Z mass
69     ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > p4Electron1= (electrons->at(iElectron1)).p4();
70     ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > p4Electron2= (electrons->at(iElectron2)).p4();
71     ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double> > p4Z = p4Electron1 + p4Electron2;
72    
73     if(verbosity_>4) std::cout << " Electron 1 - (Et,eta,phi)=(" << electrons->at(iElectron1).pt() << "," << electrons->at(iElectron1).eta() << "," << electrons->at(iElectron1).phi() << ")" << std::endl;
74     if(verbosity_>4) std::cout << " Electron 2 - (Et,eta,phi)=(" << electrons->at(iElectron2).pt() << "," << electrons->at(iElectron2).eta() << "," << electrons->at(iElectron2).phi() << ")" << std::endl;
75     if(verbosity_>4) std::cout << " Mee=" << p4Z.mass() << std::endl;
76    
77     if( p4Z.mass()<60.0 || p4Z.mass()>120.0) return false;
78    
79     // Find CTF track best matching the GSF track assoicated to the electron
80     // We will remove these tracks in the track collection for the primary vertex reconstruction
81     reco::TrackRef tk1 = (electrons->at(iElectron1)).closestCtfTrackRef();
82     reco::TrackRef tk2 = (electrons->at(iElectron2)).closestCtfTrackRef();
83     if(verbosity_>4) std::cout << " CTF Track 1 - (Et,eta,phi)=(" << tk1->pt() << "," << tk1->eta() << "," << tk1->phi() << ") - Fraction of common hits with GSF =" << (electrons->at(iElectron1)).shFracInnerHits() << std::endl;
84     if(verbosity_>4) std::cout << " CTF Track 2 - (Et,eta,phi)=(" << tk2->pt() << "," << tk2->eta() << "," << tk2->phi() << ") - Fraction of common hits with GSF =" << (electrons->at(iElectron2)).shFracInnerHits() << std::endl;
85    
86    
87     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
88     // Private Primary Vertex reconstruction with all CTF tracks
89     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
90    
91     // Get BeamSpot
92     reco::BeamSpot vertexBeamSpot;
93     edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
94     iEvent.getByLabel(beamSpotProducer_, recoBeamSpotHandle);
95     if (recoBeamSpotHandle.isValid()) vertexBeamSpot = *recoBeamSpotHandle;
96    
97     // Get Track Collection
98     edm::Handle<reco::TrackCollection> recoTracks;
99     iEvent.getByLabel(trackProducer_, recoTracks);
100    
101     // Get Transient Track Collection
102     edm::ESHandle<TransientTrackBuilder> trackBuilder;
103     iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",trackBuilder);
104     vector<reco::TransientTrack> transientTracks = (*trackBuilder).build(recoTracks, vertexBeamSpot);
105    
106     // Call Primary Vertex Reconstruction using all tracks in the event
107     PrimaryVertexProducerAlgorithm theVertexProducer(config_);
108     vector<TransientVertex> transientZeeVertices = theVertexProducer.vertices(transientTracks, vertexBeamSpot);
109    
110     reco::VertexCollection zeeVertices;
111     for (vector<TransientVertex>::const_iterator vertex = transientZeeVertices.begin(); vertex != transientZeeVertices.end(); vertex++)
112     {
113     reco::Vertex v = *vertex;
114     zeeVertices.push_back(v);
115     }
116    
117     if(verbosity_>4) std::cout << std::endl << " Private Primary Vertex reconstruction with all tracks - Number of vertices = " << zeeVertices.size() << std::endl;
118    
119     for (unsigned int j=0; j<zeeVertices.size(); j++)
120     {
121     reco::Vertex* vertex = & (zeeVertices.at(j));
122    
123     // Put your vertex selection here....
124     if (! vertex->isValid() ) continue;
125     if ( vertex->isFake() ) continue;
126    
127     Int_t ntracks = 0;
128     Float_t higherPt = 0.;
129     Float_t scalarSumPt = 0.;
130     Float_t vectorSumPt = 0.;
131     math::XYZVector vectorSum(0.,0.,0.);
132    
133     for( std::vector< reco::TrackBaseRef >::const_iterator it = vertex->tracks_begin(); it != vertex->tracks_end(); it++)
134     {
135     scalarSumPt += (**it).pt();
136     vectorSum += (**it).momentum();
137     if( (**it).pt()>higherPt ) higherPt=(**it).pt();
138     ntracks++;
139     }
140     vectorSumPt = sqrt(vectorSum.Perp2());
141    
142     // No refitted tracks embeded in reco::Vertex....
143     //cout << "vertex->refittedTracks().size()=" << vertex->refittedTracks().size() << endl;
144    
145     TRootVertex localVertex(
146     vertex->x()
147     ,vertex->y()
148     ,vertex->z()
149     ,vertex->xError()
150     ,vertex->yError()
151     ,vertex->zError()
152     );
153    
154     localVertex.setAlgoName("AllTracks");
155     localVertex.setChi2( vertex->chi2() );
156     localVertex.setNdof( vertex->ndof() );
157     localVertex.setNtracks( ntracks );
158     localVertex.setHigherTrackPt( higherPt );
159     localVertex.setScalarSumPt( scalarSumPt );
160     localVertex.setVectorSumPt( vectorSumPt );
161    
162     new( (*rootVertices)[iRootVertex] ) TRootVertex(localVertex);
163     if(verbosity_>2) cout << " ["<< setw(3) << iRootVertex << "] " << localVertex << endl;
164     iRootVertex++;
165     }
166    
167    
168     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
169     // Private Primary Vertex reconstruction with all CTF tracks except the 2 two tracks matching selected electrons
170     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
171    
172     // Remove the two CTF tracks matching the two electron GSF tracks from the track collection
173     unsigned int itk1 = 999999;
174     unsigned int itk2 = 999999;
175     for (unsigned int j=0; j<transientTracks.size(); j++)
176     {
177     const reco::Track* tk = & (transientTracks.at(j).track());
178     if(verbosity_>5) std::cout << " Tk[" << j << "] (Et,eta,phi)=(" << tk->pt() << "," << tk->eta() << "," << tk->phi() << ")" << std::endl;
179     if ( tk->pt()==tk1->pt() && tk->eta()==tk1->eta() && tk->phi()==tk1->phi() )
180     {
181     itk1 = j;
182     if(verbosity_>5) std::cout << " ===> this is tk1" << std::endl;
183     }
184     if ( tk->pt()==tk2->pt() && tk->eta()==tk2->eta() && tk->phi()==tk2->phi() )
185     {
186     itk2 = j;
187     if(verbosity_>5) std::cout << " ===> this is tk2" << std::endl;
188     }
189     }
190     if (itk1==999999 || itk2==999999)
191     {
192     std::cout << " ***** NO CTF TRACKS MATCHING THE ELECTRON *****" << std::endl;
193     return false;
194     }
195    
196     if (itk1<itk2) itk2--;
197     transientTracks.erase (transientTracks.begin()+itk1);
198     transientTracks.erase (transientTracks.begin()+itk2);
199    
200     if(verbosity_>5)
201     {
202     for (unsigned int j=0; j<transientTracks.size(); j++)
203     {
204     const reco::Track* tk = & (transientTracks.at(j).track());
205     std::cout << " New Tk[" << j << "] (Et,eta,phi)=(" << tk->pt() << "," << tk->eta() << "," << tk->phi() << ")" << std::endl;
206     }
207     }
208    
209     // Call Primary Vertex Reconstruction using all tracks in the event except the two electrons
210     vector<TransientVertex> transientNoEEVertices = theVertexProducer.vertices(transientTracks, vertexBeamSpot);
211    
212     reco::VertexCollection noEEVertices;
213     for (vector<TransientVertex>::const_iterator vertex = transientNoEEVertices.begin(); vertex != transientNoEEVertices.end(); vertex++)
214     {
215     reco::Vertex v = *vertex;
216     noEEVertices.push_back(v);
217     }
218    
219     if(verbosity_>4) std::cout << std::endl << " Private Primary Vertex reconstruction with all tracks except the two electrons - Number of vertices = " << noEEVertices.size() << std::endl;
220    
221     for (unsigned int j=0; j<noEEVertices.size(); j++)
222     {
223     reco::Vertex* vertex = & (noEEVertices.at(j));
224    
225     // Put your vertex selection here....
226     if (! vertex->isValid() ) continue;
227     if ( vertex->isFake() ) continue;
228    
229     Int_t ntracks = 0;
230     Float_t higherPt = 0.;
231     Float_t scalarSumPt = 0.;
232     Float_t vectorSumPt = 0.;
233     math::XYZVector vectorSum(0.,0.,0.);
234    
235     for( std::vector< reco::TrackBaseRef >::const_iterator it = vertex->tracks_begin(); it != vertex->tracks_end(); it++)
236     {
237     scalarSumPt += (**it).pt();
238     vectorSum += (**it).momentum();
239     if( (**it).pt()>higherPt ) higherPt=(**it).pt();
240     ntracks++;
241     }
242     vectorSumPt = sqrt(vectorSum.Perp2());
243    
244     // No refitted tracks embeded in reco::Vertex....
245     //cout << "vertex->refittedTracks().size()=" << vertex->refittedTracks().size() << endl;
246    
247     TRootVertex localVertex(
248     vertex->x()
249     ,vertex->y()
250     ,vertex->z()
251     ,vertex->xError()
252     ,vertex->yError()
253     ,vertex->zError()
254     );
255    
256     localVertex.setAlgoName("NoEE");
257     localVertex.setChi2( vertex->chi2() );
258     localVertex.setNdof( vertex->ndof() );
259     localVertex.setNtracks( ntracks );
260     localVertex.setHigherTrackPt( higherPt );
261     localVertex.setScalarSumPt( scalarSumPt );
262     localVertex.setVectorSumPt( vectorSumPt );
263    
264     new( (*rootVertices)[iRootVertex] ) TRootVertex(localVertex);
265     if(verbosity_>2) cout << " ["<< setw(3) << iRootVertex << "] " << localVertex << endl;
266     iRootVertex++;
267     }
268    
269     return true;
270     }
271