114 const std::vector<Trk::PositionAndWeight> & VectorOfPoints)
const
120 std::vector<Trk::PositionAndWeight>::const_iterator begin = VectorOfPoints.begin();
121 std::vector<Trk::PositionAndWeight>::const_iterator end = VectorOfPoints.end();
125 if ( VectorOfPoints.empty() )
return tmpseed ;
126 if ( VectorOfPoints.size() == 1 )
127 return Amg::Vector3D( begin->first.x(), begin->first.y(), begin->first.z() ) ;
130 std::vector< Amg::Vector3D > tmpphi;
131 std::vector< Amg::Vector3D > tmpradi;
132 std::vector< Amg::Vector3D > tmpz;
136 std::vector<Trk::PositionAndWeight> vectorOfPoints ;
138 for (std::vector<PositionAndWeight>::const_iterator i = begin; i!=end; ++i) {
139 double wght = i->second ;
140 double px = i->first.x() ;
if (
px == 0 )
px += 0.000001 ;
141 double py = i->first.y() ;
142 double phi = atan2 (
py,
px ) ;
146 tmpphi.emplace_back(
phi, wght, 1.0*idx ) ;
147 tmpradi.emplace_back(
r, wght, 1.0*idx ) ;
148 tmpz.emplace_back( i->first.z(), wght, 1.0*idx ) ;
150 info.pushPoint (
phi,
r, i->first.z(), wght);
151 vectorOfPoints.push_back( *i ) ;
161 std::vector< std::pair< std::pair <double, std::pair<int,int> >,
double > > allphi;
162 std::vector< std::pair< std::pair <double, std::pair<int,int> >,
double > > allradi;
163 std::vector< std::pair< std::pair <double, std::pair<int,int> >,
double > > allz;
166 for (
unsigned i = 0 ; i < tmpphi.size() ; i++ )
168 std::pair<int,int> xidphi( (
int)( tmpphi[i].
z()), idx ) ;
169 std::pair<int,int> xidradi( (
int)( tmpradi[i].
z() ), idx ) ;
170 std::pair<int,int> xidz( (
int)( tmpz[i].
z() ), idx ) ;
172 std::pair <double, std::pair<int,int> >
phi( tmpphi[i].
x(), xidphi ) ;
173 std::pair <double, std::pair<int,int> > radi( tmpradi[i].
x(), xidradi ) ;
174 std::pair <double, std::pair<int,int> > zz( tmpz[i].
x(), xidz ) ;
176 std::pair< std::pair <double, std::pair<int,int> >,
double > wghtphi(
phi, tmpphi[i].
y() ) ;
177 allphi.push_back( wghtphi ) ;
178 std::pair< std::pair <double, std::pair<int,int> >,
double > wghtradi( radi, tmpradi[i].
y() ) ;
179 allradi.push_back( wghtradi ) ;
180 std::pair< std::pair <double, std::pair<int,int> >,
double > wghtz( zz, tmpz[i].
y() ) ;
181 allz.push_back( wghtz ) ;
190 bool phibroader = false ;
206 bool radiusbroader = false ;
210 ATH_MSG_DEBUG(
" One more searching for a mode in radius !" );
212 radiusbroader = true ;
219 ATH_MSG_DEBUG(
" " << radisz <<
" modes found along radius " );
237 double tmpsdX = 0., tmpsdY = 0., tmpsdXY = 0. ;
243 if ( olphiradi.empty() )
245 if ( phisz > 1 && radisz > 1 )
251 ATH_MSG_DEBUG(
" One more searching for a mode in phi or/and radius !" );
255 ATH_MSG_DEBUG(
" " <<
" more modes found : " << phisz <<
" "<< radisz );
256 olphiradi =
CheckCorrelation( info, vectorOfPoints, info.m_idxphi, info.m_idxradi ) ;
258 if ( olphiradi.empty() )
261 if ( phibroader && radiusbroader )
263 olphiZ =
CheckCorrelation( info, vectorOfPoints, info.m_idxphi, info.m_idxZ, 1 ) ;
264 olradiZ =
CheckCorrelation( info, vectorOfPoints, info.m_idxradi, info.m_idxZ, 1 ) ;
266 if ( olphiZ.empty() && olradiZ.empty() )
267 tmpseed =
Mode2Seed( info, vectorOfPoints, info.m_idxphi, info.m_idxradi, info.m_idxZ ) ;
268 else if ( !olphiZ.empty() && olradiZ.empty() )
269 tmpseed =
Mode2Seed( info, vectorOfPoints, olphiZ, info.m_idxradi ) ;
270 else if ( olphiZ.empty() && !olradiZ.empty() )
271 tmpseed =
Mode2Seed( info, vectorOfPoints, olradiZ, info.m_idxphi ) ;
274 ol_phi_radi_Z =
CheckCorrelation( info, vectorOfPoints, info.m_idxphi, olradiZ, 1 ) ;
275 if ( ol_phi_radi_Z.empty() )
278 tmpseed =
Mode2Seed( info, vectorOfPoints, info.m_idxphi, info.m_idxradi, info.m_idxZ ) ;
281 if ( tmpseed.z() == 0. )
return getClosestPair(info, vectorOfPoints, vx, vy) ;
282 tmpsdX = tmpseed.x() - vx ;
283 tmpsdY = tmpseed.y() - vy ;
284 tmpsdXY = sqrt( tmpsdX*tmpsdX + tmpsdY*tmpsdY ) ;
294 ATH_MSG_DEBUG(
" One more searching for WIDER mode in phi or/and radius !" );
301 if ( ! radiusbroader )
307 olphiradi =
CheckCorrelation( info, vectorOfPoints, info.m_idxphi, info.m_idxradi ) ;
309 if ( olphiradi.empty() )
311 olphiZ =
CheckCorrelation( info, vectorOfPoints, info.m_idxphi, info.m_idxZ, 1 ) ;
312 olradiZ =
CheckCorrelation( info, vectorOfPoints, info.m_idxradi, info.m_idxZ, 1 ) ;
314 if ( olphiZ.empty() && olradiZ.empty() )
315 tmpseed =
Mode2Seed( info, vectorOfPoints, info.m_idxphi, info.m_idxradi, info.m_idxZ ) ;
316 else if ( !olphiZ.empty() && olradiZ.empty() )
317 tmpseed =
Mode2Seed( info, vectorOfPoints, olphiZ, info.m_idxradi ) ;
318 else if ( olphiZ.empty() && !olradiZ.empty() )
319 tmpseed =
Mode2Seed( info, vectorOfPoints, olradiZ, info.m_idxphi ) ;
322 ol_phi_radi_Z =
CheckCorrelation( info, vectorOfPoints, info.m_idxphi, olradiZ, 1 ) ;
323 if ( ol_phi_radi_Z.empty() )
326 tmpseed =
Mode2Seed( info, vectorOfPoints, info.m_idxphi, info.m_idxradi, info.m_idxZ ) ;
329 if ( tmpseed.z() == 0. )
return getClosestPair(info, vectorOfPoints, vx, vy) ;
330 tmpsdX = tmpseed.x() - vx ;
331 tmpsdY = tmpseed.y() - vy ;
332 tmpsdXY = sqrt( tmpsdX*tmpsdX + tmpsdY*tmpsdY ) ;
342 ATH_MSG_DEBUG(
" " << olphiradi.size() <<
" modes found with phi-radius correlated " );
344 ol_phi_radi_Z =
CheckCorrelation( info, vectorOfPoints, olphiradi, info.m_idxZ, 1 ) ;
345 if ( ol_phi_radi_Z.empty() )
349 ATH_MSG_DEBUG(
" One more searching for a mode in Z after CheckCorrelation !" );
351 ol_phi_radi_Z =
CheckCorrelation( info, vectorOfPoints, olphiradi, info.m_idxZ, 1 ) ;
353 if ( ol_phi_radi_Z.empty() )
356 ol_phi_radi_Z =
CheckCorrelation( info, vectorOfPoints, olphiradi, info.m_idxZ, 1 ) ;
358 if ( ol_phi_radi_Z.empty() )
360 tmpseed =
Mode2Seed( info, vectorOfPoints, olphiradi, info.m_idxZ ) ;
361 if ( tmpseed.z() == 0. )
return getClosestPair(info, vectorOfPoints, vx, vy) ;
362 tmpsdX = tmpseed.x() - vx ;
363 tmpsdY = tmpseed.y() - vy ;
364 tmpsdXY = sqrt( tmpsdX*tmpsdX + tmpsdY*tmpsdY ) ;
378 <<
" modes found with phi-radius-Z fully correlated " );
382 tmpseed =
Mode2Seed( info, vectorOfPoints, ol_phi_radi_Z ) ;
383 if ( tmpseed.z() == 0. )
return getClosestPair(info, vectorOfPoints, vx, vy) ;
384 tmpsdX = tmpseed.x() - vx ;
385 tmpsdY = tmpseed.y() - vy ;
386 tmpsdXY = sqrt( tmpsdX*tmpsdX + tmpsdY*tmpsdY ) ;
396 const std::vector< IndexedWeighted > &
position,
397 int expectMax )
const
402 ATH_MSG_DEBUG(
" total IndexedWeighted positions : " << tot );
404 unsigned int M = idxs->size() ;
409 ATH_MSG_WARNING(
" No necessary to search so many ( > 3 ) modes, skip " );
413 std::vector< std::vector< IndexedWeighted > > position_OR ;
420 for (
unsigned int splt = 0 ; splt < M + 1 ; splt ++ )
423 const std::vector< std::pair< int, int> >& idxplt =
424 ( splt == M ? (*idxs)[splt-1] : (*idxs)[splt] ) ;
426 int sz = idxplt.size() - 1 ;
428 std::vector<IndexedWeighted>::const_iterator origin =
position.begin() ;
429 std::vector<IndexedWeighted>::const_iterator begin = origin ;
430 std::vector<IndexedWeighted>::const_iterator end =
position.end() ;
434 offset = idxplt[0].second - 1 ;
436 if ( offset > tot - 2 || offset <= 1 ) continue ;
437 end = origin + offset ;
438 }
else if ( splt == M )
440 offset = idxplt[
sz].second + 1 ;
442 if ( offset > tot - 3 || offset <
sz ) continue ;
443 begin = origin + offset ;
446 const std::vector< std::pair< int, int> >& idxprevious = (*idxs)[splt-1] ;
447 offset = idxprevious.back().second ;
449 if ( offset > tot - 3 || offset <
sz + 1 ) continue ;
450 begin = origin + offset + 1 ;
451 offset = idxplt[0].second ;
452 if ( offset < 2 || offset >= tot - 2 ) continue ;
454 end = origin + offset - 1 ;
457 if ( end < begin + 2 ) continue ;
459 ATH_MSG_DEBUG(
" new searching domain is defined in splitted region " << splt );
460 position_OR.emplace_back( begin, end ) ;
465 for (
unsigned int splt = 0 ; splt < position_OR.size() ; splt ++ )
467 ATH_MSG_DEBUG(
" In split " << splt <<
" after overlap removal " );
468 const std::vector< IndexedWeighted >& spltposi = position_OR[splt] ;
469 int spltgot = 0, lastgot = 0 ;
472 std::vector< std::pair< int,int> > idx_tmp =
getFsmw1dMode( spltposi, expectMax ) ;
473 if ( !idx_tmp.empty() )
475 idxs->push_back( std::move(idx_tmp) ) ;
479 if ( spltgot == lastgot ) break ;
481 if ( lastgot > 0 ) break ;
483 }
while ( spltgot < expectMax ) ;
495 const std::vector<Trk::PositionAndWeight>& vectorOfPoints,
505 for (
unsigned int i = 0 ; i < aa.size() ; i++ )
508 std::vector<std::pair< int, int> > ax = aa[i] ;
512 std::vector<int > axidx ;
513 for (
unsigned int ia = 0 ; ia < ax.size() ; ia ++ )
515 axidx.push_back( ax[ia].first ) ;
519 std::vector< std::pair<int,int> > supp ;
520 std::vector< std::pair< int, int> > bx ;
521 for (
unsigned int j = 0 ; j < bb.size() ; j++ )
528 for (
unsigned int k = 0 ; k < bx.size() ; k ++ )
530 std::vector<int>::iterator it = std::find( axidx.begin(), axidx.end(), bx[k].first ) ;
531 ATH_MSG_DEBUG(
" " << k <<
" 'th crossing test : " << bx[k].first );
532 if ( it != axidx.end() )
534 ATH_MSG_DEBUG(
" correlated crossing found : " << bx[k].first );
543 for (
unsigned int k = 0 ; k < bx.size() ; k ++ )
545 std::vector<int>::iterator it = std::find( axidx.begin(), axidx.end(), bx[k].first ) ;
547 if ( it == axidx.end() )
549 ATH_MSG_DEBUG(
" extra indices supplemented : " << bx[k].first );
550 supp.emplace_back( bx[k].first, bx[k].second ) ;
559 supp.insert( supp.end(), ax.begin(), ax.end() ) ;
560 corre.push_back( std::move(supp) ) ;
565#ifdef Mode3dFromFsmw1d_DEBUG
566 if ( corre.size() == 0 )
return corre ;
568 if ( !corre.empty() )
return corre ;
571 ATH_MSG_DEBUG(
" Korrelation failed by indices match, now try 3D distance ... " );
573 double mindistcut = 999999999.9 , mindist = 999999999.9 ;
578 double aX = 0., aY = 0., aZ = 0. ;
579 std::vector<int > axidx ;
582 int idxA = ia.first ;
583 axidx.push_back( idxA ) ;
585 std::vector<Trk::PositionAndWeight>::const_iterator Aposi = vectorOfPoints.begin() + idxA ;
587 ATH_MSG_DEBUG(
" Mode idx accepted with full phi-radius correlation : " << idxA );
589 double wght = Aposi->second ;
590 aX += Aposi->first.x()*wght ;
591 aY += Aposi->first.y()*wght ;
592 aZ += Aposi->first.z()*wght ;
604 std::vector< std::pair<int,int> > supp ;
605 double bX = 0., bY = 0., bZ = 0., Bwght = 0. ;
606 for (
const auto& bx : bb)
608 for (
const auto & ib : bx)
610 int idxB = ib.first ;
611 std::vector<Trk::PositionAndWeight>::const_iterator Bposi = vectorOfPoints.begin() + idxB ;
613 double wght = Bposi->second ;
615 bX = Bposi->first.x()*wght ;
616 bY = Bposi->first.y()*wght ;
617 bZ = Bposi->first.z()*wght ;
632 double dist = ( bX*bX + bY*bY + bZ*bZ )/( Awght + Bwght ) ;
634 if ( dist < mindist )
637 mindistcut = sqrt( dist*( Awght + Bwght ) ) ;
639 ATH_MSG_DEBUG(
" Distance between modes for Korrelation : " << mindistcut );
643#ifdef Mode3dFromFsmw1d_DEBUG
644 info.setCorre (zin, mindistcut);
650 for (
const auto & m : bx)
652 std::vector<int>::iterator it = std::find( axidx.begin(), axidx.end(), m.first ) ;
653 if ( it == axidx.end() ) supp.emplace_back( m.first, m.second ) ;
655 supp.insert( supp.end(), ax.begin(), ax.end() ) ;
656 corre.push_back( supp ) ;
667 int minModeDiff)
const
671 std::vector< std::pair< int, int > > idx(0) ;
674 std::vector<IndexedWeighted>::const_iterator origin = posidxwght.begin();
675 std::vector<IndexedWeighted>::const_iterator begin= origin ;
676 std::vector<IndexedWeighted>::const_iterator end=posidxwght.end();
678 double overallweight(0.);
679 std::vector<IndexedWeighted>::const_iterator best_begin=begin;
680 std::vector<IndexedWeighted>::const_iterator best_end=end;
682 double last_value(1e100);
684 bool isthelast=
false;
686 if ( posidxwght.size() == 1 )
688 std::vector<IndexedWeighted>::const_iterator mid = posidxwght.begin();
689 idx.emplace_back( mid->first.second.first, mid->first.second.second ) ;
693 while ( ! isthelast )
697 int step = (int)std::floor(
m_fraction * ( end - begin + 1 ) );
700 if ( step < minModeDiff ) break ;
702 std::vector<IndexedWeighted>::const_iterator j_end= begin+step-1;
703 for (std::vector<IndexedWeighted>::const_iterator j=begin;j!=j_end;++j)
704 overallweight+=j->second;
713 std::vector<IndexedWeighted>::const_iterator i_last = begin+step;
714 for (std::vector<IndexedWeighted>::const_iterator i=begin;i!=(end-step);++i, ++i_last)
719 overallweight+= i_last->second;
721 double new_value = ( ( (i+step)->first ).first - ( i->first ).first )/overallweight;
723 << step + 1 <<
" at best "<< best_end - best_begin );
725 if ( new_value < last_value )
727 last_value= new_value ;
732 overallweight -= i->second;
744 if ( best_end - best_begin <= minModeDiff )
754 std::vector<IndexedWeighted>::const_iterator mid = posidxwght.begin();
757 if (
m_broaden && ( best_end - best_begin ) <= 2 && best_begin != mid )
759 mid = best_begin - 1 ;
760 idx.emplace_back( mid->first.second.first, mid->first.second.second ) ;
761 ATH_MSG_DEBUG(
" found 1d mode " << ( mid->first ).first <<
" "
762 << ( mid->first ).second.first <<
" "<< mid->first.second.second );
766 for ( mid = best_begin ; mid != best_end ; ++mid )
769 idx.emplace_back( mid->first.second.first, mid->first.second.second ) ;
770 ATH_MSG_DEBUG(
" found 1d mode " << ( mid->first ).first <<
" "
771 << ( mid->first ).second.first <<
" "<< mid->first.second.second );
775 if (
m_broaden && ( best_end - best_begin ) <= 2 )
777 mid = posidxwght.end();
778 if ( best_end != mid )
781 idx.emplace_back( mid->first.second.first, mid->first.second.second ) ;
782 ATH_MSG_DEBUG(
" found 1d mode " << ( mid->first ).first <<
" "
783 << ( mid->first ).second.first <<
" "<< mid->first.second.second );
1022 const std::vector<Trk::PositionAndWeight>& vectorOfPoints,
1027 double mindistcut = 999999999.9 , mindist = 999999999.9 ;
1028 double seedX = 0., seedY = 0., seedZ = 0. ;
1030 for (
const auto& pmodes :
phi)
1033 double pX = 0., pY = 0., pZ = 0. ;
1035 for (
const auto & pmode : pmodes)
1037 int idxp = pmode.first ;
1038 std::vector<Trk::PositionAndWeight>::const_iterator pposi = vectorOfPoints.begin() + idxp ;
1039 double xw = pposi->second ;
1040 pX += pposi->first.x()*xw ;
1041 pY += pposi->first.y()*xw ;
1042 pZ += pposi->first.z()*xw ;
1054 for (
const auto& rmodes : radi)
1057 double rX = 0., rY = 0., rZ = 0. ;
1059 for (
const auto & rmode : rmodes)
1061 int idxr = rmode.first ;
1062 std::vector<Trk::PositionAndWeight>::const_iterator rposi = vectorOfPoints.begin() + idxr ;
1063 double xw = rposi->second ;
1064 rX += rposi->first.x()*xw ;
1065 rY += rposi->first.y()*xw ;
1066 rZ += rposi->first.z()*xw ;
1078 double Dxy = ( ( pX - rX )*( pX - rX ) + ( pY - rY )*( pY - rY )
1079 + ( pZ - rZ )*( pZ - rZ ) )/( pwght + rwght ) ;
1081 for (
const auto& zmodes : Z)
1084 double zX = 0., zY = 0., zZ = 0. ;
1086 for (
const auto & zmode : zmodes)
1088 int idxz = zmode.first ;
1089 std::vector<Trk::PositionAndWeight>::const_iterator zposi = vectorOfPoints.begin() + idxz ;
1090 double xw = zposi->second ;
1091 zX += zposi->first.x()*xw ;
1092 zY += zposi->first.y()*xw ;
1093 zZ += zposi->first.z()*xw ;
1105 double distpz = ( pX - zX )*( pX - zX ) + ( pY - zY )*( pY - zY )
1106 + ( pZ - zZ )*( pZ - zZ ) ;
1107 double distrz = ( rX - zX )*( rX - zX ) + ( rY - zY )*( rY - zY )
1108 + ( rZ - zZ )*( rZ - zZ ) ;
1109 double dist = distpz/( pwght + zwght ) + distrz/( rwght + zwght ) + Dxy ;
1112 if ( dist < mindist )
1116 mindistcut = 0.3333*( sqrt( distpz ) + sqrt( distrz ) + sqrt( Dxy*( pwght + rwght ) ) ) ;
1120 double totwght = pwght + rwght + zwght ;
1121 seedX = ( pX*pwght + rX*rwght + zX*zwght )/totwght ;
1122 seedY = ( pY*pwght + rY*rwght + zY*zwght )/totwght ;
1123 seedX = ( pZ*pwght + rZ*rwght + zZ*zwght )/totwght ;
1125 info.pushIndices (pmodes);
1126 info.pushIndices (rmodes);
1127 info.pushIndices (zmodes);