CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ConvBremPFTrackFinder.cc
Go to the documentation of this file.
3 
4 
15 #include "TMath.h"
17 
18 using namespace edm;
19 using namespace std;
20 using namespace reco;
21 
23  double mvaBremConvCut,
24  string mvaWeightFileConvBrem):
25  builder_(builder),
26  mvaBremConvCut_(mvaBremConvCut),
27  mvaWeightFileConvBrem_(mvaWeightFileConvBrem)
28 {
29  tmvaReader_ = new TMVA::Reader("!Color:Silent");
30  tmvaReader_->AddVariable("secR",&secR);
31  tmvaReader_->AddVariable("sTIP",&sTIP);
32  tmvaReader_->AddVariable("nHITS1",&nHITS1);
33  tmvaReader_->AddVariable("secPin",&secPin);
34  tmvaReader_->AddVariable("Epout",&Epout);
35  tmvaReader_->AddVariable("detaBremKF",&detaBremKF);
36  tmvaReader_->AddVariable("ptRatioGsfKF",&ptRatioGsfKF);
37  tmvaReader_->BookMVA("BDT",mvaWeightFileConvBrem.c_str());
38 
40 
41 }
43 
44 void
46  const Handle<VertexCollection>& primaryVertex,
50  bool useNuclear,
51  bool useConversions,
52  bool useV0,
53  const reco::PFClusterCollection & theEClus,
54  reco::GsfPFRecTrack gsfpfrectk)
55 {
56 
57 
58  found_ = false;
59  bool debug = false;
60  bool debugRef = false;
61 
62  if(debug)
63  cout << "runConvBremFinder:: Entering " << endl;
64 
65 
66 
67  reco::GsfTrackRef refGsf = gsfpfrectk.gsfTrackRef();
68  reco::PFRecTrackRef pfTrackRef = gsfpfrectk.kfPFRecTrackRef();
69  vector<PFBrem> primPFBrem = gsfpfrectk.PFRecBrem();
70 
71 
72  const PFRecTrackCollection& PfRTkColl = *(thePfRecTrackCol.product());
73  reco::PFRecTrackCollection::const_iterator pft=PfRTkColl.begin();
74  reco::PFRecTrackCollection::const_iterator pftend=PfRTkColl.end();
75  //PFEnergyCalibration pfcalib_;
76 
77 
78 
79 
80  vector<PFRecTrackRef> AllPFRecTracks;
81  AllPFRecTracks.clear();
82  unsigned int ipft = 0;
83 
84 
85  for(;pft!=pftend;++pft,ipft++){
86  // do not consider the kf track already associated to the seed
87  if(pfTrackRef.isNonnull())
88  if(pfTrackRef->trackRef() == pft->trackRef()) continue;
89 
90  PFRecTrackRef pfRecTrRef(thePfRecTrackCol,ipft);
91  TrackRef trackRef = pfRecTrRef->trackRef();
92  reco::TrackBaseRef selTrackBaseRef(trackRef);
93 
94  if(debug)
95  cout << "runConvBremFinder:: pushing_back High Purity " << pft->trackRef()->pt()
96  << " eta,phi " << pft->trackRef()->eta() << ", " << pft->trackRef()->phi()
97  << " Memory Address Ref " << &*trackRef << " Memory Address BaseRef " << &*selTrackBaseRef << endl;
98  AllPFRecTracks.push_back(pfRecTrRef);
99  }
100 
101 
102  if(useConversions) {
103  const PFConversionCollection& PfConvColl = *(pfConversions.product());
104  for(unsigned i=0;i<PfConvColl.size(); i++) {
105  reco::PFConversionRef convRef(pfConversions,i);
106 
107  unsigned int trackSize=(convRef->pfTracks()).size();
108  if ( convRef->pfTracks().size() < 2) continue;
109  for(unsigned iTk=0;iTk<trackSize; iTk++) {
110  PFRecTrackRef compPFTkRef = convRef->pfTracks()[iTk];
111  reco::TrackBaseRef newTrackBaseRef(compPFTkRef->trackRef());
112  // do not consider the kf track already associated to the seed
113  if(pfTrackRef.isNonnull()) {
114  reco::TrackBaseRef primaryTrackBaseRef(pfTrackRef->trackRef());
115  if(primaryTrackBaseRef == newTrackBaseRef) continue;
116  }
117  bool notFound = true;
118  for(unsigned iPF = 0; iPF < AllPFRecTracks.size(); iPF++) {
119  reco::TrackBaseRef selTrackBaseRef(AllPFRecTracks[iPF]->trackRef());
120 
121  if(debugRef)
122  cout << "## Track 1 HP pt " << AllPFRecTracks[iPF]->trackRef()->pt() << " eta, phi " << AllPFRecTracks[iPF]->trackRef()->eta() << ", " << AllPFRecTracks[iPF]->trackRef()->phi()
123  << " Memory Address Ref " << &(*AllPFRecTracks[iPF]->trackRef()) << " Memory Address BaseRef " << &*selTrackBaseRef << endl;
124  if(debugRef)
125  cout << "** Track 2 CONV pt " << compPFTkRef->trackRef()->pt() << " eta, phi " << compPFTkRef->trackRef()->eta() << ", " << compPFTkRef->trackRef()->phi()
126  << " Memory Address Ref " << &*compPFTkRef->trackRef() << " Memory Address BaseRef " << &*newTrackBaseRef << endl;
127  //if(selTrackBaseRef == newTrackBaseRef || AllPFRecTracks[iPF]->trackRef()== compPFTkRef->trackRef()) {
128  if(AllPFRecTracks[iPF]->trackRef()== compPFTkRef->trackRef()) {
129  if(debugRef)
130  cout << " SAME BREM REF " << endl;
131  notFound = false;
132  }
133  }
134  if(notFound) {
135  if(debug)
136  cout << "runConvBremFinder:: pushing_back Conversions " << compPFTkRef->trackRef()->pt()
137  << " eta,phi " << compPFTkRef->trackRef()->eta() << " phi " << compPFTkRef->trackRef()->phi() <<endl;
138  AllPFRecTracks.push_back(compPFTkRef);
139  }
140  }
141  }
142  }
143 
144  if(useNuclear) {
145  const PFDisplacedTrackerVertexCollection& PfNuclColl = *(pfNuclears.product());
146  for(unsigned i=0;i<PfNuclColl.size(); i++) {
147  const reco::PFDisplacedTrackerVertexRef dispacedVertexRef(pfNuclears, i );
148  unsigned int trackSize= dispacedVertexRef->pfRecTracks().size();
149  for(unsigned iTk=0;iTk < trackSize; iTk++) {
150  reco::PFRecTrackRef newPFRecTrackRef = dispacedVertexRef->pfRecTracks()[iTk];
151  reco::TrackBaseRef newTrackBaseRef(newPFRecTrackRef->trackRef());
152  // do not consider the kf track already associated to the seed
153  if(pfTrackRef.isNonnull()) {
154  reco::TrackBaseRef primaryTrackBaseRef(pfTrackRef->trackRef());
155  if(primaryTrackBaseRef == newTrackBaseRef) continue;
156  }
157  bool notFound = true;
158  for(unsigned iPF = 0; iPF < AllPFRecTracks.size(); iPF++) {
159  reco::TrackBaseRef selTrackBaseRef(AllPFRecTracks[iPF]->trackRef());
160  if(selTrackBaseRef == newTrackBaseRef) notFound = false;
161  }
162  if(notFound) {
163  if(debug)
164  cout << "runConvBremFinder:: pushing_back displaced Vertex pt " << newPFRecTrackRef->trackRef()->pt()
165  << " eta,phi " << newPFRecTrackRef->trackRef()->eta() << ", " << newPFRecTrackRef->trackRef()->phi() << endl;
166  AllPFRecTracks.push_back(newPFRecTrackRef);
167  }
168  }
169  }
170  }
171 
172  if(useV0) {
173  const PFV0Collection& PfV0Coll = *(pfV0.product());
174  for(unsigned i=0;i<PfV0Coll.size(); i++) {
175  reco::PFV0Ref v0Ref( pfV0, i );
176  unsigned int trackSize=(v0Ref->pfTracks()).size();
177  for(unsigned iTk=0;iTk<trackSize; iTk++) {
178  reco::PFRecTrackRef newPFRecTrackRef = (v0Ref->pfTracks())[iTk];
179  reco::TrackBaseRef newTrackBaseRef(newPFRecTrackRef->trackRef());
180  // do not consider the kf track already associated to the seed
181  if(pfTrackRef.isNonnull()) {
182  reco::TrackBaseRef primaryTrackBaseRef(pfTrackRef->trackRef());
183  if(primaryTrackBaseRef == newTrackBaseRef) continue;
184  }
185  bool notFound = true;
186  for(unsigned iPF = 0; iPF < AllPFRecTracks.size(); iPF++) {
187  reco::TrackBaseRef selTrackBaseRef(AllPFRecTracks[iPF]->trackRef());
188  if(selTrackBaseRef == newTrackBaseRef) notFound = false;
189  }
190  if(notFound) {
191  if(debug)
192  cout << "runConvBremFinder:: pushing_back V0 " << newPFRecTrackRef->trackRef()->pt()
193  << " eta,phi " << newPFRecTrackRef->trackRef()->eta() << ", " << newPFRecTrackRef->trackRef()->phi() << endl;
194  AllPFRecTracks.push_back(newPFRecTrackRef);
195  }
196  }
197  }
198  }
199 
200 
201 
202  pfRecTrRef_vec_.clear();
203 
204 
205  for(unsigned iPF = 0; iPF < AllPFRecTracks.size(); iPF++) {
206 
207 
208  double dphi= fabs(AllPFRecTracks[iPF]->trackRef()->phi()-refGsf->phi());
209  if (dphi>TMath::Pi()) dphi-= TMath::TwoPi();
210  double deta=fabs(AllPFRecTracks[iPF]->trackRef()->eta()-refGsf->eta());
211 
212  // limiting the phase space (just for saving cpu-time)
213  if( fabs(dphi)> 1.0 || fabs(deta) > 0.4) continue;
214 
215 
216  double minDEtaBremKF = 1000.;
217  double minDPhiBremKF = 1000.;
218  double minDRBremKF = 1000.;
219  double minDEtaBremKFPos = 1000.;
220  double minDPhiBremKFPos = 1000.;
221  double minDRBremKFPos = 1000.;
222  reco:: TrackRef trkRef = AllPFRecTracks[iPF]->trackRef();
223 
224  double secEta = trkRef->innerMomentum().eta();
225  double secPhi = trkRef->innerMomentum().phi();
226 
227  for(unsigned ipbrem = 0; ipbrem < primPFBrem.size(); ipbrem++) {
228  if(primPFBrem[ipbrem].indTrajPoint() == 99) continue;
229  const reco::PFTrajectoryPoint& atPrimECAL
230  = primPFBrem[ipbrem].extrapolatedPoint( reco::PFTrajectoryPoint::ECALEntrance );
231  if( ! atPrimECAL.isValid() ) continue;
232  double bremEta = atPrimECAL.momentum().Eta();
233  double bremPhi = atPrimECAL.momentum().Phi();
234 
235 
236  double deta = fabs(bremEta - secEta);
237  double dphi = fabs(bremPhi - secPhi);
238  if (dphi>TMath::Pi()) dphi-= TMath::TwoPi();
239  double DR = sqrt(deta*deta + dphi*dphi);
240 
241 
242  double detaPos = fabs(bremEta - trkRef->innerPosition().eta());
243  double dphiPos = fabs(bremPhi - trkRef->innerPosition().phi());
244  if (dphiPos>TMath::Pi()) dphiPos-= TMath::TwoPi();
245  double DRPos = sqrt(detaPos*detaPos + dphiPos*dphiPos);
246 
247 
248 
249  // find the closest track tangent
250  if(DR < minDRBremKF) {
251 
252  minDRBremKF = DR;
253  minDEtaBremKF = deta;
254  minDPhiBremKF = fabs(dphi);
255  }
256 
257  if(DRPos < minDRBremKFPos) {
258  minDRBremKFPos = DR;
259  minDEtaBremKFPos = detaPos;
260  minDPhiBremKFPos = fabs(dphiPos);
261  }
262 
263  }
264 
265  //gsfR
266  float gsfR = sqrt(refGsf->innerPosition().x()*refGsf->innerPosition().x() +
267  refGsf->innerPosition().y()*refGsf->innerPosition().y() );
268 
269 
270  // secR
271  secR = sqrt(trkRef->innerPosition().x()*trkRef->innerPosition().x() +
272  trkRef->innerPosition().y()*trkRef->innerPosition().y() );
273 
274 
275  // apply loose selection (to be parallel) between the secondary track and brem-tangents.
276  // Moreover if the secR is internal with respect to the GSF track by two pixel layers discard it.
277  if( (minDPhiBremKF < 0.1 || minDPhiBremKFPos < 0.1) &&
278  (minDEtaBremKF < 0.02 || minDEtaBremKFPos < 0.02)&&
279  secR > (gsfR-8)) {
280 
281 
282  if(debug)
283  cout << "runConvBremFinder:: OK Find track and BREM close "
284  << " MinDphi " << minDPhiBremKF << " MinDeta " << minDEtaBremKF << endl;
285 
286 
287  float MinDist = 100000.;
288  float EE_calib = 0.;
289  PFRecTrack pfrectrack = *AllPFRecTracks[iPF];
290  pfrectrack.calculatePositionREP();
291  // Find and ECAL associated cluster
292  for (PFClusterCollection::const_iterator clus = theEClus.begin();
293  clus != theEClus.end();
294  clus++ ) {
295  // Removed unusd variable, left this in case it has side effects
296  clus->position();
297  double dist = -1.;
298  PFCluster clust = *clus;
299  clust.calculatePositionREP();
301  LinkByRecHit::testTrackAndClusterByRecHit(pfrectrack , clust ) : -1.;
302 
303  if(dist > 0.) {
304  bool applyCrackCorrections = false;
305  vector<double> ps1Ene(0);
306  vector<double> ps2Ene(0);
307  double ps1,ps2;
308  ps1=ps2=0.;
309  if(dist < MinDist) {
310  MinDist = dist;
311  EE_calib = pfcalib_->energyEm(*clus,ps1Ene,ps2Ene,ps1,ps2,applyCrackCorrections);
312  }
313  }
314  }
315  if(MinDist > 0. && MinDist < 100000.) {
316 
317  // compute all the input variables for conv brem selection
318 
319  secPout = sqrt(trkRef->outerMomentum().x()*trkRef->outerMomentum().x() +
320  trkRef->outerMomentum().y()*trkRef->outerMomentum().y() +
321  trkRef->outerMomentum().z()*trkRef->outerMomentum().z());
322 
323  secPin = sqrt(trkRef->innerMomentum().x()*trkRef->innerMomentum().x() +
324  trkRef->innerMomentum().y()*trkRef->innerMomentum().y() +
325  trkRef->innerMomentum().z()*trkRef->innerMomentum().z());
326 
327 
328  // maybe put innter momentum pt?
329  ptRatioGsfKF = trkRef->pt()/(refGsf->ptMode());
330 
331  Vertex dummy;
332  const Vertex *pv = &dummy;
334  if (primaryVertex->size() != 0) {
335  pv = &*primaryVertex->begin();
336  // we always use the first vertex (at the moment)
337  pvRef = edm::Ref<VertexCollection>(primaryVertex, 0);
338  } else { // create a dummy PV
340  e(0, 0) = 0.0015 * 0.0015;
341  e(1, 1) = 0.0015 * 0.0015;
342  e(2, 2) = 15. * 15.;
343  Vertex::Point p(0, 0, 0);
344  dummy = Vertex(p, e, 0, 0, 0);
345  }
346 
347 
348  // direction of the Gsf track
349  GlobalVector direction(refGsf->innerMomentum().x(),
350  refGsf->innerMomentum().y(),
351  refGsf->innerMomentum().z());
352 
353  TransientTrack transientTrack = builder_.build(*trkRef);
354  sTIP = IPTools::signedTransverseImpactParameter(transientTrack, direction, *pv).second.significance();
355 
356 
357  Epout = EE_calib/secPout;
358 
359  // eta distance brem-secondary kf track
360  detaBremKF = minDEtaBremKF;
361 
362  // Number of commont hits
363  trackingRecHit_iterator nhit=refGsf->recHitsBegin();
364  trackingRecHit_iterator nhit_end=refGsf->recHitsEnd();
365  unsigned int tmp_sh = 0;
366  //uint ish=0;
367 
368  for (;nhit!=nhit_end;++nhit){
369  if ((*nhit)->isValid()){
370  trackingRecHit_iterator ihit=trkRef->recHitsBegin();
371  trackingRecHit_iterator ihit_end=trkRef->recHitsEnd();
372  for (;ihit!=ihit_end;++ihit){
373  if ((*ihit)->isValid()) {
374  // method 1
375  if((*nhit)->sharesInput(&*(*ihit),TrackingRecHit::all)) tmp_sh++;
376 
377  // method 2 to switch in case of problem with rechit collections
378  // if(((*ihit)->geographicalId()==(*nhit)->geographicalId())&&
379  // (((*nhit)->localPosition()-(*ihit)->localPosition()).mag()<0.01)) ish++;
380 
381 
382  }
383  }
384  }
385  }
386 
387  nHITS1 = tmp_sh;
388 
389  double mvaValue = tmvaReader_->EvaluateMVA("BDT");
390 
391  if(debug)
392  cout << " The imput variables for conv brem tracks identification " << endl
393  << " secR " << secR << " gsfR " << gsfR << endl
394  << " N shared hits " << nHITS1 << endl
395  << " sTIP " << sTIP << endl
396  << " detaBremKF " << detaBremKF << endl
397  << " E/pout " << Epout << endl
398  << " pin " << secPin << endl
399  << " ptRatioKFGsf " << ptRatioGsfKF << endl
400  << " ***** MVA ***** " << mvaValue << endl;
401 
402  if(mvaValue > mvaBremConvCut_) {
403  found_ = true;
404  pfRecTrRef_vec_.push_back(AllPFRecTracks[iPF]);
405 
406  }
407  } // end MinDIST
408  } // end selection kf - brem tangents
409  } // loop on the kf tracks
410 
411 
412 
413 
414 
415 
416 }
417 
418 
const double TwoPi
const double Pi
reconstructed track used as an input to particle flow
Definition: PFRecTrack.h:22
int i
Definition: DBlmapReader.cc:9
tuple pfV0
Definition: pfV0_cfi.py:3
Particle flow cluster, see clustering algorithm in PFClusterAlgo.
Definition: PFCluster.h:42
std::pair< bool, Measurement1D > signedTransverseImpactParameter(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:50
reco::TransientTrack build(const reco::Track *p) const
const std::vector< reco::PFBrem > & PFRecBrem() const
Definition: GsfPFRecTrack.h:51
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:44
std::vector< PFConversion > PFConversionCollection
collection of PFConversion objects
T eta() const
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
PFEnergyCalibration * pfcalib_
void calculatePositionREP()
computes posrep_ once and for all
Definition: PFCluster.h:79
const reco::GsfTrackRef & gsfTrackRef() const
Definition: GsfPFRecTrack.h:39
T sqrt(T t)
Definition: SSEVec.h:46
TransientTrackBuilder builder_
std::vector< reco::PFRecTrackRef > pfRecTrRef_vec_
ConvBremPFTrackFinder(const TransientTrackBuilder &builder, double mvaBremConvCut, std::string mvaWeightFileConvBrem)
math::XYZPoint Point
point in the space
Definition: Vertex.h:40
void runConvBremFinder(const edm::Handle< reco::PFRecTrackCollection > &thePfRecTrackCol, const edm::Handle< reco::VertexCollection > &primaryVertex, const edm::Handle< reco::PFDisplacedTrackerVertexCollection > &pfNuclears, const edm::Handle< reco::PFConversionCollection > &pfConversions, const edm::Handle< reco::PFV0Collection > &pfV0, bool useNuclear, bool useConversions, bool useV0, const reco::PFClusterCollection &theEClus, reco::GsfPFRecTrack gsfpfrectk)
const reco::PFTrajectoryPoint & extrapolatedPoint(unsigned layerid) const
Definition: PFTrack.cc:76
std::vector< PFV0 > PFV0Collection
collection of PFV0 objects
Definition: PFV0Fwd.h:9
const math::XYZTLorentzVector & momentum() const
4-momenta quadrivector
bool isValid() const
is this point valid ?
const edm::Ref< std::vector< PFRecTrack > > & kfPFRecTrackRef() const
Definition: GsfPFRecTrack.h:43
void calculatePositionREP()
Definition: PFTrack.cc:68
static const GlobalPoint notFound(0, 0, 0)
T const * product() const
Definition: Handle.h:74
std::vector< PFCluster > PFClusterCollection
collection of PFCluster objects
Definition: PFClusterFwd.h:9
tuple cout
Definition: gather_cfg.py:121
A PFTrack holds several trajectory points, which basically contain the position and momentum of a tra...
#define debug
Definition: MEtoEDMFormat.h:34
static double testTrackAndClusterByRecHit(const reco::PFRecTrack &track, const reco::PFCluster &cluster, bool isBrem=false, bool debug=false)
Definition: LinkByRecHit.cc:10
std::vector< PFRecTrack > PFRecTrackCollection
collection of PFRecTrack objects
Definition: PFRecTrackFwd.h:9
tuple size
Write out results.
std::vector< PFDisplacedTrackerVertex > PFDisplacedTrackerVertexCollection
collection of DisplacedTrackerVertexs
double energyEm(const reco::PFCluster &clusterEcal, std::vector< double > &EclustersPS1, std::vector< double > &EclustersPS2, bool crackCorrection=true)
Definition: DDAxes.h:10