132 def peel(self, track):
133 """Aggregate the track and MC information for track-segment analysis"""
134 track_fitter = self.track_fitter
135
136 rl_drift_circle = 1
137 unit_variance = 0
138 observations2D = TFCDC.CDCObservations2D(rl_drift_circle, unit_variance)
139
140 for recoHit3D in track:
141 observations2D.append(recoHit3D)
142
143 trajectory2D = track_fitter.fit(observations2D)
144 trajectory2D.setLocalOrigin(TFCDC.Vector2D(0, 0))
145
146 n_hits = track.size()
147 pt = trajectory2D.getAbsMom2D()
148 curv = trajectory2D.getCurvature()
149 curl_curv = abs(self.lower_curv_bounds[0])
150 bin_curv = curv if abs(curv) < curl_curv else abs(curv)
151 curv_var = trajectory2D.getLocalVariance(0)
152 impact = trajectory2D.getGlobalImpact()
153 phi0 = trajectory2D.getLocalCircle().phi0()
154
155 circle = trajectory2D.getLocalCircle()
156 n12 = circle.n12()
157
158 cross_curvs = []
159 for recoHit3D in track:
160 wire_ref_pos = recoHit3D.getRefPos2D()
161 drift_length = recoHit3D.getSignedRecoDriftLength()
162 r = wire_ref_pos.norm()
163 cross_curv = -2 * (n12.dot(wire_ref_pos) - drift_length) / (r * r - drift_length * drift_length)
164 cross_curvs.append(cross_curv)
165
166 cross_curvs = np.array(cross_curvs)
167 cross_curv = np.median(cross_curvs)
168 cross_curv_var = np.median(np.abs(cross_curvs - cross_curv))
169
170 basic_curv_precision = TFCDC.PrecisionUtil.getBasicCurvPrecision(cross_curv)
171 origin_curv_precision = TFCDC.PrecisionUtil.getOriginCurvPrecision(cross_curv)
172 non_origin_curv_precision = TFCDC.PrecisionUtil.getNonOriginCurvPrecision(cross_curv)
173
174 bin_id = np.digitize([abs(cross_curv)], self.lower_curv_bounds)
175 if bin_id == 0:
176 max_curv_precision = 0.00007
177 else:
178 max_curv_precision = self.upper_curv_bounds[bin_id - 1] - self.lower_curv_bounds[bin_id - 1]
179
180 random_bin_id = random.randrange(len(self.upper_curv_bounds))
181 random_lower_curv_bound = self.lower_curv_bounds[random_bin_id]
182 random_upper_curv_bound = self.upper_curv_bounds[random_bin_id]
183 curv_dense = random.uniform(random_lower_curv_bound, random_upper_curv_bound)
184 curv_width = random_upper_curv_bound - random_lower_curv_bound
185
186 return dict(
187 n_hits=n_hits,
188 curvature_estimate=curv,
189 curvature_variance=curv_var,
190 abs_curvature_estimate=abs(curv),
191 inv_curv=1.0 / abs(curv),
192 cross_curv=cross_curv,
193 cross_curv_var=cross_curv_var,
194 basic_curv_precision=basic_curv_precision,
195 origin_curv_precision=origin_curv_precision,
196 non_origin_curv_precision=non_origin_curv_precision,
197 max_curv_precision=max_curv_precision,
198 pt=pt,
199 curv_bin=bin_curv,
200 curv_dense=curv_dense,
201 curv_width=curv_width,
202 impact_estimate=impact,
203 phi0=phi0,
204 )
205