CMS 3D CMS Logo

CTPPSDiamondTrackRecognition.cc
Go to the documentation of this file.
1 /****************************************************************************
2  *
3  * This is a part of CTPPS offline software.
4  * Authors:
5  * Laurent Forthomme (laurent.forthomme@cern.ch)
6  * Nicola Minafra (nicola.minafra@cern.ch)
7  * Mateusz Szpyrka (mateusz.szpyrka@cern.ch)
8  *
9  ****************************************************************************/
10 
12 
13 //----------------------------------------------------------------------------------------------------
14 
17  excludeSingleEdgeHits_(iConfig.getParameter<bool>("excludeSingleEdgeHits")) {}
18 
19 //----------------------------------------------------------------------------------------------------
20 
23  mhMap_.clear();
24 }
25 
26 //----------------------------------------------------------------------------------------------------
27 
29  if (excludeSingleEdgeHits_ && recHit.toT() <= 0.)
30  return;
31  // store hit parameters
32  hitVectorMap_[recHit.ootIndex()].emplace_back(recHit);
33 }
34 
35 //----------------------------------------------------------------------------------------------------
36 
38  int numberOfTracks = 0;
39  DimensionParameters param;
40 
41  auto getX = [](const CTPPSDiamondRecHit& hit) { return hit.x(); };
42  auto getXWidth = [](const CTPPSDiamondRecHit& hit) { return hit.xWidth(); };
43  auto setX = [](CTPPSDiamondLocalTrack& track, float x) { track.setPosition(math::XYZPoint(x, 0., 0.)); };
44  auto setXSigma = [](CTPPSDiamondLocalTrack& track, float sigma) {
45  track.setPositionSigma(math::XYZPoint(sigma, 0., 0.));
46  };
47 
48  for (const auto& hitBatch : hitVectorMap_) {
49  // separate the tracking for each bunch crossing
50  const auto& oot = hitBatch.first;
51  const auto& hits = hitBatch.second;
52 
53  auto hitRange = getHitSpatialRange(hits);
54 
55  TrackVector xPartTracks;
56 
57  // produce tracks in x dimension
58  param.rangeBegin = hitRange.xBegin;
59  param.rangeEnd = hitRange.xEnd;
60  producePartialTracks(hits, param, getX, getXWidth, setX, setXSigma, xPartTracks);
61 
62  if (xPartTracks.empty())
63  continue;
64 
65  const float yRangeCenter = 0.5f * (hitRange.yBegin + hitRange.yEnd);
66  const float zRangeCenter = 0.5f * (hitRange.zBegin + hitRange.zEnd);
67  const float ySigma = 0.5f * (hitRange.yEnd - hitRange.yBegin);
68  const float zSigma = 0.5f * (hitRange.zEnd - hitRange.zBegin);
69 
70  for (const auto& xTrack : xPartTracks) {
71  math::XYZPoint position(xTrack.x0(), yRangeCenter, zRangeCenter);
72  math::XYZPoint positionSigma(xTrack.x0Sigma(), ySigma, zSigma);
73 
74  const int multipleHits = (mhMap_.find(oot) != mhMap_.end()) ? mhMap_[oot] : 0;
75  CTPPSDiamondLocalTrack newTrack(position, positionSigma, 0.f, 0.f, oot, multipleHits);
76 
77  // find contributing hits
78  HitVector componentHits;
79  for (const auto& hit : hits)
80  if (newTrack.containsHit(hit, tolerance_) && (!excludeSingleEdgeHits_ || hit.toT() > 0.))
81  componentHits.emplace_back(hit);
82  // compute timing information
83  float mean_time = 0.f, time_sigma = 0.f;
84  bool valid_hits = timeEval(componentHits, mean_time, time_sigma);
85  newTrack.setValid(valid_hits);
86  newTrack.setTime(mean_time);
87  newTrack.setTimeSigma(time_sigma);
88 
89  tracks.push_back(newTrack);
90  }
91  }
92 
93  return numberOfTracks;
94 }
void producePartialTracks(const HitVector &hits, const DimensionParameters &param, float(*getHitCenter)(const CTPPSDiamondRecHit &), float(*getHitRangeWidth)(const CTPPSDiamondRecHit &), void(*setTrackCenter)(CTPPSDiamondLocalTrack &, float), void(*setTrackSigma)(CTPPSDiamondLocalTrack &, float), TrackVector &result)
Reconstructed hit in diamond detectors.
int produceTracks(edm::DetSet< CTPPSDiamondLocalTrack > &tracks) override
Produce a collection of tracks for the current station, given its hits collection.
virtual void clear()
Reset internal state of a class instance.
bool containsHit(const CTPPSDiamondRecHit &recHit, float tolerance=0.1) const
void setTimeSigma(float t_sigma)
double f[11][100]
CTPPSDiamondTrackRecognition(const edm::ParameterSet &iConfig)
auto const & tracks
cannot be loose
HitVectorMap hitVectorMap_
RecHit vectors that should be processed separately while reconstructing tracks.
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
std::unordered_map< int, int > mhMap_
bool timeEval(const HitVector &hits, float &meanTime, float &timeSigma) const
static int position[264][3]
Definition: ReadPGInfo.cc:289
void addHit(const CTPPSDiamondRecHit &recHit) override
Feed a new hit to the tracks recognition algorithm.
void clear() override
Reset internal state of a class instance.