ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerElectrons.cc
Revision: 1.58
Committed: Fri May 20 16:52:37 2011 UTC (13 years, 11 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_025a, Mit_025, Mit_025pre2, Mit_024b, Mit_025pre1, Mit_024a, Mit_024, Mit_023, Mit_022a, Mit_022, Mit_021
Changes since 1.57: +93 -71 lines
Log Message:
Add muon kink and electron,muon unbiased ip variables

File Contents

# Content
1 // $Id: FillerElectrons.cc,v 1.57 2011/05/20 16:19:31 ksung Exp $
2
3 #include "MitProd/TreeFiller/interface/FillerElectrons.h"
4 #include "DataFormats/TrackReco/interface/Track.h"
5 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
6 #include "DataFormats/TrackReco/interface/TrackFwd.h"
7 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
8 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
9 #include "DataFormats/EgammaReco/interface/ClusterShape.h"
10 #include "DataFormats/EgammaReco/interface/BasicClusterShapeAssociation.h"
11 #include "DataFormats/Common/interface/RefToPtr.h"
12 #include "DataFormats/Common/interface/ValueMap.h"
13 #include "AnalysisDataFormats/Egamma/interface/ElectronID.h"
14 #include "AnalysisDataFormats/Egamma/interface/ElectronIDAssociation.h"
15 #include "RecoEgamma/EgammaIsolationAlgos/interface/ElectronTkIsolation.h"
16 #include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaEcalIsolation.h"
17 #include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaTowerIsolation.h"
18 #include "RecoEcal/EgammaCoreTools/interface/EcalClusterLazyTools.h"
19 #include "DataFormats/VertexReco/interface/VertexFwd.h"
20 #include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h"
21 #include "TrackingTools/TransientTrack/plugins/TransientTrackBuilderESProducer.h"
22 #include "RecoVertex/GaussianSumVertexFit/interface/GsfVertexTrackCompatibilityEstimator.h"
23 #include "TrackingTools/IPTools/interface/IPTools.h"
24 #include "RecoEgamma/EgammaTools/interface/ConversionFinder.h"
25 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
26 #include "MagneticField/Engine/interface/MagneticField.h"
27 #include "MitAna/DataTree/interface/ElectronCol.h"
28 #include "MitAna/DataTree/interface/Names.h"
29 #include "MitAna/DataTree/interface/Track.h"
30 #include "MitEdm/DataFormats/interface/RefToBaseToPtr.h"
31 #include "MitProd/ObjectService/interface/ObjectService.h"
32 #include "MitEdm/DataFormats/interface/DecayPart.h"
33 #include "MitEdm/ConversionRejection/interface/ConversionMatcher.h"
34 #include "RecoVertex/VertexTools/interface/LinearizedTrackStateFactory.h"
35 #include "RecoVertex/VertexTools/interface/VertexTrackFactory.h"
36 #include "RecoVertex/VertexPrimitives/interface/VertexTrack.h"
37 #include "RecoVertex/VertexPrimitives/interface/CachingVertex.h"
38 #include "RecoVertex/KalmanVertexFit/interface/KalmanVertexUpdator.h"
39 #include "MitEdm/Tools/interface/VertexReProducer.h"
40
41 using namespace std;
42 using namespace edm;
43 using namespace mithep;
44
45 //--------------------------------------------------------------------------------------------------
46 FillerElectrons::FillerElectrons(const edm::ParameterSet &cfg, const char *name, bool active) :
47 BaseFiller(cfg,name,active),
48 edmName_(Conf().getUntrackedParameter<string>("edmName","pixelMatchGsfElectrons")),
49 expectedHitsName_(Conf().getUntrackedParameter<string>("expectedHitsName","")),
50 mitName_(Conf().getUntrackedParameter<string>("mitName",Names::gkElectronBrn)),
51 gsfTrackMapName_(Conf().getUntrackedParameter<string>("gsfTrackMapName","")),
52 trackerTrackMapName_(Conf().getUntrackedParameter<string>("trackerTrackMapName","")),
53 barrelSuperClusterMapName_(Conf().getUntrackedParameter<string>("barrelSuperClusterMapName","")),
54 endcapSuperClusterMapName_(Conf().getUntrackedParameter<string>("endcapSuperClusterMapName","")),
55 pfSuperClusterMapName_(Conf().getUntrackedParameter<string>("pfSuperClusterMapName","")),
56 eIDCutBasedTightName_(Conf().getUntrackedParameter<string>("eIDCutBasedTightName","eidTight")),
57 eIDCutBasedLooseName_(Conf().getUntrackedParameter<string>("eIDCutBasedLooseName","eidLoose")),
58 eIDLikelihoodName_(Conf().getUntrackedParameter<string>("eIDLikelihoodName","")),
59 pvEdmName_(Conf().getUntrackedParameter<string>("pvEdmName","offlinePrimaryVertices")),
60 pvBSEdmName_(Conf().getUntrackedParameter<string>("pvBSEdmName","offlinePrimaryVerticesWithBS")),
61 recomputeConversionInfo_(Conf().getUntrackedParameter<bool>("recomputeConversionInfo",false)),
62 electrons_(new mithep::ElectronArr(16)),
63 gsfTrackMap_(0),
64 trackerTrackMap_(0),
65 barrelSuperClusterMap_(0),
66 endcapSuperClusterMap_(0)
67 {
68 // Constructor.
69 }
70
71 //--------------------------------------------------------------------------------------------------
72 FillerElectrons::~FillerElectrons()
73 {
74 // Destructor.
75
76 delete electrons_;
77 }
78
79 //--------------------------------------------------------------------------------------------------
80 void FillerElectrons::BookDataBlock(TreeWriter &tws)
81 {
82 // Add electron branch to our tree and get our maps.
83
84 tws.AddBranch(mitName_,&electrons_);
85 OS()->add<mithep::ElectronArr>(electrons_,mitName_);
86
87 if (!gsfTrackMapName_.empty()) {
88 gsfTrackMap_ = OS()->get<TrackMap>(gsfTrackMapName_);
89 if (gsfTrackMap_)
90 AddBranchDep(mitName_,gsfTrackMap_->GetBrName());
91 }
92 if (!trackerTrackMapName_.empty()) {
93 trackerTrackMap_ = OS()->get<TrackMap>(trackerTrackMapName_);
94 if (trackerTrackMap_)
95 AddBranchDep(mitName_,trackerTrackMap_->GetBrName());
96 }
97 if (!barrelSuperClusterMapName_.empty()) {
98 barrelSuperClusterMap_ = OS()->get<SuperClusterMap>(barrelSuperClusterMapName_);
99 if (barrelSuperClusterMap_)
100 AddBranchDep(mitName_,barrelSuperClusterMap_->GetBrName());
101 }
102 if (!endcapSuperClusterMapName_.empty()) {
103 endcapSuperClusterMap_ = OS()->get<SuperClusterMap>(endcapSuperClusterMapName_);
104 if (endcapSuperClusterMap_)
105 AddBranchDep(mitName_,endcapSuperClusterMap_->GetBrName());
106 }
107 if (!pfSuperClusterMapName_.empty()) {
108 pfSuperClusterMap_ = OS()->get<SuperClusterMap>(pfSuperClusterMapName_);
109 if (pfSuperClusterMap_)
110 AddBranchDep(mitName_,pfSuperClusterMap_->GetBrName());
111 }
112 }
113
114 //--------------------------------------------------------------------------------------------------
115 void FillerElectrons::FillDataBlock(const edm::Event &event, const edm::EventSetup &setup)
116 {
117 // Fill electrons from edm collection into our collection.
118
119 electrons_->Delete();
120
121 Handle<reco::GsfElectronCollection> hElectronProduct;
122 GetProduct(edmName_, hElectronProduct, event);
123
124 // handles to get the electron ID information
125 Handle<edm::ValueMap<float> > eidLooseMap;
126 GetProduct(eIDCutBasedLooseName_, eidLooseMap, event);
127 Handle<edm::ValueMap<float> > eidTightMap;
128 GetProduct(eIDCutBasedTightName_, eidTightMap, event);
129 edm::Handle<edm::ValueMap<float> > eidLikelihoodMap;
130 if (!eIDLikelihoodName_.empty()) {
131 GetProduct(eIDLikelihoodName_, eidLikelihoodMap, event);
132 }
133
134 edm::Handle<reco::VertexCollection> hVertex;
135 event.getByLabel(pvEdmName_, hVertex);
136 const reco::VertexCollection *pvCol = hVertex.product();
137
138 edm::Handle<reco::VertexCollection> hVertexBS;
139 event.getByLabel(pvBSEdmName_, hVertexBS);
140 const reco::VertexCollection *pvBSCol = hVertexBS.product();
141
142 edm::Handle<reco::TrackCollection> hGeneralTracks;
143 event.getByLabel("generalTracks", hGeneralTracks);
144 //const reco::VertexCollection *trackCol = hGeneralTracks.product();
145
146 edm::Handle<reco::GsfTrackCollection> hGsfTracks;
147 event.getByLabel("electronGsfTracks", hGsfTracks);
148
149 edm::Handle<std::vector<mitedm::DecayPart> > hConversions;
150 event.getByLabel("mvfConversionRemoval", hConversions);
151
152 mitedm::ConversionMatcher convMatcher;
153
154 edm::ESHandle<TransientTrackBuilder> hTransientTrackBuilder;
155 setup.get<TransientTrackRecord>().get("TransientTrackBuilder",hTransientTrackBuilder);
156 const TransientTrackBuilder *transientTrackBuilder = hTransientTrackBuilder.product();
157
158 GsfVertexTrackCompatibilityEstimator gsfEstimator;
159
160 LinearizedTrackStateFactory lTrackFactory;
161 VertexTrackFactory<5> vTrackFactory;
162 KalmanVertexUpdator<5> updator;
163
164 //Get Magnetic Field from event setup, taking value at (0,0,0)
165 edm::ESHandle<MagneticField> magneticField;
166 setup.get<IdealMagneticFieldRecord>().get(magneticField);
167 const double bfield = magneticField->inTesla(GlobalPoint(0.,0.,0.)).z();
168
169 const reco::GsfElectronCollection inElectrons = *(hElectronProduct.product());
170 // loop over electrons
171 for (reco::GsfElectronCollection::const_iterator iM = inElectrons.begin();
172 iM != inElectrons.end(); ++iM) {
173
174 // the index and Ref are needed for the eID association Map
175 unsigned int iElectron = iM - inElectrons.begin();
176 reco::GsfElectronRef eRef(hElectronProduct, iElectron);
177
178 mithep::Electron *outElectron = electrons_->AddNew();
179
180 outElectron->SetPtEtaPhi(iM->pt(),iM->eta(),iM->phi());
181
182 outElectron->SetCharge(iM->charge());
183 outElectron->SetScPixCharge(iM->scPixCharge());
184
185 outElectron->SetESuperClusterOverP(iM->eSuperClusterOverP());
186 outElectron->SetESeedClusterOverPout(iM->eSeedClusterOverPout());
187 outElectron->SetPIn(iM->trackMomentumAtVtx().R());
188 outElectron->SetPOut(iM->trackMomentumOut().R());
189 outElectron->SetDeltaEtaSuperClusterTrackAtVtx(iM->deltaEtaSuperClusterTrackAtVtx());
190 outElectron->SetDeltaEtaSeedClusterTrackAtCalo(iM->deltaEtaSeedClusterTrackAtCalo());
191 outElectron->SetDeltaPhiSuperClusterTrackAtVtx(iM->deltaPhiSuperClusterTrackAtVtx());
192 outElectron->SetDeltaPhiSeedClusterTrackAtCalo(iM->deltaPhiSeedClusterTrackAtCalo());
193 outElectron->SetIsEnergyScaleCorrected(iM->isEnergyScaleCorrected());
194 //outElectron->SetIsMomentumCorrected(iM->isMomentumCorrected());
195 outElectron->SetNumberOfClusters(iM->basicClustersSize());
196 outElectron->SetClassification(iM->classification());
197 outElectron->SetFBrem(iM->fbrem());
198
199 // pflow electron stuff
200 outElectron->SetIsEcalDriven(iM->ecalDrivenSeed());
201 outElectron->SetIsTrackerDriven(iM->trackerDrivenSeed());
202 outElectron->SetMva(iM->mva());
203
204 // shower shape variables
205 outElectron->SetE15(iM->e1x5());
206 outElectron->SetE25Max(iM->e2x5Max());
207 outElectron->SetE55(iM->e5x5());
208 outElectron->SetCovEtaEta(iM->sigmaEtaEta());
209 outElectron->SetCoviEtaiEta(iM->sigmaIetaIeta());
210 outElectron->SetHadronicOverEm(iM->hcalOverEcal());
211 outElectron->SetHcalDepth1OverEcal(iM->hcalDepth1OverEcal());
212 outElectron->SetHcalDepth2OverEcal(iM->hcalDepth2OverEcal());
213
214 // fill isolation variables for both cone sizes
215 outElectron->SetEcalRecHitIsoDr04(iM->dr04EcalRecHitSumEt());
216 outElectron->SetHcalDepth1TowerSumEtDr04(iM->dr04HcalDepth1TowerSumEt());
217 outElectron->SetHcalDepth2TowerSumEtDr04(iM->dr04HcalDepth2TowerSumEt());
218 outElectron->SetTrackIsolationDr04(iM->dr04TkSumPt());
219 outElectron->SetEcalRecHitIsoDr03(iM->dr03EcalRecHitSumEt());
220 outElectron->SetHcalTowerSumEtDr03(iM->dr03HcalTowerSumEt());
221 outElectron->SetHcalDepth1TowerSumEtDr03(iM->dr03HcalDepth1TowerSumEt());
222 outElectron->SetHcalDepth2TowerSumEtDr03(iM->dr03HcalDepth2TowerSumEt());
223 outElectron->SetTrackIsolationDr03(iM->dr03TkSumPt());
224
225 //pflow isolation
226 outElectron->SetPFChargedHadronIso(iM->pfIsolationVariables().chargedHadronIso);
227 outElectron->SetPFChargedHadronIso(iM->pfIsolationVariables().neutralHadronIso);
228 outElectron->SetPFChargedHadronIso(iM->pfIsolationVariables().photonIso);
229
230 // fiducial flags
231 outElectron->SetIsEB(iM->isEB());
232 outElectron->SetIsEE(iM->isEE());
233 outElectron->SetIsEBEEGap(iM->isEBEEGap());
234 outElectron->SetIsEBEtaGap(iM->isEBEtaGap());
235 outElectron->SetIsEBPhiGap(iM->isEBPhiGap());
236 outElectron->SetIsEEDeeGap(iM->isEEDeeGap());
237 outElectron->SetIsEERingGap(iM->isEERingGap());
238
239 // gsf-tracker match quality
240 outElectron->SetFracSharedHits(iM->shFracInnerHits());
241
242 // make proper links to Tracks and Super Clusters
243 if (gsfTrackMap_ && iM->gsfTrack().isNonnull()) {
244 outElectron->SetGsfTrk(gsfTrackMap_->GetMit(refToPtr(iM->gsfTrack())));
245 }
246 // make links to ambigous gsf tracks
247 if (gsfTrackMap_) {
248 for (reco::GsfTrackRefVector::const_iterator agsfi = iM->ambiguousGsfTracksBegin(); agsfi != iM->ambiguousGsfTracksEnd(); ++agsfi) {
249 outElectron->AddAmbiguousGsfTrack(gsfTrackMap_->GetMit(refToPtr(*agsfi)));
250 }
251 }
252
253 // make tracker track links,
254 if (trackerTrackMap_ && iM->closestCtfTrackRef().isNonnull()) {
255 outElectron->SetTrackerTrk(trackerTrackMap_->GetMit(refToPtr(iM->closestCtfTrackRef())));
256 }
257 if (barrelSuperClusterMap_ && endcapSuperClusterMap_ &&
258 pfSuperClusterMap_ && iM->superCluster().isNonnull()) {
259 if(barrelSuperClusterMap_->HasMit(iM->superCluster())) {
260 outElectron->SetSuperCluster(barrelSuperClusterMap_->GetMit(iM->superCluster()));
261 }
262 else if (endcapSuperClusterMap_->HasMit(iM->superCluster())) {
263 outElectron->SetSuperCluster(endcapSuperClusterMap_->GetMit(iM->superCluster()));
264 }
265 else if (pfSuperClusterMap_->HasMit(iM->superCluster())) {
266 outElectron->SetSuperCluster(pfSuperClusterMap_->GetMit(iM->superCluster()));
267 }
268 else throw edm::Exception(edm::errors::Configuration, "FillerElectrons:FillDataBlock()\n")
269 << "Error! SuperCluster reference in unmapped collection " << edmName_ << endl;
270 }
271
272 //compute impact parameter with respect to PV
273 if (iM->gsfTrack().isNonnull()) {
274 const reco::TransientTrack &tt = transientTrackBuilder->build(iM->gsfTrack());
275
276 reco::TransientTrack ttckf;
277
278 reco::Vertex thevtx = pvCol->at(0);
279 reco::Vertex thevtxbs = pvBSCol->at(0);
280
281 reco::Vertex thevtxub = pvCol->at(0);
282 reco::Vertex thevtxubbs = pvBSCol->at(0);
283
284
285 //check if closest ctf track is included in PV and if so, remove it before computing impact parameters and uncertainties
286 if (iM->closestCtfTrackRef().isNonnull()) {
287 ttckf = transientTrackBuilder->build(iM->closestCtfTrackRef());
288
289 //check if closest ctf track is included in PV and if so, remove it from the collection of
290 //tracks associated with the PV and perform a refit before computing impact parameters and uncertainties
291 reco::TrackCollection newTkCollection;
292 bool foundMatch = false;
293 for(reco::Vertex::trackRef_iterator itk = thevtx.tracks_begin(); itk!=thevtx.tracks_end(); itk++) {
294 if(iM->closestCtfTrack().ctfTrack.isNonnull()) {
295 bool refMatching = (itk->get() == &*(iM->closestCtfTrack().ctfTrack));
296 float shFraction = iM->closestCtfTrack().shFracInnerHits;
297 if(refMatching && shFraction > 0.5) {
298 foundMatch = true;
299 continue;
300 }
301 }
302 newTkCollection.push_back(*itk->get());
303 }
304
305 if(foundMatch) {
306 edm::Handle<reco::BeamSpot> bs;
307 event.getByLabel(edm::InputTag("offlineBeamSpot"),bs);
308
309 VertexReProducer revertex(hVertex,event);
310 edm::Handle<reco::BeamSpot> pvbeamspot;
311 event.getByLabel(revertex.inputBeamSpot(),pvbeamspot);
312 vector<TransientVertex> pvs = revertex.makeVertices(newTkCollection,*pvbeamspot,setup);
313 if(pvs.size()>0) {
314 thevtxub = pvs.front(); // take the first in the list
315 }
316
317 VertexReProducer revertexbs(hVertexBS,event);
318 edm::Handle<reco::BeamSpot> pvbsbeamspot;
319 event.getByLabel(revertexbs.inputBeamSpot(),pvbsbeamspot);
320 vector<TransientVertex> pvbss = revertexbs.makeVertices(newTkCollection,*pvbsbeamspot,setup);
321 if(pvbss.size()>0) {
322 thevtxubbs = pvbss.front(); // take the first in the list
323 }
324 }
325 }
326
327
328 //preserve sign of transverse impact parameter (cross-product definition from track, not lifetime-signing)
329 const double gsfsign = ( (-iM->gsfTrack()->dxy(thevtx.position())) >=0 ) ? 1. : -1.;
330 const double gsfsignbs = ( (-iM->gsfTrack()->dxy(thevtxbs.position())) >=0 ) ? 1. : -1.;
331
332 const std::pair<bool,Measurement1D> &d0pv = IPTools::absoluteTransverseImpactParameter(tt,thevtx);
333 if (d0pv.first) {
334 outElectron->SetD0PV(gsfsign*d0pv.second.value());
335 outElectron->SetD0PVErr(d0pv.second.error());
336 }
337 else {
338 outElectron->SetD0PV(-999.0);
339 }
340
341
342 const std::pair<bool,Measurement1D> &ip3dpv = IPTools::absoluteImpactParameter3D(tt,thevtx);
343 if (ip3dpv.first) {
344 outElectron->SetIp3dPV(gsfsign*ip3dpv.second.value());
345 outElectron->SetIp3dPVErr(ip3dpv.second.error());
346 }
347 else {
348 outElectron->SetIp3dPV(-999.0);
349 }
350
351 const std::pair<bool,Measurement1D> &d0pvbs = IPTools::absoluteTransverseImpactParameter(tt,thevtxbs);
352 if (d0pvbs.first) {
353 outElectron->SetD0PVBS(gsfsignbs*d0pvbs.second.value());
354 outElectron->SetD0PVBSErr(d0pvbs.second.error());
355 }
356 else {
357 outElectron->SetD0PVBS(-999.0);
358 }
359
360 const std::pair<bool,Measurement1D> &ip3dpvbs = IPTools::absoluteImpactParameter3D(tt,thevtxbs);
361 if (ip3dpvbs.first) {
362 outElectron->SetIp3dPVBS(gsfsignbs*ip3dpvbs.second.value());
363 outElectron->SetIp3dPVBSErr(ip3dpvbs.second.error());
364 }
365 else {
366 outElectron->SetIp3dPVBS(-999.0);
367 }
368
369 const std::pair<bool,Measurement1D> &d0pvub = IPTools::absoluteTransverseImpactParameter(tt,thevtxub);
370 if (d0pvub.first) {
371 outElectron->SetD0PVUB(gsfsign*d0pvub.second.value());
372 outElectron->SetD0PVUBErr(d0pvub.second.error());
373 }
374 else {
375 outElectron->SetD0PVUB(-999.0);
376 }
377
378
379 const std::pair<bool,Measurement1D> &ip3dpvub = IPTools::absoluteImpactParameter3D(tt,thevtxub);
380 if (ip3dpvub.first) {
381 outElectron->SetIp3dPVUB(gsfsign*ip3dpvub.second.value());
382 outElectron->SetIp3dPVUBErr(ip3dpvub.second.error());
383 }
384 else {
385 outElectron->SetIp3dPVUB(-999.0);
386 }
387
388 const std::pair<bool,Measurement1D> &d0pvubbs = IPTools::absoluteTransverseImpactParameter(tt,thevtxubbs);
389 if (d0pvubbs.first) {
390 outElectron->SetD0PVUBBS(gsfsignbs*d0pvubbs.second.value());
391 outElectron->SetD0PVUBBSErr(d0pvubbs.second.error());
392 }
393 else {
394 outElectron->SetD0PVUBBS(-999.0);
395 }
396
397 const std::pair<bool,Measurement1D> &ip3dpvubbs = IPTools::absoluteImpactParameter3D(tt,thevtxubbs);
398 if (ip3dpvubbs.first) {
399 outElectron->SetIp3dPVUBBS(gsfsignbs*ip3dpvubbs.second.value());
400 outElectron->SetIp3dPVUBBSErr(ip3dpvubbs.second.error());
401 }
402 else {
403 outElectron->SetIp3dPVUBBS(-999.0);
404 }
405
406 if (iM->closestCtfTrackRef().isNonnull()) {
407
408 const double ckfsign = ( (-iM->closestCtfTrackRef()->dxy(thevtx.position())) >=0 ) ? 1. : -1.;
409 const double ckfsignbs = ( (-iM->closestCtfTrackRef()->dxy(thevtxbs.position())) >=0 ) ? 1. : -1.;
410
411 const std::pair<bool,Measurement1D> &d0pvckf = IPTools::absoluteTransverseImpactParameter(ttckf,thevtx);
412 if (d0pvckf.first) {
413 outElectron->SetD0PVCkf(ckfsign*d0pvckf.second.value());
414 outElectron->SetD0PVCkfErr(d0pvckf.second.error());
415 }
416 else {
417 outElectron->SetD0PVCkf(-999.0);
418 }
419
420
421 const std::pair<bool,Measurement1D> &ip3dpvckf = IPTools::absoluteImpactParameter3D(ttckf,thevtx);
422 if (ip3dpvckf.first) {
423 outElectron->SetIp3dPVCkf(ckfsign*ip3dpvckf.second.value());
424 outElectron->SetIp3dPVCkfErr(ip3dpvckf.second.error());
425 }
426 else {
427 outElectron->SetIp3dPVCkf(-999.0);
428 }
429
430 const std::pair<bool,Measurement1D> &d0pvbsckf = IPTools::absoluteTransverseImpactParameter(ttckf,thevtxbs);
431 if (d0pvbsckf.first) {
432 outElectron->SetD0PVBSCkf(ckfsignbs*d0pvbsckf.second.value());
433 outElectron->SetD0PVBSCkfErr(d0pvbsckf.second.error());
434 }
435 else {
436 outElectron->SetD0PVBSCkf(-999.0);
437 }
438
439 const std::pair<bool,Measurement1D> &ip3dpvbsckf = IPTools::absoluteImpactParameter3D(ttckf,thevtxbs);
440 if (ip3dpvbsckf.first) {
441 outElectron->SetIp3dPVBSCkf(ckfsignbs*ip3dpvbsckf.second.value());
442 outElectron->SetIp3dPVBSCkfErr(ip3dpvbsckf.second.error());
443 }
444 else {
445 outElectron->SetIp3dPVBSCkf(-999.0);
446 }
447 //////////////
448
449 const std::pair<bool,Measurement1D> &d0pvubckf = IPTools::absoluteTransverseImpactParameter(ttckf,thevtxub);
450 if (d0pvubckf.first) {
451 outElectron->SetD0PVUBCkf(ckfsign*d0pvubckf.second.value());
452 outElectron->SetD0PVUBCkfErr(d0pvubckf.second.error());
453 }
454 else {
455 outElectron->SetD0PVUBCkf(-999.0);
456 }
457
458
459 const std::pair<bool,Measurement1D> &ip3dpvubckf = IPTools::absoluteImpactParameter3D(ttckf,thevtxub);
460 if (ip3dpvubckf.first) {
461 outElectron->SetIp3dPVUBCkf(ckfsign*ip3dpvubckf.second.value());
462 outElectron->SetIp3dPVUBCkfErr(ip3dpvubckf.second.error());
463 }
464 else {
465 outElectron->SetIp3dPVUBCkf(-999.0);
466 }
467
468 const std::pair<bool,Measurement1D> &d0pvubbsckf = IPTools::absoluteTransverseImpactParameter(ttckf,thevtxubbs);
469 if (d0pvubbsckf.first) {
470 outElectron->SetD0PVUBBSCkf(ckfsignbs*d0pvubbsckf.second.value());
471 outElectron->SetD0PVUBBSCkfErr(d0pvubbsckf.second.error());
472 }
473 else {
474 outElectron->SetD0PVUBBSCkf(-999.0);
475 }
476
477 const std::pair<bool,Measurement1D> &ip3dpvubbsckf = IPTools::absoluteImpactParameter3D(ttckf,thevtxubbs);
478 if (ip3dpvubbsckf.first) {
479 outElectron->SetIp3dPVUBBSCkf(ckfsignbs*ip3dpvubbsckf.second.value());
480 outElectron->SetIp3dPVUBBSCkfErr(ip3dpvubbsckf.second.error());
481 }
482 else {
483 outElectron->SetIp3dPVUBBSCkf(-999.0);
484 }
485
486 }
487 else {
488 outElectron->SetD0PVCkf(-999.0);
489 outElectron->SetIp3dPVCkf(-999.0);
490 outElectron->SetD0PVBSCkf(-999.0);
491 outElectron->SetIp3dPVBSCkf(-999.0);
492
493 outElectron->SetD0PVUBCkf(-999.0);
494 outElectron->SetIp3dPVUBCkf(-999.0);
495 outElectron->SetD0PVUBBSCkf(-999.0);
496 outElectron->SetIp3dPVUBBSCkf(-999.0);
497 }
498
499
500 if (verbose_>1) {
501 printf("gsf track pt = %5f\n",iM->gsfTrack()->pt());
502 printf("gsf track mode pt = %5f\n",iM->gsfTrack()->ptMode());
503 printf("ttrack pt = %5f\n",tt.initialFreeState().momentum().perp());
504 //printf("ttrackgsf pt = %5f\n",ttgsf.innermostMeasurementState().globalMomentum().perp());
505 printf("ip3dpv reduced chisquared = %5f, probability = %5f\n", ip3dpv.second.value()/ip3dpv.second.error(), TMath::Prob(ip3dpv.second.value()/ip3dpv.second.error(),1));
506 //printf("gsf reduced chisquared = %5f, probability = %5f\n", pvGsfCompat.second/2, TMath::Prob(pvGsfCompat.second,2));
507 }
508
509 }
510
511
512 //fill conversion partner track info
513 if (recomputeConversionInfo_) {
514 ConversionFinder convFinder; outElectron->SetConvPartnerDCotTheta(iM->convDcot());
515 ConversionInfo convInfo = convFinder.getConversionInfo(*iM, hGeneralTracks, hGsfTracks, bfield);
516
517 outElectron->SetConvFlag(convInfo.flag());
518 outElectron->SetConvPartnerDCotTheta(convInfo.dcot());
519 outElectron->SetConvPartnerDist(convInfo.dist());
520 outElectron->SetConvPartnerRadius(convInfo.radiusOfConversion());
521 reco::TrackRef ckfconvTrackRef = convInfo.conversionPartnerCtfTk();
522 reco::GsfTrackRef gsfconvTrackRef = convInfo.conversionPartnerGsfTk();
523
524
525 if ( gsfconvTrackRef.isNonnull() && gsfTrackMap_ ) {
526 outElectron->SetConvPartnerTrk(gsfTrackMap_->GetMit(edm::refToPtr(gsfconvTrackRef)));
527 }
528 else if (ckfconvTrackRef.isNonnull() && trackerTrackMap_) {
529 outElectron->SetConvPartnerTrk(trackerTrackMap_->GetMit(edm::refToPtr(ckfconvTrackRef)));
530 }
531 }
532 else {
533 outElectron->SetConvFlag(iM->convFlags());
534 outElectron->SetConvPartnerDCotTheta(iM->convDcot());
535 outElectron->SetConvPartnerDist(iM->convDist());
536 outElectron->SetConvPartnerRadius(iM->convRadius());
537 reco::TrackBaseRef convTrackRef = iM->convPartner();
538 if (convTrackRef.isNonnull()) {
539 if ( dynamic_cast<const reco::GsfTrack*>(convTrackRef.get()) && gsfTrackMap_ ) {
540 outElectron->SetConvPartnerTrk(gsfTrackMap_->GetMit(mitedm::refToBaseToPtr(convTrackRef)));
541 }
542 else if (trackerTrackMap_) {
543 outElectron->SetConvPartnerTrk(trackerTrackMap_->GetMit(mitedm::refToBaseToPtr(convTrackRef)));
544 }
545 }
546 }
547
548
549
550 // fill Electron ID information
551 outElectron->SetPassLooseID((*eidLooseMap)[eRef]);
552 outElectron->SetPassTightID((*eidTightMap)[eRef]);
553 if (!eIDLikelihoodName_.empty()) {
554 outElectron->SetIDLikelihood((*eidLikelihoodMap)[eRef]);
555 }
556
557 // fill corrected expected inner hits
558 if(iM->gsfTrack().isNonnull()) {
559 outElectron->SetCorrectedNExpectedHitsInner(iM->gsfTrack()->trackerExpectedHitsInner().numberOfHits());
560 }
561
562 //fill additional conversion flag
563 outElectron->SetMatchesVertexConversion(convMatcher.matchesGoodConversion(*iM,hConversions));
564
565 if (verbose_>1) {
566 double recomass = sqrt(iM->energy()*iM->energy() - iM->p()*iM->p());
567 printf(" mithep::Electron, pt=%5f, eta=%5f, phi=%5f, energy=%5f, p=%5f, mass=%5f\n",
568 outElectron->Pt(), outElectron->Eta(), outElectron->Phi(),
569 outElectron->E(), outElectron->P(), outElectron->Mass());
570 printf("reco::GsfElectron , pt=%5f, eta=%5f, phi=%5f, energy=%5f, p=%5f, mass=%5f\n",
571 iM->pt(), iM->eta(), iM->phi(), iM->energy(), iM->p(), recomass);
572 }
573 }
574 electrons_->Trim();
575 }