CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 
38  delete;
39 
40 private:
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
#define REGISTER_PROXYBUILDER_METHODS()
float tof() const
deprecated name for timeOfFlight()
Definition: PSimHit.h:76
#define REGISTER_FWPROXYBUILDER(_name_, _type_, _purpose_, _view_)
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
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
const uint16_t range(const Frame &aFrame)
std::vector< SimHitTPPair > SimHitTPAssociationList
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:494
const edm::EventBase * getEvent() const
Definition: FWEventItem.h:131
double vx() const
x coordinate of parent vertex position
double b
Definition: hdecay.h:118
const FWTrackingParticleProxyBuilderFullFramework & operator=(const FWTrackingParticleProxyBuilderFullFramework &)=delete
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
caConstants::TupleMultiplicity const *__restrict__ HitsOnGPU const *__restrict__ tindex_type *__restrict__ double *__restrict__ phits
double vz() const
z coordinate of parent vertex position
const SimHitTPAssociationProducer::SimHitTPAssociationList * m_assocList