188 {
189 TRT_TrackSegmentsMaker_BarrelCosmics::EventData &
191
193
194 ATH_MSG_DEBUG(
"InDet::TRT_TrackSegmentsMaker_BarrelCosmics::find()" );
195
196
198
199 if (!event_data.m_segmentDriftCircles.empty()) {
200 msg(MSG::WARNING) <<
"TRT_TrackSegmentsMaker_BarrelCosmics::find() probably called twice per event? or newEvent / newRegion have not been called. check your program" <<
endmsg;
201 event_data.clear(); return;
202 }
203
204 std::vector<double> x0,
phi, pivotX, pivotY, Xparabola, cotanParabola, InverseR;
205 std::vector<int> nHitsPosY, nHitsNegY;
206
207
208 int nIterations(15), countCalls(0);
209 while (countCalls<150) {
210
211 double xRange(1000.),
phiRange(M_PI_4);
212 double par[] = {0., M_PI_2, 0., 0., 0., 0., 0., 0.};
213 int foundSeed(0);
214
215 for (
int i=0;
i<nIterations;
i++) {
216
217 countCalls++;
218 foundSeed =
findSeed( par[0]-xRange, par[0]+xRange, par[1]-phiRange, par[1]+phiRange, par, event_data);
219 if ( !foundSeed ) break;
220
221 xRange /= 3.;
223 if ( xRange < 0.01 || phiRange < 0.00001) break;
224 }
225 if (!foundSeed) break;
226
228
229
230 int countAssociatedHits[] = {0, 0};
231 double cosphi = std::cos( par[1] );
232 double sinphi = std::sqrt( 1. - cosphi*cosphi );
234
235
236 double measx[200], measy[200];
237 int countMeas(0);
238
239 for (std::vector< Amg::Vector3D>::iterator it = event_data.m_listHitCenter.begin(); it!=event_data.m_listHitCenter.end(); ) {
240
241 double a = (
par[3]-
it->x())*sinphi+(
it->y()-par[4])*cosphi;
242 double b = (
m_magneticField) ? 0.5 * (std::pow(
it->x()-par[3], 2.) + std::pow(
it->y()-par[4], 2.) - std::pow(
a, 2)) : 0.;
243 if ( std::abs(
a+par[2]*b) > range ) { ++
it;
continue; }
244
245 if (
m_magneticField && countMeas<200) { measx[countMeas] =
it->x(); measy[countMeas] =
it->y(); countMeas++; }
246
247 countAssociatedHits[(
it->y()>0)?0:1]++;
248 it = event_data.m_listHitCenter.erase( it );
249 }
250
251 if ( countAssociatedHits[0]+countAssociatedHits[1] <
m_minHitsAboveTOT )
continue;
252
254
255 ATH_MSG_DEBUG(
"countAssociatedHits " << countAssociatedHits[0] <<
" "
257 x0.push_back( par[0] );
phi.push_back( par[1] ); nHitsPosY.push_back( countAssociatedHits[0] ); nHitsNegY.push_back( countAssociatedHits[1] );
258
259 pivotX.push_back( par[3] ); pivotY.push_back( par[4] ); Xparabola.push_back( par[5] ); cotanParabola.push_back( par[6] ); InverseR.push_back( par[7] );
260 }
261
262
263
264
265 int nFoundSegments = x0.size(); if (nFoundSegments>10) nFoundSegments = 10;
266 {
267 for (
int i=0;
i<nFoundSegments;
i++) {
268 event_data.m_segmentDriftCircles.emplace_back();
269 }
270 }
271
274
275 for (
unsigned int i=0;
i<event_data.m_listHits.size();
i++) {
276
277 const Amg::Vector3D ¢er = event_data.m_listHits[
i]->detectorElement()->surface(event_data.m_listHits[i]->identify()).center();
278 for (int j=0; j<nFoundSegments; j++) {
279
280 if (nHitsPosY[j]<5 && center.y()>0.) continue;
281 if (nHitsNegY[j]<5 && center.y()<0.) continue;
282
284 double sinphi = std::sqrt(1./(1+cotanParabola[j]*cotanParabola[j]));
285 double cosphi = std::sqrt(1.-sinphi*sinphi); if (cotanParabola[j]<0.) cosphi *= -1.;
286 double a = (pivotX[j]+Xparabola[j]-center.x())*sinphi+(center.y()-pivotY[j])*cosphi;
287 double b = 0.5 * (std::pow(center.x()-pivotX[j], 2.) + std::pow(center.y()-pivotY[j], 2.) - std::pow(
a, 2)) ;
289
290 } else {
291 double cosphi = std::cos(
phi[j]);
292 double sinphi = std::sqrt(1.-cosphi*cosphi);
293 residual = (x0[j]-center.x())*sinphi+center.y()*cosphi;
294 }
295
296 if (std::abs(residual)<window) {
297 event_data.m_segmentDriftCircles[j].push_back(event_data.m_listHits[i]);
298 break;
299 }
300 }
301 }
302
303
304
305
306
307
308
310
311 if (x0.size()>1) {
312 int mergeI = 0;
313 int mergeJ = 0;
314 double mergeX0(100.), mergePhi(0.1);
315 for (
int i=0;
i<nFoundSegments;
i++) {
316 for (int j=i+1; j<nFoundSegments; j++) {
317 if ( std::abs(x0[i]-x0[j])<mergeX0 && std::abs(
phi[i]-
phi[j])<mergePhi ) {
319 mergeJ = j;
320 mergeX0 = std::abs(x0[i]-x0[j]);
321 mergePhi = std::abs(
phi[i]-
phi[j]);
322 }
323 }
324 }
325 if (mergeI != mergeJ) {
326 ATH_MSG_DEBUG(
"Merge segments " << mergeI <<
" and " << mergeJ <<
" of size "
327 << event_data.m_segmentDriftCircles[mergeI].size() << ", " << event_data.m_segmentDriftCircles[mergeJ].size()
328 << "; difference in the impact par x: " << mergeX0 << " phi: " << mergePhi );
329 for (
unsigned int i=0;
i<event_data.m_segmentDriftCircles[mergeJ].size();
i++) {
330 event_data.m_segmentDriftCircles[mergeI].push_back(event_data.m_segmentDriftCircles[mergeJ][i]);
331 }
332 event_data.m_segmentDriftCircles[mergeJ].clear();
333 }
334 }
335 }
336
337
339 msg(MSG::DEBUG) <<
"find() debug (" << nFoundSegments <<
")" ;
340 for (
unsigned int i=0;
i<event_data.m_segmentDriftCircles.size();
i++) {
341 msg(MSG::DEBUG) <<
" " <<
i <<
" " << event_data.m_segmentDriftCircles[
i].size();
342 }
344 }
345
346 for (
unsigned int i=0;
i<event_data.m_segmentDriftCircles.size();
i++) {
348 double trackpar[] = {x0[
i],
phi[
i]};
349 convert(event_data.m_segmentDriftCircles[i], trackpar, event_data);
350 }
351 ATH_MSG_DEBUG(
"find(), number of converted segments: " << event_data.m_segments.size() );
352}
BooleanProperty m_mergeSegments
void findSeedInverseR(double *par, TRT_TrackSegmentsMaker_BarrelCosmics::EventData &event_data) const
static void segFit(double *measx, double *measy, int nhits, double *residuals=0, double *result=0)
IntegerProperty m_minHitsForSegment
int findSeed(double xmin, double xmax, double phimin, double phimax, double *bestParameters, TRT_TrackSegmentsMaker_BarrelCosmics::EventData &event_data) const
void findOld(TRT_TrackSegmentsMaker_BarrelCosmics::EventData &event_data) const
void convert(std::vector< const InDet::TRT_DriftCircle * > &hits, double *trackpar, TRT_TrackSegmentsMaker_BarrelCosmics::EventData &event_data) const
IntegerProperty m_minHitsAboveTOT
phiRange
Filling Phi ranges.