CMS 3D CMS Logo

CaloPropagateTrack.cc
Go to the documentation of this file.
8 
10 
13 
14 #include <iostream>
15 
16 //#define EDM_ML_DEBUG
17 
18 namespace spr{
19 
20  std::vector<spr::propagatedTrackID> propagateCosmicCALO(edm::Handle<reco::TrackCollection>& trkCollection, const CaloGeometry* geo, const MagneticField* bField, std::string & theTrackQuality, bool debug) {
21 
26  std::vector<spr::propagatedTrackID> vdets;
27 
28  unsigned int indx;
29  reco::TrackCollection::const_iterator trkItr;
30  for (trkItr = trkCollection->begin(),indx=0; trkItr != trkCollection->end(); ++trkItr,indx++) {
31  const reco::Track* pTrack = &(*trkItr);
33  vdet.trkItr = trkItr;
34  vdet.ok = (pTrack->quality(trackQuality_));
35  vdet.detIdECAL = DetId(0);
36  vdet.detIdHCAL = DetId(0);
37  vdet.detIdEHCAL= DetId(0);
38 #ifdef EDM_ML_DEBUG
39  if (debug) std::cout << "Propagate track " << indx << " p " << trkItr->p() << " eta " << trkItr->eta() << " phi " << trkItr->phi() << " Flag " << vdet.ok << std::endl;
40 #endif
41  GlobalPoint vertex;
42  GlobalVector momentum;
43  int charge (pTrack->charge());
44  if (((pTrack->innerPosition()).Perp2()) <
45  ((pTrack->outerPosition()).Perp2())) {
46  vertex = GlobalPoint(((pTrack->innerPosition()).X()),
47  ((pTrack->innerPosition()).Y()),
48  ((pTrack->innerPosition()).Z()));
49  momentum = GlobalVector(((pTrack->innerMomentum()).X()),
50  ((pTrack->innerMomentum()).Y()),
51  ((pTrack->innerMomentum()).Z()));
52  } else {
53  vertex = GlobalPoint(((pTrack->outerPosition()).X()),
54  ((pTrack->outerPosition()).Y()),
55  ((pTrack->outerPosition()).Z()));
56  momentum = GlobalVector(((pTrack->outerMomentum()).X()),
57  ((pTrack->outerMomentum()).Y()),
58  ((pTrack->outerMomentum()).Z()));
59  }
60 #ifdef EDM_ML_DEBUG
61  if (debug) std::cout << "Track charge " << charge << " p " << momentum << " position " << vertex << std::endl;
62 #endif
63  std::pair<math::XYZPoint,bool> info =
64  spr::propagateECAL (vertex, momentum, charge, bField, debug);
65 
66  vdet.okECAL = info.second;
67  if (vdet.okECAL) {
68  const GlobalPoint point(info.first.x(),info.first.y(),info.first.z());
69  vdet.etaECAL = point.eta();
70  vdet.phiECAL = point.phi();
71  if (std::abs(point.eta())<spr::etaBEEcal) {
72  vdet.detIdECAL = barrelGeom->getClosestCell(point);
73  } else {
74  vdet.detIdECAL = endcapGeom->getClosestCell(point);
75  }
76  vdet.detIdEHCAL = gHB->getClosestCell(point);
77  }
78  info = spr::propagateHCAL (vertex, momentum, charge, bField, debug);
79  vdet.okHCAL = info.second;
80  if (vdet.okHCAL) {
81  const GlobalPoint point(info.first.x(),info.first.y(),info.first.z());
82  vdet.etaHCAL = point.eta();
83  vdet.phiHCAL = point.phi();
84  vdet.detIdHCAL = gHB->getClosestCell(point);
85  }
86 #ifdef EDM_ML_DEBUG
87  if (debug) {
88  std::cout << "Track [" << indx << "] Flag: " << vdet.ok << " ECAL ("
89  << vdet.okECAL << ") ";
90  if (vdet.detIdECAL.subdetId() == EcalBarrel)
91  std::cout << (EBDetId)(vdet.detIdECAL);
92  else
93  std::cout << (EEDetId)(vdet.detIdECAL);
94  std::cout << " HCAL (" << vdet.okHCAL << ") " << (HcalDetId)(vdet.detIdHCAL) << " Or " << (HcalDetId)(vdet.detIdEHCAL) << std::endl;
95  }
96 #endif
97  vdets.push_back(vdet);
98  }
99 
100 #ifdef EDM_ML_DEBUG
101  if (debug) {
102  std::cout << "propagateCALO:: for " << vdets.size() << " tracks" << std::endl;
103  for (unsigned int i=0; i<vdets.size(); ++i) {
104  std::cout << "Track [" << i << "] Flag: " << vdets[i].ok << " ECAL (" << vdets[i].okECAL << ") ";
105  if (vdets[i].detIdECAL.subdetId() == EcalBarrel) {
106  std::cout << (EBDetId)(vdets[i].detIdECAL);
107  } else {
108  std::cout << (EEDetId)(vdets[i].detIdECAL);
109  }
110  std::cout << " HCAL (" << vdets[i].okHCAL << ") " << (HcalDetId)(vdets[i].detIdHCAL) << " Or " << (HcalDetId)(vdets[i].detIdEHCAL) << std::endl;
111  }
112  }
113 #endif
114  return vdets;
115  }
116 
117  std::vector<spr::propagatedTrackID> propagateCALO(edm::Handle<reco::TrackCollection>& trkCollection, const CaloGeometry* geo, const MagneticField* bField, std::string & theTrackQuality, bool debug) {
118 
119  std::vector<spr::propagatedTrackID> vdets;
120  spr::propagateCALO(trkCollection,geo,bField,theTrackQuality, vdets, debug);
121  return vdets;
122  }
123 
124  void propagateCALO(edm::Handle<reco::TrackCollection>& trkCollection, const CaloGeometry* geo, const MagneticField* bField, std::string & theTrackQuality, std::vector<spr::propagatedTrackID>& vdets, bool debug) {
125 
129  reco::TrackBase::TrackQuality trackQuality_=reco::TrackBase::qualityByName(theTrackQuality);
130 
131  unsigned int indx;
132  reco::TrackCollection::const_iterator trkItr;
133  for (trkItr = trkCollection->begin(),indx=0; trkItr != trkCollection->end(); ++trkItr,indx++) {
134  const reco::Track* pTrack = &(*trkItr);
136  vdet.trkItr = trkItr;
137  vdet.ok = (pTrack->quality(trackQuality_));
138  vdet.detIdECAL = DetId(0);
139  vdet.detIdHCAL = DetId(0);
140  vdet.detIdEHCAL= DetId(0);
141 #ifdef EDM_ML_DEBUG
142  if (debug) std::cout << "Propagate track " << indx << " p " << trkItr->p() << " eta " << trkItr->eta() << " phi " << trkItr->phi() << " Flag " << vdet.ok << std::endl;
143 #endif
144  std::pair<math::XYZPoint,bool> info = spr::propagateECAL (pTrack, bField, debug);
145  vdet.okECAL = info.second;
146  if (vdet.okECAL) {
147  const GlobalPoint point(info.first.x(),info.first.y(),info.first.z());
148  vdet.etaECAL = point.eta();
149  vdet.phiECAL = point.phi();
150  if (std::abs(point.eta())<spr::etaBEEcal) {
151  vdet.detIdECAL = barrelGeom->getClosestCell(point);
152  } else {
153  vdet.detIdECAL = endcapGeom->getClosestCell(point);
154  }
155  vdet.detIdEHCAL = gHB->getClosestCell(point);
156  }
157  info = spr::propagateHCAL (pTrack, bField, debug);
158  vdet.okHCAL = info.second;
159  if (vdet.okHCAL) {
160  const GlobalPoint point(info.first.x(),info.first.y(),info.first.z());
161  vdet.etaHCAL = point.eta();
162  vdet.phiHCAL = point.phi();
163  vdet.detIdHCAL = gHB->getClosestCell(point);
164  }
165 #ifdef EDM_ML_DEBUG
166  if (debug) {
167  std::cout << "Track [" << indx << "] Flag: " << vdet.ok << " ECAL ("
168  << vdet.okECAL << ") ";
169  if (vdet.detIdECAL.subdetId() == EcalBarrel)
170  std::cout << (EBDetId)(vdet.detIdECAL);
171  else
172  std::cout << (EEDetId)(vdet.detIdECAL);
173  std::cout << " HCAL (" << vdet.okHCAL << ") " << (HcalDetId)(vdet.detIdHCAL) << " Or " << (HcalDetId)(vdet.detIdEHCAL) << std::endl;
174  }
175 #endif
176  vdets.push_back(vdet);
177  }
178 #ifdef EDM_ML_DEBUG
179  if (debug) {
180  std::cout << "propagateCALO:: for " << vdets.size() << " tracks" << std::endl;
181  for (unsigned int i=0; i<vdets.size(); ++i) {
182  std::cout << "Track [" << i << "] Flag: " << vdets[i].ok << " ECAL (" << vdets[i].okECAL << ") ";
183  if (vdets[i].detIdECAL.subdetId() == EcalBarrel) {
184  std::cout << (EBDetId)(vdets[i].detIdECAL);
185  } else {
186  std::cout << (EEDetId)(vdets[i].detIdECAL);
187  }
188  std::cout << " HCAL (" << vdets[i].okHCAL << ") " << (HcalDetId)(vdets[i].detIdHCAL) << " Or " << (HcalDetId)(vdets[i].detIdEHCAL) << std::endl;
189  }
190  }
191 #endif
192  }
193 
194  void propagateCALO(edm::Handle<reco::TrackCollection>& trkCollection, const CaloGeometry* geo, const MagneticField* bField, std::string & theTrackQuality, std::vector<spr::propagatedTrackDirection>& trkDir, bool debug) {
195 
199  reco::TrackBase::TrackQuality trackQuality_=reco::TrackBase::qualityByName(theTrackQuality);
200 
201  unsigned int indx;
202  reco::TrackCollection::const_iterator trkItr;
203  for (trkItr = trkCollection->begin(),indx=0; trkItr != trkCollection->end(); ++trkItr,indx++) {
204  const reco::Track* pTrack = &(*trkItr);
206  trkD.trkItr = trkItr;
207  trkD.ok = (pTrack->quality(trackQuality_));
208  trkD.detIdECAL = DetId(0);
209  trkD.detIdHCAL = DetId(0);
210  trkD.detIdEHCAL= DetId(0);
211 #ifdef EDM_ML_DEBUG
212  if (debug) std::cout << "Propagate track " << indx << " p " << trkItr->p() << " eta " << trkItr->eta() << " phi " << trkItr->phi() << " Flag " << trkD.ok << std::endl;
213 #endif
214  spr::propagatedTrack info = spr::propagateTrackToECAL (pTrack, bField, debug);
215  GlobalPoint point(info.point.x(),info.point.y(),info.point.z());
216  trkD.okECAL = info.ok;
217  trkD.pointECAL = point;
218  trkD.directionECAL = info.direction;
219  if (trkD.okECAL) {
220  if (std::abs(info.point.eta())<spr::etaBEEcal) {
221  trkD.detIdECAL = barrelGeom->getClosestCell(point);
222  } else {
223  trkD.detIdECAL = endcapGeom->getClosestCell(point);
224  }
225  trkD.detIdEHCAL = gHB->getClosestCell(point);
226  }
227  info = spr::propagateTrackToHCAL (pTrack, bField, debug);
228  point = GlobalPoint(info.point.x(),info.point.y(),info.point.z());
229  trkD.okHCAL = info.ok;
230  trkD.pointHCAL = point;
231  trkD.directionHCAL = info.direction;
232  if (trkD.okHCAL) {
233  trkD.detIdHCAL = gHB->getClosestCell(point);
234  }
235  trkDir.push_back(trkD);
236  }
237 #ifdef EDM_ML_DEBUG
238  if (debug) {
239  std::cout << "propagateCALO:: for " << trkDir.size() << " tracks" << std::endl;
240  for (unsigned int i=0; i<trkDir.size(); ++i) {
241  std::cout << "Track [" << i << "] Flag: " << trkDir[i].ok << " ECAL (" << trkDir[i].okECAL << ")";
242  if (trkDir[i].okECAL) {
243  std::cout << " point " << trkDir[i].pointECAL << " direction "
244  << trkDir[i].directionECAL << " ";
245  if (trkDir[i].detIdECAL.subdetId() == EcalBarrel) {
246  std::cout << (EBDetId)(trkDir[i].detIdECAL);
247  } else {
248  std::cout << (EEDetId)(trkDir[i].detIdECAL);
249  }
250  }
251  std::cout << " HCAL (" << trkDir[i].okHCAL << ")";
252  if (trkDir[i].okHCAL) {
253  std::cout << " point " << trkDir[i].pointHCAL << " direction "
254  << trkDir[i].directionHCAL << " "
255  << (HcalDetId)(trkDir[i].detIdHCAL);
256  }
257  std::cout << " Or " << (HcalDetId)(trkDir[i].detIdEHCAL) << std::endl;
258  }
259  }
260 #endif
261  }
262 
264 
268 
270  vdet.ok = true;
271  vdet.detIdECAL = DetId(0);
272  vdet.detIdHCAL = DetId(0);
273  vdet.detIdEHCAL= DetId(0);
274 #ifdef EDM_ML_DEBUG
275  if (debug) std::cout << "Propagate track: p " << pTrack->p() << " eta " << pTrack->eta() << " phi " << pTrack->phi() << " Flag " << vdet.ok << std::endl;
276 #endif
277  std::pair<math::XYZPoint,bool> info = spr::propagateECAL (pTrack, bField, debug);
278  vdet.okECAL = info.second;
279  if (vdet.okECAL) {
280  const GlobalPoint point(info.first.x(),info.first.y(),info.first.z());
281  vdet.etaECAL = point.eta();
282  vdet.phiECAL = point.phi();
283  if (std::abs(point.eta())<spr::etaBEEcal) {
284  vdet.detIdECAL = barrelGeom->getClosestCell(point);
285  } else {
286  vdet.detIdECAL = endcapGeom->getClosestCell(point);
287  }
288  vdet.detIdEHCAL = gHB->getClosestCell(point);
289  }
290  info = spr::propagateHCAL (pTrack, bField, debug);
291  vdet.okHCAL = info.second;
292  if (vdet.okHCAL) {
293  const GlobalPoint point(info.first.x(),info.first.y(),info.first.z());
294  vdet.etaHCAL = point.eta();
295  vdet.phiHCAL = point.phi();
296  vdet.detIdHCAL = gHB->getClosestCell(point);
297  }
298 #ifdef EDM_ML_DEBUG
299  if (debug) {
300  std::cout << "propagateCALO:: for 1 track" << std::endl;
301  std::cout << "Track [0] Flag: " << vdet.ok << " ECAL (" << vdet.okECAL << ") ";
302  if (vdet.detIdECAL.subdetId() == EcalBarrel) {
303  std::cout << (EBDetId)(vdet.detIdECAL);
304  } else {
305  std::cout << (EEDetId)(vdet.detIdECAL);
306  }
307  std::cout << " HCAL (" << vdet.okHCAL << ") " << (HcalDetId)(vdet.detIdHCAL) << " Or " << (HcalDetId)(vdet.detIdEHCAL) << std::endl;
308  }
309 #endif
310  return vdet;
311  }
312 
313  std::vector<spr::propagatedGenTrackID> propagateCALO(const HepMC::GenEvent * genEvent, edm::ESHandle<ParticleDataTable>& pdt, const CaloGeometry* geo, const MagneticField* bField, double etaMax, bool debug) {
314 
318 
319  std::vector<spr::propagatedGenTrackID> trkDir;
320  unsigned int indx;
321  HepMC::GenEvent::particle_const_iterator p;
322  for (p=genEvent->particles_begin(),indx=0; p != genEvent->particles_end(); ++p,++indx) {
324  trkD.trkItr = p;
325  trkD.detIdECAL = DetId(0);
326  trkD.detIdHCAL = DetId(0);
327  trkD.detIdEHCAL= DetId(0);
328  trkD.pdgId = ((*p)->pdg_id());
329  trkD.charge = ((pdt->particle(trkD.pdgId))->ID().threeCharge())/3;
330  const GlobalVector momentum = GlobalVector((*p)->momentum().px(), (*p)->momentum().py(), (*p)->momentum().pz());
331 #ifdef EDM_ML_DEBUG
332  if (debug) std::cout << "Propagate track " << indx << " pdg " << trkD.pdgId << " charge " << trkD.charge << " p " << momentum << std::endl;
333 #endif
334  // consider stable particles
335  if ( (*p)->status()==1 && std::abs((*p)->momentum().eta()) < etaMax ) {
336  const GlobalPoint vertex = GlobalPoint(0.1*(*p)->production_vertex()->position().x(),
337  0.1*(*p)->production_vertex()->position().y(),
338  0.1*(*p)->production_vertex()->position().z());
339  trkD.ok = true;
340  spr::propagatedTrack info = spr::propagateCalo (vertex, momentum, trkD.charge, bField, spr::zFrontEE, spr::rFrontEB, spr::etaBEEcal, debug);
341  GlobalPoint point(info.point.x(),info.point.y(),info.point.z());
342  trkD.okECAL = info.ok;
343  trkD.pointECAL = point;
344  trkD.directionECAL = info.direction;
345  if (trkD.okECAL) {
346  if (std::abs(info.point.eta())<spr::etaBEEcal) {
347  trkD.detIdECAL = barrelGeom->getClosestCell(point);
348  } else {
349  trkD.detIdECAL = endcapGeom->getClosestCell(point);
350  }
351  trkD.detIdEHCAL = gHB->getClosestCell(point);
352  }
353 
354  info = spr::propagateCalo (vertex, momentum, trkD.charge, bField, spr::zFrontHE, spr::rFrontHB, spr::etaBEHcal, debug);
355  point = GlobalPoint(info.point.x(),info.point.y(),info.point.z());
356  trkD.okHCAL = info.ok;
357  trkD.pointHCAL = point;
358  trkD.directionHCAL = info.direction;
359  if (trkD.okHCAL) {
360  trkD.detIdHCAL = gHB->getClosestCell(point);
361  }
362  }
363  trkDir.push_back(trkD);
364  }
365 #ifdef EDM_ML_DEBUG
366  if (debug) {
367  std::cout << "propagateCALO:: for " << trkDir.size() << " tracks" << std::endl;
368  for (unsigned int i=0; i<trkDir.size(); ++i) {
369  if (trkDir[i].okECAL) std::cout << "Track [" << i << "] Flag: " << trkDir[i].ok << " ECAL (" << trkDir[i].okECAL << ")";
370  if (trkDir[i].okECAL) {
371  std::cout << " point " << trkDir[i].pointECAL << " direction "
372  << trkDir[i].directionECAL << " ";
373  if (trkDir[i].detIdECAL.subdetId() == EcalBarrel) {
374  std::cout << (EBDetId)(trkDir[i].detIdECAL);
375  } else {
376  std::cout << (EEDetId)(trkDir[i].detIdECAL);
377  }
378  }
379  if (trkDir[i].okECAL) std::cout << " HCAL (" << trkDir[i].okHCAL << ")";
380  if (trkDir[i].okHCAL) {
381  std::cout << " point " << trkDir[i].pointHCAL << " direction "
382  << trkDir[i].directionHCAL << " "
383  << (HcalDetId)(trkDir[i].detIdHCAL);
384  }
385  if (trkDir[i].okECAL) std::cout << " Or " << (HcalDetId)(trkDir[i].detIdEHCAL) << std::endl;
386  }
387  }
388 #endif
389  return trkDir;
390  }
391 
392  std::vector<spr::propagatedGenParticleID> propagateCALO(edm::Handle<reco::GenParticleCollection>& genParticles, edm::ESHandle<ParticleDataTable>& pdt, const CaloGeometry* geo, const MagneticField* bField, double etaMax, bool debug) {
393 
397 
398  std::vector<spr::propagatedGenParticleID> trkDir;
399  unsigned int indx;
400  reco::GenParticleCollection::const_iterator p;
401  for (p=genParticles->begin(),indx=0; p != genParticles->end(); ++p,++indx) {
403  trkD.trkItr = p;
404  trkD.detIdECAL = DetId(0);
405  trkD.detIdHCAL = DetId(0);
406  trkD.detIdEHCAL= DetId(0);
407  trkD.pdgId = (p->pdgId());
408  trkD.charge = p->charge();
409  const GlobalVector momentum = GlobalVector(p->momentum().x(), p->momentum().y(), p->momentum().z());
410 #ifdef EDM_ML_DEBUG
411  if (debug) std::cout << "Propagate track " << indx << " pdg " << trkD.pdgId << " charge " << trkD.charge << " p " << momentum << std::endl;
412 #endif
413  // consider stable particles
414  if ( p->status()==1 && std::abs(momentum.eta()) < etaMax ) {
415  const GlobalPoint vertex = GlobalPoint(p->vertex().x(), p->vertex().y(), p->vertex().z());
416  trkD.ok = true;
417  spr::propagatedTrack info = spr::propagateCalo (vertex, momentum, trkD.charge, bField, spr::zFrontEE, spr::rFrontEB, spr::etaBEEcal, debug);
418  GlobalPoint point(info.point.x(),info.point.y(),info.point.z());
419  trkD.okECAL = info.ok;
420  trkD.pointECAL = point;
421  trkD.directionECAL = info.direction;
422  if (trkD.okECAL) {
423  if (std::abs(info.point.eta())<spr::etaBEEcal) {
424  trkD.detIdECAL = barrelGeom->getClosestCell(point);
425  } else {
426  trkD.detIdECAL = endcapGeom->getClosestCell(point);
427  }
428  trkD.detIdEHCAL = gHB->getClosestCell(point);
429  }
430 
431  info = spr::propagateCalo (vertex, momentum, trkD.charge, bField, spr::zFrontHE, spr::rFrontHB, spr::etaBEHcal, debug);
432  point = GlobalPoint(info.point.x(),info.point.y(),info.point.z());
433  trkD.okHCAL = info.ok;
434  trkD.pointHCAL = point;
435  trkD.directionHCAL = info.direction;
436  if (trkD.okHCAL) {
437  trkD.detIdHCAL = gHB->getClosestCell(point);
438  }
439  }
440  trkDir.push_back(trkD);
441  }
442 #ifdef EDM_ML_DEBUG
443  if (debug) {
444  std::cout << "propagateCALO:: for " << trkDir.size() << " tracks" << std::endl;
445  for (unsigned int i=0; i<trkDir.size(); ++i) {
446  if (trkDir[i].okECAL) std::cout << "Track [" << i << "] Flag: " << trkDir[i].ok << " ECAL (" << trkDir[i].okECAL << ")";
447  if (trkDir[i].okECAL) {
448  std::cout << " point " << trkDir[i].pointECAL << " direction "
449  << trkDir[i].directionECAL << " ";
450  if (trkDir[i].detIdECAL.subdetId() == EcalBarrel) {
451  std::cout << (EBDetId)(trkDir[i].detIdECAL);
452  } else {
453  std::cout << (EEDetId)(trkDir[i].detIdECAL);
454  }
455  }
456  if (trkDir[i].okECAL) std::cout << " HCAL (" << trkDir[i].okHCAL << ")";
457  if (trkDir[i].okHCAL) {
458  std::cout << " point " << trkDir[i].pointHCAL << " direction "
459  << trkDir[i].directionHCAL << " "
460  << (HcalDetId)(trkDir[i].detIdHCAL);
461  }
462  if (trkDir[i].okECAL) std::cout << " Or " << (HcalDetId)(trkDir[i].detIdEHCAL) << std::endl;
463  }
464  }
465 #endif
466  return trkDir;
467  }
468 
470 
474 
475  spr::trackAtOrigin trk = spr::simTrackAtOrigin(thisTrk, SimTk, SimVtx, debug);
477  trkD.ok = trk.ok;
478  trkD.detIdECAL = DetId(0);
479  trkD.detIdHCAL = DetId(0);
480  trkD.detIdEHCAL= DetId(0);
481 #ifdef EDM_ML_DEBUG
482  if (debug) std::cout << "Propagate track " << thisTrk << " charge " << trk.charge << " position " << trk.position << " p " << trk.momentum << " Flag " << trkD.ok << std::endl;
483 #endif
484  if (trkD.ok) {
486  GlobalPoint point(info.point.x(),info.point.y(),info.point.z());
487  trkD.okECAL = info.ok;
488  trkD.pointECAL = point;
489  trkD.directionECAL = info.direction;
490  if (trkD.okECAL) {
491  if (std::abs(info.point.eta())<spr::etaBEEcal) {
492  trkD.detIdECAL = barrelGeom->getClosestCell(point);
493  } else {
494  trkD.detIdECAL = endcapGeom->getClosestCell(point);
495  }
496  trkD.detIdEHCAL = gHB->getClosestCell(point);
497  }
498 
499  info = spr::propagateCalo (trk.position, trk.momentum, trk.charge, bField, spr::zFrontHE, spr::rFrontHB, spr::etaBEHcal, debug);
500  point = GlobalPoint(info.point.x(),info.point.y(),info.point.z());
501  trkD.okHCAL = info.ok;
502  trkD.pointHCAL = point;
503  trkD.directionHCAL = info.direction;
504  if (trkD.okHCAL) {
505  trkD.detIdHCAL = gHB->getClosestCell(point);
506  }
507  }
508 #ifdef EDM_ML_DEBUG
509  if (debug) {
510  std::cout << "propagateCALO:: for track [" << thisTrk << "] Flag: " << trkD.ok << " ECAL (" << trkD.okECAL << ") HCAL (" << trkD.okHCAL << ")" << std::endl;
511  if (trkD.okECAL) {
512  std::cout << "ECAL point " << trkD.pointECAL << " direction "
513  << trkD.directionECAL << " ";
514  if (trkD.detIdECAL.subdetId() == EcalBarrel) {
515  std::cout << (EBDetId)(trkD.detIdECAL);
516  } else {
517  std::cout << (EEDetId)(trkD.detIdECAL);
518  }
519  }
520  if (trkD.okHCAL) {
521  std::cout << " HCAL point " << trkD.pointHCAL << " direction "
522  << trkD.directionHCAL << " " << (HcalDetId)(trkD.detIdHCAL);
523  }
524  if (trkD.okECAL) std::cout << " Or " << (HcalDetId)(trkD.detIdEHCAL);
525  std::cout << std::endl;
526  }
527 #endif
528  return trkD;
529  }
530 
532 
534  spr::trackAtOrigin trk = spr::simTrackAtOrigin(thisTrk, SimTk, SimVtx, debug);
536  trkD.ok = trk.ok;
537  trkD.detIdECAL = DetId(0);
538  trkD.detIdHCAL = DetId(0);
539  trkD.detIdEHCAL= DetId(0);
540 #ifdef EDM_ML_DEBUG
541  if (debug) std::cout << "Propagate track " << thisTrk << " charge " << trk.charge << " position " << trk.position << " p " << trk.momentum << " Flag " << trkD.ok << std::endl;
542 #endif
543  if (trkD.ok) {
545  const GlobalPoint point = GlobalPoint(info.point.x(),info.point.y(),info.point.z());
546  trkD.okHCAL = info.ok;
547  trkD.pointHCAL = point;
548  trkD.directionHCAL = info.direction;
549  if (trkD.okHCAL) {
550  trkD.detIdHCAL = gHB->getClosestCell(point);
551  }
552  }
553 #ifdef EDM_ML_DEBUG
554  if (debug) {
555  std::cout << "propagateCALO:: for track [" << thisTrk << "] Flag: " << trkD.ok << " ECAL (" << trkD.okECAL << ") HCAL (" << trkD.okHCAL << ")" << std::endl;
556  if (trkD.okHCAL) {
557  std::cout << " HCAL point " << trkD.pointHCAL << " direction "
558  << trkD.directionHCAL << " " << (HcalDetId)(trkD.detIdHCAL);
559  }
560  }
561 #endif
562  return trkD;
563  }
564 
565 
566  std::pair<bool,HcalDetId> propagateHCALBack(const reco::Track* track, const CaloGeometry* geo, const MagneticField* bField, bool debug) {
568  const GlobalPoint vertex (track->vx(), track->vy(), track->vz());
569  const GlobalVector momentum (track->px(), track->py(), track->pz());
570  int charge (track->charge());
572  if (info.ok) {
573  const GlobalPoint point = GlobalPoint(info.point.x(),info.point.y(),info.point.z());
574  return std::pair<bool,HcalDetId>(true,HcalDetId(gHB->getClosestCell(point)));
575  } else {
576  return std::pair<bool,HcalDetId>(false,HcalDetId());
577  }
578  }
579 
581  const GlobalPoint vertex (track->vx(), track->vy(), track->vz());
582  const GlobalVector momentum (track->px(), track->py(), track->pz());
583  int charge (track->charge());
584  return spr::propagateCalo (vertex, momentum, charge, bfield, spr::zFrontEE, spr::rFrontEB, spr::etaBEEcal, debug);
585  }
586 
588 
589  spr::trackAtOrigin trk = spr::simTrackAtOrigin(thisTrk, SimTk, SimVtx, debug);
591  if (trk.ok)
592  ptrk = spr::propagateCalo (trk.position, trk.momentum, trk.charge, bfield, spr::zFrontEE, spr::rFrontEB, spr::etaBEEcal, debug);
593  return ptrk;
594  }
595 
596  std::pair<math::XYZPoint,bool> propagateECAL(const reco::Track *track, const MagneticField* bfield, bool debug) {
597  const GlobalPoint vertex (track->vx(), track->vy(), track->vz());
598  const GlobalVector momentum (track->px(), track->py(), track->pz());
599  int charge (track->charge());
600  return spr::propagateECAL (vertex, momentum, charge, bfield, debug);
601  }
602 
603  std::pair<DetId,bool> propagateIdECAL(const HcalDetId& id, const CaloGeometry* geo, const MagneticField* bField, bool debug) {
604 
606  const GlobalPoint vertex(0,0,0);
607  const GlobalPoint hit(gHB->getPosition(id));
608  const GlobalVector momentum = GlobalVector(hit.x(),hit.y(),hit.z());
609  std::pair<math::XYZPoint,bool> info = propagateECAL(vertex,momentum,0,bField,debug);
610  DetId eId(0);
611  if (info.second) {
612  const GlobalPoint point(info.first.x(),info.first.y(),info.first.z());
613  if (std::abs(point.eta())<spr::etaBEEcal) {
615  eId = barrelGeom->getClosestCell(point);
616  } else {
618  eId = endcapGeom->getClosestCell(point);
619  }
620  }
621  return std::pair<DetId,bool>(eId,info.second);
622  }
623 
624  std::pair<math::XYZPoint,bool> propagateECAL(const GlobalPoint& vertex, const GlobalVector& momentum, int charge, const MagneticField* bfield, bool debug) {
625  spr::propagatedTrack track = spr::propagateCalo (vertex, momentum, charge, bfield, spr::zFrontEE, spr::rFrontEB, spr::etaBEEcal, debug);
626  return std::pair<math::XYZPoint,bool>(track.point,track.ok);
627  }
628 
630  const GlobalPoint vertex (track->vx(), track->vy(), track->vz());
631  const GlobalVector momentum (track->px(), track->py(), track->pz());
632  int charge (track->charge());
633  return spr::propagateCalo (vertex, momentum, charge, bfield, spr::zFrontHE, spr::rFrontHB, spr::etaBEHcal, debug);
634  }
635 
637  spr::trackAtOrigin trk = spr::simTrackAtOrigin(thisTrk, SimTk, SimVtx, debug);
639  if (trk.ok)
640  ptrk = spr::propagateCalo (trk.position, trk.momentum, trk.charge, bfield, spr::zFrontHE, spr::rFrontHB, spr::etaBEHcal, debug);
641  return ptrk;
642  }
643 
644  std::pair<math::XYZPoint,bool> propagateHCAL(const reco::Track *track, const MagneticField* bfield, bool debug) {
645  const GlobalPoint vertex (track->vx(), track->vy(), track->vz());
646  const GlobalVector momentum (track->px(), track->py(), track->pz());
647  int charge (track->charge());
648  return spr::propagateHCAL (vertex, momentum, charge, bfield, debug);
649  }
650 
651  std::pair<math::XYZPoint,bool> propagateHCAL(const GlobalPoint& vertex, const GlobalVector& momentum, int charge, const MagneticField* bfield, bool debug) {
652  spr::propagatedTrack track = spr::propagateCalo (vertex, momentum, charge, bfield, spr::zFrontHE, spr::rFrontHB, spr::etaBEHcal, debug);
653  return std::pair<math::XYZPoint,bool>(track.point,track.ok);
654  }
655 
656  std::pair<math::XYZPoint,bool> propagateTracker(const reco::Track *track, const MagneticField* bfield, bool debug) {
657  const GlobalPoint vertex (track->vx(), track->vy(), track->vz());
658  const GlobalVector momentum (track->px(), track->py(), track->pz());
659  int charge (track->charge());
660  spr::propagatedTrack track1 = spr::propagateCalo (vertex, momentum, charge, bfield, spr::zBackTE, spr::rBackTB, spr::etaBETrak, debug);
661  return std::pair<math::XYZPoint,bool>(track1.point,track1.ok);
662  }
663 
664  std::pair<math::XYZPoint,double> propagateTrackerEnd(const reco::Track *track,
665  const MagneticField* bField, bool
666 #ifdef EDM_ML_DEBUG
667  debug
668 #endif
669  ) {
670 
671  const GlobalPoint vertex (track->vx(), track->vy(), track->vz());
672  const GlobalVector momentum (track->px(), track->py(), track->pz());
673  int charge (track->charge());
674  float radius = track->outerPosition().Rho();
675  float zdist = track->outerPosition().Z();
676 #ifdef EDM_ML_DEBUG
677  if (debug) std::cout << "propagateTrackerEnd:: Vertex " << vertex << " Momentum " << momentum << " Charge " << charge << " Radius " << radius << " Z " << zdist << std::endl;
678 #endif
679  FreeTrajectoryState fts (vertex, momentum, charge, bField);
682 
683  AnalyticalPropagator myAP (bField, alongMomentum, 2*M_PI);
684 
685  TrajectoryStateOnSurface tsose = myAP.propagate(fts, *endcap);
686  TrajectoryStateOnSurface tsosb = myAP.propagate(fts, *barrel);
687 
688  math::XYZPoint point(-999.,-999.,-999.);
689  bool ok=false;
690  GlobalVector direction(0,0,1);
691  if (tsosb.isValid() && std::abs(zdist) < spr::zFrontTE) {
692  point.SetXYZ(tsosb.globalPosition().x(), tsosb.globalPosition().y(), tsosb.globalPosition().z());
693  direction = tsosb.globalDirection();
694  ok = true;
695  } else if (tsose.isValid()) {
696  point.SetXYZ(tsose.globalPosition().x(), tsose.globalPosition().y(), tsose.globalPosition().z());
697  direction = tsose.globalDirection();
698  ok = true;
699  }
700 
701  double length = -1;
702  if (ok) {
703  math::XYZPoint vDiff(point.x()-vertex.x(), point.y()-vertex.y(), point.z()-vertex.z());
704  double dphi = direction.phi()-momentum.phi();
705  double rdist = std::sqrt(vDiff.x()*vDiff.x()+vDiff.y()*vDiff.y());
706  double rat = 0.5*dphi/std::sin(0.5*dphi);
707  double dZ = vDiff.z();
708  double dS = rdist*rat; //dZ*momentum.z()/momentum.perp();
709  length = std::sqrt(dS*dS+dZ*dZ);
710 #ifdef EDM_ML_DEBUG
711  if (debug)
712  std::cout << "propagateTracker:: Barrel " << tsosb.isValid() << " Endcap " << tsose.isValid() << " OverAll " << ok << " Point " << point << " RDist " << rdist << " dS " << dS << " dS/pt " << rdist*rat/momentum.perp() << " zdist " << dZ << " dz/pz " << dZ/momentum.z() << " Length " << length << std::endl;
713 #endif
714  }
715 
716  return std::pair<math::XYZPoint,double>(point,length);
717  }
718 
720  const GlobalVector& tpMomentum,
721  int tpCharge, const MagneticField* bField,
722  float zdist, float radius, float corner, bool
723 #ifdef EDM_ML_DEBUG
724  debug
725 #endif
726  ) {
727 
729 #ifdef EDM_ML_DEBUG
730  if (debug) std::cout << "propagateCalo:: Vertex " << tpVertex << " Momentum " << tpMomentum << " Charge " << tpCharge << " Radius " << radius << " Z " << zdist << " Corner " << corner << std::endl;
731 #endif
732  FreeTrajectoryState fts (tpVertex, tpMomentum, tpCharge, bField);
733 
736 
738 
739  AnalyticalPropagator myAP (bField, alongMomentum, 2*M_PI);
740 
742  if (tpMomentum.eta() < 0) {
743  tsose = myAP.propagate(fts, *lendcap);
744  } else {
745  tsose = myAP.propagate(fts, *rendcap);
746  }
747 
748  TrajectoryStateOnSurface tsosb = myAP.propagate(fts, *barrel);
749 
750  track.ok=true;
751  if (tsose.isValid() && tsosb.isValid()) {
752  float absEta = std::abs(tsosb.globalPosition().eta());
753  if (absEta < corner) {
754  track.point.SetXYZ(tsosb.globalPosition().x(), tsosb.globalPosition().y(), tsosb.globalPosition().z());
755  track.direction = tsosb.globalDirection();
756  } else {
757  track.point.SetXYZ(tsose.globalPosition().x(), tsose.globalPosition().y(), tsose.globalPosition().z());
758  track.direction = tsose.globalDirection();
759  }
760  } else if (tsose.isValid()) {
761  track.point.SetXYZ(tsose.globalPosition().x(), tsose.globalPosition().y(), tsose.globalPosition().z());
762  track.direction = tsose.globalDirection();
763  } else if (tsosb.isValid()) {
764  track.point.SetXYZ(tsosb.globalPosition().x(), tsosb.globalPosition().y(), tsosb.globalPosition().z());
765  track.direction = tsosb.globalDirection();
766  } else {
767  track.point.SetXYZ(-999., -999., -999.);
768  track.direction = GlobalVector(0,0,1);
769  track.ok = false;
770  }
771 #ifdef EDM_ML_DEBUG
772  if (debug) {
773  std::cout << "propagateCalo:: Barrel " << tsosb.isValid() << " Endcap " << tsose.isValid() << " OverAll " << track.ok << " Point " << track.point << " Direction " << track.direction << std::endl;
774  if (track.ok) {
775  math::XYZPoint vDiff(track.point.x()-tpVertex.x(), track.point.y()-tpVertex.y(), track.point.z()-tpVertex.z());
776  double dphi = track.direction.phi()-tpMomentum.phi();
777  double rdist = std::sqrt(vDiff.x()*vDiff.x()+vDiff.y()*vDiff.y());
778  double pt = tpMomentum.perp();
779  double rat = 0.5*dphi/std::sin(0.5*dphi);
780  std::cout << "RDist " << rdist << " pt " << pt << " r/pt " << rdist*rat/pt << " zdist " << vDiff.z() << " pz " << tpMomentum.z() << " z/pz " << vDiff.z()/tpMomentum.z() << std::endl;
781  }
782  }
783 #endif
784  return track;
785  }
786 
787  spr::trackAtOrigin simTrackAtOrigin(unsigned int thisTrk,
790 #ifdef EDM_ML_DEBUG
791  debug
792 #endif
793  ) {
794 
795  spr::trackAtOrigin trk;
796 
797  edm::SimTrackContainer::const_iterator itr = SimTk->end();
798  for (edm::SimTrackContainer::const_iterator simTrkItr = SimTk->begin(); simTrkItr!= SimTk->end(); simTrkItr++) {
799  if ( simTrkItr->trackId() == thisTrk ) {
800 #ifdef EDM_ML_DEBUG
801  if (debug) std::cout << "matched trackId (maximum occurance) " << thisTrk << " type " << simTrkItr->type() << std::endl;
802 #endif
803  itr = simTrkItr;
804  break;
805  }
806  }
807 
808  if (itr != SimTk->end()) {
809  int vertIndex = itr->vertIndex();
810  if (vertIndex != -1 && vertIndex < (int)SimVtx->size()) {
811  edm::SimVertexContainer::const_iterator simVtxItr= SimVtx->begin();
812  for (int iv=0; iv<vertIndex; iv++) simVtxItr++;
813  const math::XYZTLorentzVectorD pos = simVtxItr->position();
814  const math::XYZTLorentzVectorD mom = itr->momentum();
815  trk.ok = true;
816  trk.charge = (int)(itr->charge());
817  trk.position = GlobalPoint(pos.x(), pos.y(), pos.z());
818  trk.momentum = GlobalVector(mom.x(), mom.y(), mom.z());
819  }
820  }
821 #ifdef EDM_ML_DEBUG
822  if (debug) std::cout << "Track flag " << trk.ok << " Position " << trk.position << " Momentum " << trk.momentum << std::endl;
823 #endif
824  return trk;
825  }
826 
827 }
double p() const
momentum vector magnitude
Definition: TrackBase.h:615
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:45
static const double etaBEEcal
Definition: CaloConstants.h:12
static const TGPicture * info(bool iBackgroundIsBlack)
std::vector< spr::propagatedTrackID > propagateCALO(edm::Handle< reco::TrackCollection > &trkCollection, const CaloGeometry *geo, const MagneticField *bField, std::string &theTrackQuality, bool debug=false)
T perp() const
Definition: PV3DBase.h:72
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:14
static const double zBackTE
Definition: CaloConstants.h:21
static const double etaBEHcal
Definition: CaloConstants.h:15
std::pair< DetId, bool > propagateIdECAL(const HcalDetId &id, const CaloGeometry *geo, const MagneticField *, bool debug=false)
reco::GenParticleCollection::const_iterator trkItr
TrackQuality
track quality
Definition: TrackBase.h:151
std::pair< math::XYZPoint, bool > propagateHCAL(const reco::Track *, const MagneticField *, bool debug=false)
static const double zFrontHE
Definition: CaloConstants.h:13
uint32_t ID
Definition: Definitions.h:26
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
#define X(str)
Definition: MuonsGrabber.cc:48
GlobalPoint globalPosition() const
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:645
spr::trackAtOrigin simTrackAtOrigin(unsigned int thisTrk, edm::Handle< edm::SimTrackContainer > &SimTk, edm::Handle< edm::SimVertexContainer > &SimVtx, bool debug=false)
static const double zBackHE
Definition: CaloConstants.h:16
spr::propagatedTrack propagateCalo(const GlobalPoint &vertex, const GlobalVector &momentum, int charge, const MagneticField *, float zdist, float radius, float corner, bool debug=false)
double px() const
x coordinate of momentum vector
Definition: TrackBase.h:627
const math::XYZPoint & outerPosition() const
position of the outermost hit
Definition: Track.h:65
static const double rFrontHB
Definition: CaloConstants.h:14
HepMC::GenEvent::particle_const_iterator trkItr
const math::XYZPoint & innerPosition() const
position of the innermost hit
Definition: Track.h:55
static const double rBackHB
Definition: CaloConstants.h:17
static CylinderPointer build(const PositionType &pos, const RotationType &rot, Scalar radius, Bounds *bounds=0)
Definition: Cylinder.h:51
reco::TrackCollection::const_iterator trkItr
static const double zFrontEE
Definition: CaloConstants.h:9
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:651
static const double rBackTB
Definition: CaloConstants.h:22
spr::propagatedTrackDirection propagateHCALBack(unsigned int thisTrk, edm::Handle< edm::SimTrackContainer > &SimTk, edm::Handle< edm::SimVertexContainer > &SimVtx, const CaloGeometry *geo, const MagneticField *bField, bool debug=false)
T sqrt(T t)
Definition: SSEVec.h:18
T phi() const
Definition: Phi.h:41
static PlanePointer build(Args &&...args)
Definition: Plane.h:33
T z() const
Definition: PV3DBase.h:64
static const double rFrontEB
Definition: CaloConstants.h:10
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::pair< math::XYZPoint, bool > propagateTracker(const reco::Track *, const MagneticField *, bool debug=false)
std::pair< math::XYZPoint, bool > propagateECAL(const reco::Track *, const MagneticField *, bool debug=false)
spr::propagatedTrack propagateTrackToECAL(const reco::Track *, const MagneticField *, bool debug=false)
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
GlobalPoint getPosition(const DetId &id) const
#define M_PI
double pz() const
z coordinate of momentum vector
Definition: TrackBase.h:639
virtual DetId getClosestCell(const GlobalPoint &r) const
double vz() const
z coordinate of the reference point on track
Definition: TrackBase.h:669
Definition: DetId.h:18
static TrackQuality qualityByName(const std::string &name)
Definition: TrackBase.cc:125
#define debug
Definition: HDRShower.cc:19
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
Definition: Track.h:70
static const double zFrontTE
Definition: CaloConstants.h:20
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:53
bool quality(const TrackQuality) const
Track quality.
Definition: TrackBase.h:510
T eta() const
Definition: PV3DBase.h:76
double vy() const
y coordinate of the reference point on track
Definition: TrackBase.h:663
std::pair< math::XYZPoint, double > propagateTrackerEnd(const reco::Track *, const MagneticField *, bool debug=false)
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
Definition: Track.h:60
#define EDM_ML_DEBUG
std::vector< spr::propagatedTrackID > propagateCosmicCALO(edm::Handle< reco::TrackCollection > &trkCollection, const CaloGeometry *geo, const MagneticField *bField, std::string &theTrackQuality, bool debug=false)
reco::TrackCollection::const_iterator trkItr
int charge() const
track electric charge
Definition: TrackBase.h:567
T x() const
Definition: PV3DBase.h:62
spr::propagatedTrack propagateTrackToHCAL(const reco::Track *, const MagneticField *, bool debug=false)
static const double etaBETrak
Definition: CaloConstants.h:23
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5
double py() const
y coordinate of momentum vector
Definition: TrackBase.h:633
double vx() const
x coordinate of the reference point on track
Definition: TrackBase.h:657
Global3DVector GlobalVector
Definition: GlobalVector.h:10
GlobalVector globalDirection() const