CMS 3D CMS Logo

ShallowTrackClustersProducer.cc
Go to the documentation of this file.
2 
4 
15 
16 #include <map>
17 
19  : tracks_token_(consumes<edm::View<reco::Track>>(iConfig.getParameter<edm::InputTag>("Tracks"))),
20  association_token_(consumes<TrajTrackAssociationCollection>(iConfig.getParameter<edm::InputTag>("Tracks"))),
21  clusters_token_(consumes<edmNew::DetSetVector<SiStripCluster>>(iConfig.getParameter<edm::InputTag>("Clusters"))),
25  Suffix(iConfig.getParameter<std::string>("Suffix")),
26  Prefix(iConfig.getParameter<std::string>("Prefix")) {
27  produces<std::vector<int>>(Prefix + "clusterIdx" + Suffix); //link: on trk cluster --> general cluster info
28  produces<std::vector<int>>(Prefix + "onTrkClusterIdx" + Suffix); //link: general cluster info --> on track cluster
29  produces<std::vector<int>>(Prefix + "onTrkClustersBegin" + Suffix); //link: track --> onTrkInfo (range)
30  produces<std::vector<int>>(Prefix + "onTrkClustersEnd" + Suffix); //link: track --> onTrkInfo (range)
31  produces<std::vector<int>>(Prefix + "trackindex" + Suffix); //link: on trk cluster --> track index
32 
33  produces<std::vector<unsigned int>>(Prefix + "trackmulti" + Suffix);
34  produces<std::vector<float>>(Prefix + "localtheta" + Suffix);
35  produces<std::vector<float>>(Prefix + "localphi" + Suffix);
36  produces<std::vector<float>>(Prefix + "localpitch" + Suffix);
37  produces<std::vector<float>>(Prefix + "localx" + Suffix);
38  produces<std::vector<float>>(Prefix + "localy" + Suffix);
39  produces<std::vector<float>>(Prefix + "localz" + Suffix);
40  produces<std::vector<float>>(Prefix + "strip" + Suffix);
41  produces<std::vector<float>>(Prefix + "globaltheta" + Suffix);
42  produces<std::vector<float>>(Prefix + "globalphi" + Suffix);
43  produces<std::vector<float>>(Prefix + "globalx" + Suffix);
44  produces<std::vector<float>>(Prefix + "globaly" + Suffix);
45  produces<std::vector<float>>(Prefix + "globalz" + Suffix);
46  produces<std::vector<float>>(Prefix + "insidistance" + Suffix);
47  produces<std::vector<float>>(Prefix + "covered" + Suffix);
48  produces<std::vector<float>>(Prefix + "projwidth" + Suffix);
49  produces<std::vector<float>>(Prefix + "BdotY" + Suffix);
50 
51  produces<std::vector<float>>(Prefix + "rhlocalx" + Suffix);
52  produces<std::vector<float>>(Prefix + "rhlocaly" + Suffix);
53  produces<std::vector<float>>(Prefix + "rhlocalxerr" + Suffix);
54  produces<std::vector<float>>(Prefix + "rhlocalyerr" + Suffix);
55  produces<std::vector<float>>(Prefix + "rhglobalx" + Suffix);
56  produces<std::vector<float>>(Prefix + "rhglobaly" + Suffix);
57  produces<std::vector<float>>(Prefix + "rhglobalz" + Suffix);
58  produces<std::vector<float>>(Prefix + "rhstrip" + Suffix);
59  produces<std::vector<float>>(Prefix + "rhmerr" + Suffix);
60 
61  produces<std::vector<float>>(Prefix + "ubstrip" + Suffix);
62  produces<std::vector<float>>(Prefix + "ubmerr" + Suffix);
63 
64  produces<std::vector<float>>(Prefix + "driftx" + Suffix);
65  produces<std::vector<float>>(Prefix + "drifty" + Suffix);
66  produces<std::vector<float>>(Prefix + "driftz" + Suffix);
67  produces<std::vector<float>>(Prefix + "globalZofunitlocalY" + Suffix);
68 }
69 
73  iEvent.getByToken(tracks_token_, tracks);
74 
75  int size = clustermap.size();
76 
77  //links
78  auto clusterIdx = std::make_unique<std::vector<int>>(); //link: on trk cluster --> general cluster info
79  auto onTrkClusterIdx =
80  std::make_unique<std::vector<int>>(size, -1); //link: general cluster info --> on track cluster
81  auto onTrkClustersBegin = std::make_unique<std::vector<int>>(tracks->size(), -1); //link: track --> on trk cluster
82  auto onTrkClustersEnd = std::make_unique<std::vector<int>>(tracks->size(), -1); //link: track --> on trk cluster
83  auto trackindex = std::make_unique<std::vector<int>>(); //link: on track cluster --> track
84  clusterIdx->reserve(size);
85  trackindex->reserve(size);
86 
87  auto trackmulti = std::make_unique<std::vector<unsigned int>>();
88  trackmulti->reserve(size);
89  auto localtheta = std::make_unique<std::vector<float>>();
90  localtheta->reserve(size);
91  auto localphi = std::make_unique<std::vector<float>>();
92  localphi->reserve(size);
93  auto localpitch = std::make_unique<std::vector<float>>();
94  localpitch->reserve(size);
95  auto localx = std::make_unique<std::vector<float>>();
96  localx->reserve(size);
97  auto localy = std::make_unique<std::vector<float>>();
98  localy->reserve(size);
99  auto localz = std::make_unique<std::vector<float>>();
100  localz->reserve(size);
101  auto strip = std::make_unique<std::vector<float>>();
102  strip->reserve(size);
103  auto globaltheta = std::make_unique<std::vector<float>>();
104  globaltheta->reserve(size);
105  auto globalphi = std::make_unique<std::vector<float>>();
106  globalphi->reserve(size);
107  auto globalx = std::make_unique<std::vector<float>>();
108  globalx->reserve(size);
109  auto globaly = std::make_unique<std::vector<float>>();
110  globaly->reserve(size);
111  auto globalz = std::make_unique<std::vector<float>>();
112  globalz->reserve(size);
113  auto insidistance = std::make_unique<std::vector<float>>();
114  insidistance->reserve(size);
115  auto projwidth = std::make_unique<std::vector<float>>();
116  projwidth->reserve(size);
117  auto BdotY = std::make_unique<std::vector<float>>();
118  BdotY->reserve(size);
119  auto covered = std::make_unique<std::vector<float>>();
120  covered->reserve(size);
121  auto rhlocalx = std::make_unique<std::vector<float>>();
122  rhlocalx->reserve(size);
123  auto rhlocaly = std::make_unique<std::vector<float>>();
124  rhlocaly->reserve(size);
125  auto rhlocalxerr = std::make_unique<std::vector<float>>();
126  rhlocalxerr->reserve(size);
127  auto rhlocalyerr = std::make_unique<std::vector<float>>();
128  rhlocalyerr->reserve(size);
129  auto rhglobalx = std::make_unique<std::vector<float>>();
130  rhglobalx->reserve(size);
131  auto rhglobaly = std::make_unique<std::vector<float>>();
132  rhglobaly->reserve(size);
133  auto rhglobalz = std::make_unique<std::vector<float>>();
134  rhglobalz->reserve(size);
135  auto rhstrip = std::make_unique<std::vector<float>>();
136  rhstrip->reserve(size);
137  auto rhmerr = std::make_unique<std::vector<float>>();
138  rhmerr->reserve(size);
139  auto ubstrip = std::make_unique<std::vector<float>>();
140  ubstrip->reserve(size);
141  auto ubmerr = std::make_unique<std::vector<float>>();
142  ubmerr->reserve(size);
143  auto driftx = std::make_unique<std::vector<float>>();
144  driftx->reserve(size);
145  auto drifty = std::make_unique<std::vector<float>>();
146  drifty->reserve(size);
147  auto driftz = std::make_unique<std::vector<float>>();
148  driftz->reserve(size);
149  auto globalZofunitlocalY = std::make_unique<std::vector<float>>();
150  globalZofunitlocalY->reserve(size);
151 
152  edm::ESHandle<TrackerGeometry> theTrackerGeometry = iSetup.getHandle(geomToken_);
155 
158 
160 
161  size_t ontrk_cluster_idx = 0;
162  std::map<size_t, std::vector<size_t>> mapping; //cluster idx --> on trk cluster idx (multiple)
163 
165  association != associations->end();
166  association++) {
167  const Trajectory* traj = association->key.get();
168  const reco::Track* track = association->val.get();
169  int trk_idx = shallow::findTrackIndex(tracks, track);
170  size_t trk_strt_idx = ontrk_cluster_idx;
171 
172  for (auto const& measurement : traj->measurements()) {
173  const TrajectoryStateOnSurface& tsos = measurement.updatedState();
175  combiner(measurement.forwardPredictedState(), measurement.backwardPredictedState());
176 
177  const TrackingRecHit* hit = measurement.recHit()->hit();
178  const SiStripRecHit1D* hit1D = dynamic_cast<const SiStripRecHit1D*>(hit);
179  const SiStripRecHit2D* hit2D = dynamic_cast<const SiStripRecHit2D*>(hit);
180  const SiStripMatchedRecHit2D* matchedhit = dynamic_cast<const SiStripMatchedRecHit2D*>(hit);
181 
182  for (unsigned h = 0; h < 2; h++) { //loop over possible Hit options (1D, 2D)
183  const SiStripCluster* cluster_ptr;
184  if (!matchedhit && h == 1)
185  continue;
186  else if (matchedhit && h == 0)
187  cluster_ptr = &matchedhit->monoCluster();
188  else if (matchedhit && h == 1)
189  cluster_ptr = &matchedhit->stereoCluster();
190  else if (hit2D)
191  cluster_ptr = (hit2D->cluster()).get();
192  else if (hit1D)
193  cluster_ptr = (hit1D->cluster()).get();
194  else
195  continue;
196 
197  shallow::CLUSTERMAP::const_iterator cluster =
198  clustermap.find(std::make_pair(hit->geographicalId().rawId(), cluster_ptr->firstStrip()));
199  if (cluster == clustermap.end())
200  throw cms::Exception("Logic Error") << "Cluster not found: this could be a configuration error" << std::endl;
201 
202  unsigned i = cluster->second;
203 
204  //find if cluster was already assigned to a previous track
205  auto already_visited = mapping.find(i);
206  int nassociations = 1;
207  if (already_visited != mapping.end()) {
208  nassociations += already_visited->second.size();
209  for (size_t idx : already_visited->second) {
210  trackmulti->at(idx)++;
211  }
212  already_visited->second.push_back(ontrk_cluster_idx);
213  } else { //otherwise store this
214  std::vector<size_t> single = {ontrk_cluster_idx};
215  mapping.insert(std::make_pair(i, single));
216  }
217 
218  const StripGeomDetUnit* theStripDet =
219  dynamic_cast<const StripGeomDetUnit*>(theTrackerGeometry->idToDet(hit->geographicalId()));
221 
222  if (nassociations == 1)
223  onTrkClusterIdx->at(i) = ontrk_cluster_idx; //link: general cluster info --> on track cluster
224  clusterIdx->push_back(i); //link: on trk cluster --> general cluster info
225  trackmulti->push_back(nassociations);
226  trackindex->push_back(trk_idx);
227  localtheta->push_back((theStripDet->toLocal(tsos.globalDirection())).theta());
228  localphi->push_back((theStripDet->toLocal(tsos.globalDirection())).phi());
229  localpitch->push_back(
230  (theStripDet->specificTopology()).localPitch(theStripDet->toLocal(tsos.globalPosition())));
231  localx->push_back((theStripDet->toLocal(tsos.globalPosition())).x());
232  localy->push_back((theStripDet->toLocal(tsos.globalPosition())).y());
233  localz->push_back((theStripDet->toLocal(tsos.globalPosition())).z());
234  strip->push_back((theStripDet->specificTopology()).strip(theStripDet->toLocal(tsos.globalPosition())));
235  globaltheta->push_back(tsos.globalDirection().theta());
236  globalphi->push_back(tsos.globalDirection().phi());
237  globalx->push_back(tsos.globalPosition().x());
238  globaly->push_back(tsos.globalPosition().y());
239  globalz->push_back(tsos.globalPosition().z());
240  insidistance->push_back(1. / fabs(cos(localtheta->at(ontrk_cluster_idx))));
241  projwidth->push_back(tan(localtheta->at(ontrk_cluster_idx)) * cos(localphi->at(ontrk_cluster_idx)));
242  BdotY->push_back((theStripDet->surface()).toLocal(magfield->inTesla(theStripDet->surface().position())).y());
243  covered->push_back(drift.z() / localpitch->at(ontrk_cluster_idx) *
244  fabs(projwidth->at(ontrk_cluster_idx) - drift.x() / drift.z()));
245  rhlocalx->push_back(hit->localPosition().x());
246  rhlocaly->push_back(hit->localPosition().y());
247  rhlocalxerr->push_back(sqrt(hit->localPositionError().xx()));
248  rhlocalyerr->push_back(sqrt(hit->localPositionError().yy()));
249  rhglobalx->push_back(theStripDet->toGlobal(hit->localPosition()).x());
250  rhglobaly->push_back(theStripDet->toGlobal(hit->localPosition()).y());
251  rhglobalz->push_back(theStripDet->toGlobal(hit->localPosition()).z());
252  rhstrip->push_back(theStripDet->specificTopology().strip(hit->localPosition()));
253  rhmerr->push_back(sqrt(
254  theStripDet->specificTopology().measurementError(hit->localPosition(), hit->localPositionError()).uu()));
255  ubstrip->push_back(theStripDet->specificTopology().strip(unbiased.localPosition()));
256  ubmerr->push_back(sqrt(theStripDet->specificTopology()
257  .measurementError(unbiased.localPosition(), unbiased.localError().positionError())
258  .uu()));
259  driftx->push_back(drift.x());
260  drifty->push_back(drift.y());
261  driftz->push_back(drift.z());
262  globalZofunitlocalY->push_back((theStripDet->toGlobal(LocalVector(0, 1, 0))).z());
263 
264  ontrk_cluster_idx++;
265  } //for(unsigned h=0; h<2; h++) { //loop over possible Hit options (1D, 2D)
266  } //for(auto const& measurement : traj->measurements() )
267 
268  onTrkClustersBegin->at(trk_idx) = trk_strt_idx;
269  onTrkClustersEnd->at(trk_idx) = ontrk_cluster_idx;
270 
271  } //for(TrajTrackAssociationCollection::const_iterator association = associations->begin();
272 
273  iEvent.put(std::move(clusterIdx), Prefix + "clusterIdx" + Suffix);
274  iEvent.put(std::move(onTrkClusterIdx), Prefix + "onTrkClusterIdx" + Suffix);
275  iEvent.put(std::move(onTrkClustersBegin), Prefix + "onTrkClustersBegin" + Suffix);
276  iEvent.put(std::move(onTrkClustersEnd), Prefix + "onTrkClustersEnd" + Suffix);
277  iEvent.put(std::move(trackindex), Prefix + "trackindex" + Suffix);
278 
279  iEvent.put(std::move(trackmulti), Prefix + "trackmulti" + Suffix);
280  iEvent.put(std::move(localtheta), Prefix + "localtheta" + Suffix);
281  iEvent.put(std::move(localphi), Prefix + "localphi" + Suffix);
282  iEvent.put(std::move(localpitch), Prefix + "localpitch" + Suffix);
283  iEvent.put(std::move(localx), Prefix + "localx" + Suffix);
284  iEvent.put(std::move(localy), Prefix + "localy" + Suffix);
285  iEvent.put(std::move(localz), Prefix + "localz" + Suffix);
286  iEvent.put(std::move(strip), Prefix + "strip" + Suffix);
287  iEvent.put(std::move(globaltheta), Prefix + "globaltheta" + Suffix);
288  iEvent.put(std::move(globalphi), Prefix + "globalphi" + Suffix);
289  iEvent.put(std::move(globalx), Prefix + "globalx" + Suffix);
290  iEvent.put(std::move(globaly), Prefix + "globaly" + Suffix);
291  iEvent.put(std::move(globalz), Prefix + "globalz" + Suffix);
292  iEvent.put(std::move(insidistance), Prefix + "insidistance" + Suffix);
293  iEvent.put(std::move(covered), Prefix + "covered" + Suffix);
294  iEvent.put(std::move(projwidth), Prefix + "projwidth" + Suffix);
295  iEvent.put(std::move(BdotY), Prefix + "BdotY" + Suffix);
296  iEvent.put(std::move(rhlocalx), Prefix + "rhlocalx" + Suffix);
297  iEvent.put(std::move(rhlocaly), Prefix + "rhlocaly" + Suffix);
298  iEvent.put(std::move(rhlocalxerr), Prefix + "rhlocalxerr" + Suffix);
299  iEvent.put(std::move(rhlocalyerr), Prefix + "rhlocalyerr" + Suffix);
300  iEvent.put(std::move(rhglobalx), Prefix + "rhglobalx" + Suffix);
301  iEvent.put(std::move(rhglobaly), Prefix + "rhglobaly" + Suffix);
302  iEvent.put(std::move(rhglobalz), Prefix + "rhglobalz" + Suffix);
303  iEvent.put(std::move(rhstrip), Prefix + "rhstrip" + Suffix);
304  iEvent.put(std::move(rhmerr), Prefix + "rhmerr" + Suffix);
305  iEvent.put(std::move(ubstrip), Prefix + "ubstrip" + Suffix);
306  iEvent.put(std::move(ubmerr), Prefix + "ubmerr" + Suffix);
307  iEvent.put(std::move(driftx), Prefix + "driftx" + Suffix);
308  iEvent.put(std::move(drifty), Prefix + "drifty" + Suffix);
309  iEvent.put(std::move(driftz), Prefix + "driftz" + Suffix);
310  iEvent.put(std::move(globalZofunitlocalY), Prefix + "globalZofunitlocalY" + Suffix);
311 }
void produce(edm::Event &, const edm::EventSetup &) override
size
Write out results.
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
const edm::EDGetTokenT< edmNew::DetSetVector< SiStripCluster > > clusters_token_
uint16_t firstStrip() const
ShallowTrackClustersProducer(const edm::ParameterSet &)
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:58
T z() const
Definition: PV3DBase.h:61
int findTrackIndex(const edm::Handle< edm::View< reco::Track > > &h, const reco::Track *t)
Definition: ShallowTools.cc:25
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
LocalVector drift(const StripGeomDetUnit *, const MagneticField &, const SiStripLorentzAngle &)
Definition: ShallowTools.cc:36
const edm::EDGetTokenT< edm::View< reco::Track > > tracks_token_
ClusterRef cluster() const
int single(int argc, char *argv[])
Definition: DMRsingle.cc:18
std::tuple< layerClusterToCaloParticle, caloParticleToLayerCluster > association
virtual float strip(const LocalPoint &) const =0
DataContainer const & measurements() const
Definition: Trajectory.h:178
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
int iEvent
Definition: GenABIO.cc:224
GlobalPoint globalPosition() const
virtual MeasurementError measurementError(const LocalPoint &, const LocalError &) const =0
SiStripCluster const & monoCluster() const
T sqrt(T t)
Definition: SSEVec.h:23
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magFieldToken_
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
const TrackerGeomDet * idToDet(DetId) const override
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
LocalVector toLocal(const reco::Track::Vector &v, const Surface &s)
const edm::EDGetTokenT< TrajTrackAssociationCollection > association_token_
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
const PositionType & position() const
GlobalVector globalDirection() const
const edm::ESGetToken< SiStripLorentzAngle, SiStripLorentzAngleDepRcd > laToken_
SiStripCluster const & stereoCluster() const
CLUSTERMAP make_cluster_map(const edm::Event &, const edm::EDGetTokenT< edmNew::DetSetVector< SiStripCluster > > &)
Definition: ShallowTools.cc:12
fixed size matrix
HLT enums.
std::map< std::pair< uint32_t, uint16_t >, unsigned int > CLUSTERMAP
Definition: ShallowTools.h:21
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
ClusterRef cluster() const
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomToken_
def move(src, dest)
Definition: eostools.py:511
Geom::Theta< T > theta() const
Definition: PV3DBase.h:72