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