Belle II Software  release-05-02-19
BasicTrackVarSet.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2018 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Nils Braun, Michael Eliachevitch *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #include <tracking/trackFindingCDC/filters/track/BasicTrackVarSet.h>
11 
12 #include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h>
13 
14 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
15 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory3D.h>
16 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
17 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectorySZ.h>
18 
19 #include <tracking/trackFindingCDC/numerics/ToFinite.h>
20 
21 #include <tracking/trackFindingCDC/utilities/Algorithms.h>
22 #include <tracking/trackFindingCDC/utilities/Functional.h>
23 #include <numeric>
24 #include <set>
25 
26 #include <cdc/dataobjects/CDCHit.h>
27 
28 using namespace Belle2;
29 using namespace TrackFindingCDC;
30 
32 {
33  if (not track) return false;
34 
35  if (track->empty()) {
36  return false;
37  }
38 
39  // use boost accumulators, which lazily provide different statistics (mean, variance, ...) for the
40  // data that they accumulate (i.e. are "filled" with).
41  statistics_accumulator drift_length_acc; /* correlated to actual distance from hit to wire*/
42  statistics_accumulator adc_acc; /* integrated charge over the cell*/
43  statistics_accumulator empty_s_acc; /* gap within the track?!*/
44  statistics_accumulator tot_acc; /* time over threshold */
45  /* continuous layer number [from 0 to 55] (not to be distinguished from SuperLayer [from 0 to 8] or Layer (within SuperLayer, so from [0 to 7]) */
46  statistics_accumulator cont_layer_acc;
47  statistics_accumulator super_layer_acc;
48 
49  unsigned int size = track->size();
50 
51  std::vector<unsigned int> cont_layer;
52  std::vector<unsigned int> super_layer;
53  // Fill accumulators with ADC and drift circle information
54  for (const CDCRecoHit3D& recoHit : *track) {
55  drift_length_acc(recoHit.getWireHit().getRefDriftLength());
56  adc_acc(static_cast<unsigned int>(recoHit.getWireHit().getHit()->getADCCount()));
57  tot_acc(static_cast<unsigned int>(recoHit.getWireHit().getHit()->getTOT()));
58  cont_layer_acc(static_cast<unsigned int>(recoHit.getWireHit().getHit()->getICLayer()));
59  super_layer_acc(static_cast<unsigned int>(recoHit.getWireHit().getISuperLayer()));
60  cont_layer.push_back(static_cast<unsigned int>(recoHit.getWireHit().getHit()->getICLayer()));
61  super_layer.push_back(static_cast<unsigned int>(recoHit.getWireHit().getISuperLayer()));
62  }
63 
64  // extract wanted quantities from layers
65  unsigned int cont_layer_first = cont_layer.front();
66  unsigned int cont_layer_last = cont_layer.back();
67  unsigned int cont_layer_min = *std::min_element(cont_layer.begin(), cont_layer.end());
68  unsigned int cont_layer_max = *std::max_element(cont_layer.begin(), cont_layer.end());
69  unsigned int cont_layer_count = std::set<unsigned int>(cont_layer.begin(), cont_layer.end()).size();
70  double cont_layer_occupancy = (double)cont_layer_count / (double)(cont_layer_max - cont_layer_min +
71  1); // +1 b/c the first layer should also be counted
72  unsigned int super_layer_first = super_layer.front();
73  unsigned int super_layer_last = super_layer.back();
74  unsigned int super_layer_min = *std::min_element(super_layer.begin(), super_layer.end());
75  unsigned int super_layer_max = *std::max_element(super_layer.begin(), super_layer.end());
76  unsigned int super_layer_count = std::set<unsigned int>(super_layer.begin(), super_layer.end()).size();
77  double super_layer_occupancy = (double)super_layer_count / (double)(super_layer_max - super_layer_min + 1);
78 
79  double hits_per_layer = (double)size / (double)cont_layer_count;
80 
81  // Extract empty_s (ArcLength2D gap) information
82  double s_range = track->back().getArcLength2D() - track->front().getArcLength2D();
83  double avg_hit_dist = s_range / (double)cont_layer_count;
84 
85  // fill a vector with all 2D arc lengths in track
86  std::vector<double> arc_lengths;
87  auto get_arc_length = [](const CDCRecoHit3D & recoHit) { return recoHit.getArcLength2D(); };
88  std::transform(begin(*track), end(*track), back_inserter(arc_lengths), get_arc_length);
89  // Remove all NAN elements. For some reason, last hit in track is sometimes NAN
90  erase_remove_if(arc_lengths, IsNaN());
91 
92  // calculate gaps in arc length s between adjacent hits
93  // beware: first element not a difference but mapped onto itself, empty_s_gaps[0] = arc_lengths[0]
94  if (arc_lengths.size() > 1) {
95  std::vector<double> empty_s_gaps;
96  std::adjacent_difference(begin(arc_lengths), end(arc_lengths), back_inserter(empty_s_gaps));
97 
98  // Wrap a reference to empty_s_acc in a lambda, b/c it is passed by value to the following
99  // for_each. If used directly, only a copy would filled in the for_each.
100  auto empty_s_acc_ref = [&empty_s_acc](double s) { empty_s_acc(s); };
101  // start filling accumulator with hit gaps, but skip first which is not a difference
102  std::for_each(next(begin(empty_s_gaps)), end(empty_s_gaps), empty_s_acc_ref);
103  }
104 
105  unsigned int empty_s_size = bacc::count(empty_s_acc);
106 
107  // Overwrite boost-accumulator behavior for containers with 0 or 1 elements
108  // Set variances containers with for 0/1 elements to -1 (boost default: nan/0 respectively)
109  double drift_length_variance = -1;
110  double adc_variance = -1;
111  double tot_variance = -1;
112  double cont_layer_variance = -1;
113  double super_layer_variance = -1;
114  if (size > 1) {
115  // for more than two elements, calculate variance with bessel correction
116  double bessel_corr = (double)size / (size - 1.0);
117  drift_length_variance = std::sqrt(bacc::variance(drift_length_acc) * bessel_corr);
118  adc_variance = std::sqrt(bacc::variance(adc_acc) * bessel_corr);
119  tot_variance = std::sqrt(bacc::variance(tot_acc) * bessel_corr);
120  cont_layer_variance = std::sqrt(bacc::variance(cont_layer_acc) * bessel_corr);
121  super_layer_variance = std::sqrt(bacc::variance(super_layer_acc) * bessel_corr);
122  }
123  double empty_s_variance = -1;
124  if (empty_s_size > 1) {
125  double empty_s_bessel_corr = (double)empty_s_size / (empty_s_size - 1.0);
126  empty_s_variance = std::sqrt(bacc::variance(empty_s_acc) * empty_s_bessel_corr);
127  }
128 
129  const CDCTrajectory3D& trajectory3D = track->getStartTrajectory3D();
130  const CDCTrajectory2D& trajectory2D = trajectory3D.getTrajectory2D();
131  const CDCTrajectorySZ& trajectorySZ = trajectory3D.getTrajectorySZ();
132 
133  var<named("pt")>() = toFinite(trajectory2D.getAbsMom2D(), 0);
134  var<named("size")>() = size;
135  var<named("hits_per_layer")>() = hits_per_layer;
136 
137  var<named("sz_slope")>() = toFinite(trajectorySZ.getTanLambda(), 0);
138  var<named("z0")>() = toFinite(trajectorySZ.getZ0(), 0);
139  var<named("s_range")>() = toFinite(s_range, 0);
140  var<named("avg_hit_dist")>() = toFinite(avg_hit_dist, 0);
141  var<named("has_matching_segment")>() = track->getHasMatchingSegment();
142 
143  var<named("cont_layer_mean")>() = toFinite(bacc::mean(cont_layer_acc), 0);
144  var<named("cont_layer_variance")>() = toFinite(cont_layer_variance, 0);
145  var<named("cont_layer_max")>() = toFinite(cont_layer_max, 0);
146  var<named("cont_layer_min")>() = toFinite(cont_layer_min, 0);
147  var<named("cont_layer_first")>() = toFinite(cont_layer_first, 0);
148  var<named("cont_layer_last")>() = toFinite(cont_layer_last, 0);
149  var<named("cont_layer_max_vs_last")>() = toFinite(cont_layer_max - cont_layer_last, 0);
150  var<named("cont_layer_first_vs_min")>() = toFinite(cont_layer_first - cont_layer_min, 0);
151  var<named("cont_layer_count")>() = toFinite(cont_layer_count, 0);
152  var<named("cont_layer_occupancy")>() = toFinite(cont_layer_occupancy, 0);
153 
154  var<named("super_layer_mean")>() = toFinite(bacc::mean(super_layer_acc), 0);
155  var<named("super_layer_variance")>() = toFinite(super_layer_variance, 0);
156  var<named("super_layer_max")>() = toFinite(super_layer_max, 0);
157  var<named("super_layer_min")>() = toFinite(super_layer_min, 0);
158  var<named("super_layer_first")>() = toFinite(super_layer_first, 0);
159  var<named("super_layer_last")>() = toFinite(super_layer_last, 0);
160  var<named("super_layer_max_vs_last")>() = toFinite(super_layer_max - super_layer_last, 0);
161  var<named("super_layer_first_vs_min")>() = toFinite(super_layer_first - super_layer_min, 0);
162  var<named("super_layer_count")>() = toFinite(super_layer_count, 0);
163  var<named("super_layer_occupancy")>() = toFinite(super_layer_occupancy, 0);
164 
165  var<named("drift_length_mean")>() = toFinite(bacc::mean(drift_length_acc), 0);
166  var<named("drift_length_variance")>() = toFinite(drift_length_variance, 0);
167  var<named("drift_length_max")>() = toFinite(bacc::max(drift_length_acc), 0);
168  var<named("drift_length_min")>() = toFinite(bacc::min(drift_length_acc), 0);
169  var<named("drift_length_sum")>() = toFinite(bacc::sum(drift_length_acc), 0);
170 
171  var<named("adc_mean")>() = toFinite(bacc::mean(adc_acc), 0);
172  var<named("adc_variance")>() = toFinite(adc_variance, 0);
173  var<named("adc_max")>() = toFinite(bacc::max(adc_acc), 0);
174  var<named("adc_min")>() = toFinite(bacc::min(adc_acc), 0);
175  var<named("adc_sum")>() = toFinite(bacc::sum(adc_acc), 0);
176 
177  var<named("tot_mean")>() = toFinite(bacc::mean(tot_acc), 0);
178  var<named("tot_variance")>() = toFinite(tot_variance, 0);
179  var<named("tot_max")>() = toFinite(bacc::max(tot_acc), 0);
180  var<named("tot_min")>() = toFinite(bacc::min(tot_acc), 0);
181  var<named("tot_sum")>() = toFinite(bacc::sum(tot_acc), 0);
182 
183  var<named("empty_s_mean")>() = toFinite(bacc::mean(empty_s_acc), 0);
184  var<named("empty_s_sum")>() = toFinite(bacc::sum(empty_s_acc), 0);
185  var<named("empty_s_variance")>() = toFinite(empty_s_variance, 0);
186  var<named("empty_s_max")>() = toFinite(bacc::max(empty_s_acc), 0);
187  var<named("empty_s_min")>() = toFinite(bacc::min(empty_s_acc), 0);
188 
189  return true;
190 }
Belle2::TrackFindingCDC::CDCRecoHit3D
Class representing a three dimensional reconstructed hit.
Definition: CDCRecoHit3D.h:62
Belle2::TrackFindingCDC::CDCTrack
Class representing a sequence of three dimensional reconstructed hits.
Definition: CDCTrack.h:51
Belle2::TrackFindingCDC::BasicTrackVarSet::extract
bool extract(const CDCTrack *track) override
Generate and assign the contained variables.
Definition: BasicTrackVarSet.cc:31
Belle2::TrackFindingCDC::CDCTrajectorySZ
Linear trajectory in sz space.
Definition: CDCTrajectorySZ.h:41
Belle2::TrackFindingCDC::CDCTrajectory2D
Particle trajectory as it is seen in xy projection represented as a circle.
Definition: CDCTrajectory2D.h:46
Belle2::TrackFindingCDC::CDCTrajectory3D::getTrajectory2D
CDCTrajectory2D getTrajectory2D() const
Getter for the two dimensional trajectory.
Definition: CDCTrajectory3D.cc:336
Belle2::TrackFindingCDC::CDCTrajectory3D::getTrajectorySZ
CDCTrajectorySZ getTrajectorySZ() const
Getter for the sz trajectory.
Definition: CDCTrajectory3D.cc:343
Belle2::TrackFindingCDC::CDCTrajectorySZ::getZ0
double getZ0() const
Getter for the z coordinate at zero travel distance.
Definition: CDCTrajectorySZ.h:118
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TrackFindingCDC::BasicTrackVarSet::statistics_accumulator
bacc::accumulator_set< double, statistics_set > statistics_accumulator
A boost accumulators set that aggregates statistics for the values it is called with.
Definition: BasicTrackVarSet.h:143
Belle2::TrackFindingCDC::VarSet< BasicTrackVarSetNames >::named
constexpr static int named(const char *name)
Getter for the index from the name.
Definition: VarSet.h:88
Belle2::TrackFindingCDC::VarSet< BasicTrackVarSetNames >::var
Float_t & var()
Reference getter for the value of the ith variable. Static version.
Definition: VarSet.h:103
Belle2::TrackFindingCDC::CDCTrajectorySZ::getTanLambda
double getTanLambda() const
Getter for the slope over the travel distance coordinate.
Definition: CDCTrajectorySZ.h:114
Belle2::TrackFindingCDC::CDCTrajectory3D
Particle full three dimensional trajectory.
Definition: CDCTrajectory3D.h:47
Belle2::TrackFindingCDC::IsNaN
Unary functor for equality comparison to NAN.
Definition: Functional.h:549
Belle2::TrackFindingCDC::CDCTrajectory2D::getAbsMom2D
double getAbsMom2D(double bZ) const
Get the estimation for the absolute value of the transvers momentum.