CMS 3D CMS Logo

CTPPSTimingTrackRecognition.h
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 
11 #ifndef RecoCTPPS_TotemRPLocal_CTPPSTimingTrackRecognition
12 #define RecoCTPPS_TotemRPLocal_CTPPSTimingTrackRecognition
13 
16 
18 
20 
21 #include <vector>
22 #include <unordered_map>
23 #include <algorithm>
24 #include <cmath>
25 
30 template<typename TRACK_TYPE, typename HIT_TYPE>
32 {
33  public:
35  threshold_ (iConfig.getParameter<double>("threshold")),
36  thresholdFromMaximum_ (iConfig.getParameter<double>("thresholdFromMaximum")),
37  resolution_ (iConfig.getParameter<double>("resolution")),
38  sigma_ (iConfig.getParameter<double>("sigma")),
39  tolerance_ (iConfig.getParameter<double>("tolerance")),
40  pixelEfficiencyFunction_(iConfig.getParameter<std::string>("pixelEfficiencyFunction")) {
42  throw cms::Exception("CTPPSTimingTrackRecognition")
43  << "Invalid number of parameters to the pixel efficiency function! "
45  }
46  virtual ~CTPPSTimingTrackRecognition() = default;
47 
48  //--- class API
49 
51  inline virtual void clear() { hitVectorMap_.clear(); }
53  virtual void addHit(const HIT_TYPE& recHit) = 0;
56 
57  protected:
58  // Algorithm parameters:
59  const float threshold_;
60  const float thresholdFromMaximum_;
61  const float resolution_;
62  const float sigma_;
63  const float tolerance_;
65 
66  typedef std::vector<TRACK_TYPE> TrackVector;
67  typedef std::vector<HIT_TYPE> HitVector;
68  typedef std::unordered_map<int, HitVector> HitVectorMap;
69 
71  HitVectorMap hitVectorMap_;
72 
77  struct SpatialRange {
78  float xBegin, xEnd;
79  float yBegin, yEnd;
80  float zBegin, zEnd;
81  };
82 
93  const HitVector& hits,
94  const DimensionParameters& param,
95  float (*getHitCenter)(const HIT_TYPE&),
96  float (*getHitRangeWidth)(const HIT_TYPE&),
97  void (*setTrackCenter)(TRACK_TYPE&, float),
98  void (*setTrackSigma)(TRACK_TYPE&, float),
99  TrackVector& result);
100 
104  SpatialRange getHitSpatialRange(const HitVector& hits);
111  bool timeEval(const HitVector& hits, float& meanTime, float& timeSigma) const;
112 };
113 
114 /****************************************************************************
115  * Implementation
116  ****************************************************************************/
117 
118 template<class TRACK_TYPE, class HIT_TYPE> inline
120  const HitVector& hits,
121  const DimensionParameters& param,
122  float (*getHitCenter)(const HIT_TYPE&),
123  float (*getHitRangeWidth)(const HIT_TYPE&),
124  void (*setTrackCenter)(TRACK_TYPE&, float),
125  void (*setTrackSigma)(TRACK_TYPE&, float),
126  TrackVector& result) {
127  int numberOfTracks = 0;
128  const float invResolution = 1./resolution_;
129  const float profileRangeMargin = sigma_ * 3.;
130  const float profileRangeBegin = param.rangeBegin - profileRangeMargin;
131  const float profileRangeEnd = param.rangeEnd + profileRangeMargin;
132 
133  std::vector<float> hitProfile((profileRangeEnd - profileRangeBegin) * invResolution + 1, 0.);
134  // extra component to make sure that the profile drops below the threshold at range's end
135  *hitProfile.rbegin() = -1.f;
136 
137  // Creates hit profile
138  for (auto const& hit : hits) {
139  const float center = getHitCenter(hit), rangeWidth = getHitRangeWidth(hit);
140  std::vector<double> params{center, rangeWidth, sigma_};
141  for (unsigned int i = 0; i < hitProfile.size(); ++i)
142  hitProfile[i] += pixelEfficiencyFunction_.evaluate(std::vector<double>{profileRangeBegin + i*resolution_}, params);
143  }
144 
145  bool underThreshold = true;
146  float rangeMaximum = -1.0f;
147  bool trackRangeFound = false;
148  int trackRangeBegin = 0, trackRangeEnd = 0;
149 
150  // Searches for tracks in the hit profile
151  for (unsigned int i = 0; i < hitProfile.size(); i++) {
152  if (hitProfile[i] > rangeMaximum)
153  rangeMaximum = hitProfile[i];
154 
155  // Going above the threshold
156  if (underThreshold && hitProfile[i] > threshold_) {
157  underThreshold = false;
158  trackRangeBegin = i;
159  rangeMaximum = hitProfile[i];
160  }
161 
162  // Going under the threshold
163  else if (!underThreshold && hitProfile[i] <= threshold_) {
164  underThreshold = true;
165  trackRangeEnd = i;
166  trackRangeFound = true;
167  }
168 
169  // Finds all tracks within the track range
170  if (trackRangeFound) {
171  float trackThreshold = rangeMaximum - thresholdFromMaximum_;
172  int trackBegin;
173  bool underTrackThreshold = true;
174 
175  for (int j = trackRangeBegin; j <= trackRangeEnd; j++) {
176  if (underTrackThreshold && hitProfile[j] > trackThreshold) {
177  underTrackThreshold = false;
178  trackBegin = j;
179  }
180  else if (!underTrackThreshold && hitProfile[j] <= trackThreshold) {
181  underTrackThreshold = true;
182  TRACK_TYPE track;
183  float leftMargin = profileRangeBegin + resolution_ * trackBegin;
184  float rightMargin = profileRangeBegin + resolution_ * j;
185  setTrackCenter(track, 0.5f*(leftMargin + rightMargin));
186  setTrackSigma(track, 0.5f*(rightMargin - leftMargin));
187  result.push_back(track);
188  numberOfTracks++;
189  }
190  }
191  trackRangeFound = false;
192  }
193  }
194 }
195 
196 template<class TRACK_TYPE, class HIT_TYPE> inline
199 {
200  bool initialized = false;
202 
203  for (const auto& hit : hits) {
204  const float xBegin = hit.getX() - 0.5f*hit.getXWidth(), xEnd = hit.getX() + 0.5f*hit.getXWidth();
205  const float yBegin = hit.getY() - 0.5f*hit.getYWidth(), yEnd = hit.getY() + 0.5f*hit.getYWidth();
206  const float zBegin = hit.getZ() - 0.5f*hit.getZWidth(), zEnd = hit.getZ() + 0.5f*hit.getZWidth();
207 
208  if (!initialized) {
209  result.xBegin = xBegin;
210  result.xEnd = xEnd;
211  result.yBegin = yBegin;
212  result.yEnd = yEnd;
213  result.zBegin = zBegin;
214  result.zEnd = zEnd;
215  initialized = true;
216  continue;
217  }
218  result.xBegin = std::min(result.xBegin, xBegin);
219  result.xEnd = std::max(result.xEnd, xEnd);
220  result.yBegin = std::min(result.yBegin, yBegin);
221  result.yEnd = std::max(result.yEnd, yEnd);
222  result.zBegin = std::min(result.zBegin, zBegin);
223  result.zEnd = std::max(result.zEnd, zEnd);
224  }
225 
226  return result;
227 }
228 
229 template<class TRACK_TYPE, class HIT_TYPE> inline
230 bool
231 CTPPSTimingTrackRecognition<TRACK_TYPE, HIT_TYPE>::timeEval(const HitVector& hits, float& mean_time, float& time_sigma) const
232 {
233  float mean_num = 0.f, mean_denom = 0.f;
234  bool valid_hits = false;
235  for (const auto& hit : hits) {
236  if (hit.getTPrecision() <= 0.)
237  continue;
238  const float weight = std::pow(hit.getTPrecision(), -2);
239  mean_num += weight*hit.getT();
240  mean_denom += weight;
241  valid_hits = true; // at least one valid hit to account for
242  }
243  mean_time = valid_hits ? (mean_num/mean_denom) : 0.f;
244  time_sigma = valid_hits ? std::sqrt(1.f/mean_denom) : 0.f;
245  return valid_hits;
246 }
247 
248 #endif
249 
unsigned int numberOfParameters() const
SpatialRange getHitSpatialRange(const HitVector &hits)
Structure representing a 3D range in space.
void producePartialTracks(const HitVector &hits, const DimensionParameters &param, float(*getHitCenter)(const HIT_TYPE &), float(*getHitRangeWidth)(const HIT_TYPE &), void(*setTrackCenter)(TRACK_TYPE &, float), void(*setTrackSigma)(TRACK_TYPE &, float), TrackVector &result)
virtual ~CTPPSTimingTrackRecognition()=default
Definition: weight.py:1
virtual void clear()
Reset internal state of a class instance.
CTPPSTimingTrackRecognition(const edm::ParameterSet &iConfig)
std::unordered_map< int, HitVector > HitVectorMap
bool timeEval(const HitVector &hits, float &meanTime, float &timeSigma) const
T sqrt(T t)
Definition: SSEVec.h:18
double evaluate(V const &iVariables, P const &iParameters) const
double f[11][100]
T min(T a, T b)
Definition: MathUtil.h:58
reco::FormulaEvaluator pixelEfficiencyFunction_
std::vector< TRACK_TYPE > TrackVector
HitVectorMap hitVectorMap_
RecHit vectors that should be processed separately while reconstructing tracks.
virtual void addHit(const HIT_TYPE &recHit)=0
Add new hit to the set from which the tracks are reconstructed.
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
virtual int produceTracks(edm::DetSet< TRACK_TYPE > &tracks)=0
Produce a collection of tracks, given its hits collection.