CMS 3D CMS Logo

FWTrackingParticleProxyBuilderFullFramework.cc
Go to the documentation of this file.
11 
13 
17 
20 
21 #include "TEveTrack.h"
22 #include "TEveCompound.h"
23 #include "TEveManager.h"
24 #include "TEveBrowser.h"
25 #include "TEveTrackPropagator.h"
26 
28 public:
31 
32  // virtual void setItem(const FWEventItem* iItem) override;
33 
35 
36 private:
39  delete;
40 
42  void build(const FWEventItem* iItem, TEveElementList* product, const FWViewContext*) override;
43 
44  void build(const TrackingParticle& iData,
45  unsigned int iIndex,
46  TEveElement& oItemHolder,
47  const FWViewContext*) override;
48 
51 };
52 
53 //______________________________________________________________________________
54 
55 /*
56  void FWTrackingParticleProxyBuilderFullFramework::setItem(const FWEventItem* iItem)
57  {
58  printf("set item\n");
59  FWProxyBuilderBase::setItem(iItem);
60  }
61 */
62 //______________________________________________________________________________
64  TEveElementList* product,
65  const FWViewContext*) {
66  // setup event handles amd call function from parent class
67 
68  const edm::Event* event = (const edm::Event*)item()->getEvent();
69  if (event) {
70  // get collection handle
71  edm::InputTag coltag(item()->moduleLabel(), item()->productInstanceLabel(), item()->processName());
72  event->getByLabel(coltag, tpch);
73 
74  // AMT todo: check if there is any other way getting the list other than this
75  // ifnot, set proces name as a configurable parameter
77  try {
78  event->getByLabel("xxx", simHitsTPAssoc);
79  m_assocList = &*simHitsTPAssoc;
80  } catch (const std::exception& e) {
81  std::cerr << " FWTrackingParticleProxyBuilderFullFramework::setItem() Can't get hits association list "
82  << e.what() << std::endl;
83  }
84  /*
85  // debug propagator
86  gEve->GetBrowser()->MapWindow();
87  gEve->AddToListTree(context().getTrackPropagator(), true);
88  context().getTrackPropagator()->SetRnrReferences(true);
89  */
90  }
91  FWSimpleProxyBuilder::build(iItem, product, nullptr);
92 }
93 //______________________________________________________________________________
95  unsigned int tpIdx,
96  TEveElement& comp,
97  const FWViewContext*) {
98  TEveRecTrack t;
99  t.fBeta = 1.0;
100  t.fP = TEveVector(iData.px(), iData.py(), iData.pz());
101  t.fV = TEveVector(iData.vx(), iData.vy(), iData.vz());
102  t.fSign = iData.charge();
103 
104  TEveTrack* track = new TEveTrack(&t, context().getTrackPropagator());
105  if (t.fSign == 0)
106  track->SetLineStyle(7);
107 
108  track->MakeTrack();
109  setupAddElement(track, &comp);
110  // printf("add track %d \n", tpIdx);
111 
112  if (m_assocList) {
113  TEvePointSet* pointSet = new TEvePointSet;
114  setupAddElement(pointSet, &comp);
115 
116  const FWGeometry* geom = item()->getGeom();
117  float local[3];
118  float localDir[3];
119  float global[3] = {0.0, 0.0, 0.0};
120  float globalDir[3] = {0.0, 0.0, 0.0};
121 
122  TrackingParticleRef tpr(tpch, tpIdx);
123  std::pair<TrackingParticleRef, TrackPSimHitRef> clusterTPpairWithDummyTP(tpr, TrackPSimHitRef());
124  auto range = std::equal_range(m_assocList->begin(),
125  m_assocList->end(),
126  clusterTPpairWithDummyTP,
128  // printf("TrackingParticle[%d] P(%.1f, %.1f, %.1f) matches %d hits\n", tpIdx,iData.px(), iData.py(), iData.pz() ,(int)(range.second-range.first ));
129 
130  std::vector<const PSimHit*> phits;
131  for (auto ri = range.first; ri != range.second; ++ri)
132  phits.push_back(ri->second.get());
133 
134  std::sort(phits.begin(), phits.end(), [](const PSimHit* a, const PSimHit* b) { return a->tof() < b->tof(); });
135  for (auto phi = phits.begin(); phi != phits.end(); ++phi) {
136  const PSimHit* phit = *phi;
137 
138  local[0] = phit->localPosition().x();
139  local[1] = phit->localPosition().y();
140  local[2] = phit->localPosition().z();
141 
142  localDir[0] = phit->momentumAtEntry().x();
143  localDir[1] = phit->momentumAtEntry().y();
144  localDir[2] = phit->momentumAtEntry().z();
145 
146  geom->localToGlobal(phit->detUnitId(), local, global);
147  geom->localToGlobal(phit->detUnitId(), localDir, globalDir, false);
148  pointSet->SetNextPoint(global[0], global[1], global[2]);
149 
150  //printf("localP = (%f, %f, %f) globalP = (%f, %f, %f), loss = %f, tof =%f\n", localDir[0], localDir[1], localDir[2],
151  // globalDir[0], globalDir[1], globalDir[2],
152  // phit->energyLoss(), phit->tof());
153  track->AddPathMark(TEvePathMark(TEvePathMark::kReference,
154  TEveVector(global[0], global[1], global[2]),
155  TEveVector(globalDir[0], globalDir[1], globalDir[2])));
156  }
157  }
158 }
159 
162  "TrackingParticleWithPSimHits",
const fireworks::Context & context() const
float tof() const
deprecated name for timeOfFlight()
Definition: PSimHit.h:76
static const int kAllRPZBits
Definition: FWViewType.h:67
static bool simHitTPAssociationListGreater(SimHitTPPair i, SimHitTPPair j)
LocalVector momentumAtEntry() const
The momentum of the track that produced the hit, at entry point.
Definition: PSimHit.h:55
void setupAddElement(TEveElement *el, TEveElement *parent, bool set_color=true) const
#define nullptr
T y() const
Definition: PV3DBase.h:60
double py() const
y coordinate of momentum vector. Note this is taken from the first SimTrack only. ...
const FWEventItem * item() const
static const int kAll3DBits
Definition: FWViewType.h:68
double pz() const
z coordinate of momentum vector. Note this is taken from the first SimTrack only. ...
float charge() const
Electric charge. Note this is taken from the first SimTrack only.
Local3DPoint localPosition() const
Definition: PSimHit.h:52
double vy() const
y coordinate of parent vertex position
T z() const
Definition: PV3DBase.h:61
void localToGlobal(unsigned int id, const float *local, float *global, bool translatep=true) const
Definition: FWGeometry.cc:496
const edm::EventBase * getEvent() const
Definition: FWEventItem.h:131
#define REGISTER_PROXYBUILDER_METHODS()
double vx() const
x coordinate of parent vertex position
double b
Definition: hdecay.h:118
#define REGISTER_FWPROXYBUILDER(_name_, _type_, _purpose_, _view_)
const FWTrackingParticleProxyBuilderFullFramework & operator=(const FWTrackingParticleProxyBuilderFullFramework &)=delete
std::vector< SimHitTPPair > SimHitTPAssociationList
double a
Definition: hdecay.h:119
edm::Ref< edm::PSimHitContainer > TrackPSimHitRef
Monte Carlo truth information used for tracking validation.
double px() const
x coordinate of momentum vector. Note this is taken from the first SimTrack only. ...
T x() const
Definition: PV3DBase.h:59
const FWGeometry * getGeom() const
Definition: FWEventItem.cc:548
unsigned int detUnitId() const
Definition: PSimHit.h:97
Definition: event.py:1
double vz() const
const SimHitTPAssociationProducer::SimHitTPAssociationList * m_assocList