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
401 int tot = position.size() ;
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 ) ;
463 position_OR.push_back( position ) ;
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( idx_tmp ) ;
479 if ( spltgot == lastgot ) break ;
481 if ( lastgot > 0 ) break ;
482 }
while ( spltgot < expectMax ) ;
494 const std::vector<Trk::PositionAndWeight>& vectorOfPoints,
504 for (
unsigned int i = 0 ; i < aa.size() ; i++ )
507 std::vector<std::pair< int, int> > ax = aa[i] ;
511 std::vector<int > axidx ;
512 for (
unsigned int ia = 0 ; ia < ax.size() ; ia ++ )
514 axidx.push_back( ax[ia].first ) ;
518 std::vector< std::pair<int,int> > supp ;
519 std::vector< std::pair< int, int> > bx ;
520 for (
unsigned int j = 0 ; j < bb.size() ; j++ )
527 for (
unsigned int k = 0 ; k < bx.size() ; k ++ )
529 std::vector<int>::iterator it = std::find( axidx.begin(), axidx.end(), bx[k].first ) ;
530 ATH_MSG_DEBUG(
" " << k <<
" 'th crossing test : " << bx[k].first );
531 if ( it != axidx.end() )
533 ATH_MSG_DEBUG(
" correlated crossing found : " << bx[k].first );
542 for (
unsigned int k = 0 ; k < bx.size() ; k ++ )
544 std::vector<int>::iterator it = std::find( axidx.begin(), axidx.end(), bx[k].first ) ;
546 if ( it == axidx.end() )
548 ATH_MSG_DEBUG(
" extra indices supplemented : " << bx[k].first );
549 supp.emplace_back( bx[k].first, bx[k].second ) ;
558 supp.insert( supp.end(), ax.begin(), ax.end() ) ;
559 corre.push_back( supp ) ;
564#ifdef Mode3dFromFsmw1d_DEBUG
565 if ( corre.size() == 0 )
return corre ;
567 if ( !corre.empty() )
return corre ;
570 ATH_MSG_DEBUG(
" Korrelation failed by indices match, now try 3D distance ... " );
572 double mindistcut = 999999999.9 , mindist = 999999999.9 ;
577 double aX = 0., aY = 0., aZ = 0. ;
578 std::vector<int > axidx ;
581 int idxA = ia.first ;
582 axidx.push_back( idxA ) ;
584 std::vector<Trk::PositionAndWeight>::const_iterator Aposi = vectorOfPoints.begin() + idxA ;
586 ATH_MSG_DEBUG(
" Mode idx accepted with full phi-radius correlation : " << idxA );
588 double wght = Aposi->second ;
589 aX += Aposi->first.x()*wght ;
590 aY += Aposi->first.y()*wght ;
591 aZ += Aposi->first.z()*wght ;
603 std::vector< std::pair<int,int> > supp ;
604 double bX = 0., bY = 0., bZ = 0., Bwght = 0. ;
605 for (
const auto& bx : bb)
607 for (
const auto & ib : bx)
609 int idxB = ib.first ;
610 std::vector<Trk::PositionAndWeight>::const_iterator Bposi = vectorOfPoints.begin() + idxB ;
612 double wght = Bposi->second ;
614 bX = Bposi->first.x()*wght ;
615 bY = Bposi->first.y()*wght ;
616 bZ = Bposi->first.z()*wght ;
631 double dist = ( bX*bX + bY*bY + bZ*bZ )/( Awght + Bwght ) ;
633 if ( dist < mindist )
636 mindistcut = sqrt( dist*( Awght + Bwght ) ) ;
638 ATH_MSG_DEBUG(
" Distance between modes for Korrelation : " << mindistcut );
642#ifdef Mode3dFromFsmw1d_DEBUG
643 info.setCorre (zin, mindistcut);
649 for (
const auto & m : bx)
651 std::vector<int>::iterator it = std::find( axidx.begin(), axidx.end(), m.first ) ;
652 if ( it == axidx.end() ) supp.emplace_back( m.first, m.second ) ;
654 supp.insert( supp.end(), ax.begin(), ax.end() ) ;
655 corre.push_back( supp ) ;
666 int minModeDiff)
const
670 std::vector< std::pair< int, int > > idx(0) ;
673 std::vector<IndexedWeighted>::const_iterator origin = posidxwght.begin();
674 std::vector<IndexedWeighted>::const_iterator begin= origin ;
675 std::vector<IndexedWeighted>::const_iterator end=posidxwght.end();
677 double overallweight(0.);
678 std::vector<IndexedWeighted>::const_iterator best_begin=begin;
679 std::vector<IndexedWeighted>::const_iterator best_end=end;
681 double last_value(1e100);
683 bool isthelast=
false;
685 if ( posidxwght.size() == 1 )
687 std::vector<IndexedWeighted>::const_iterator mid = posidxwght.begin();
688 idx.emplace_back( mid->first.second.first, mid->first.second.second ) ;
692 while ( ! isthelast )
696 int step = (int)std::floor(
m_fraction * ( end - begin + 1 ) );
699 if ( step < minModeDiff ) break ;
701 std::vector<IndexedWeighted>::const_iterator j_end= begin+step-1;
702 for (std::vector<IndexedWeighted>::const_iterator j=begin;j!=j_end;++j)
703 overallweight+=j->second;
712 std::vector<IndexedWeighted>::const_iterator i_last = begin+step;
713 for (std::vector<IndexedWeighted>::const_iterator i=begin;i!=(end-step);++i, ++i_last)
718 overallweight+= i_last->second;
720 double new_value = ( ( (i+step)->first ).first - ( i->first ).first )/overallweight;
722 << step + 1 <<
" at best "<< best_end - best_begin );
724 if ( new_value < last_value )
726 last_value= new_value ;
731 overallweight -= i->second;
743 if ( best_end - best_begin <= minModeDiff )
753 std::vector<IndexedWeighted>::const_iterator mid = posidxwght.begin();
756 if (
m_broaden && ( best_end - best_begin ) <= 2 && best_begin != mid )
758 mid = best_begin - 1 ;
759 idx.emplace_back( mid->first.second.first, mid->first.second.second ) ;
760 ATH_MSG_DEBUG(
" found 1d mode " << ( mid->first ).first <<
" "
761 << ( mid->first ).second.first <<
" "<< mid->first.second.second );
765 for ( mid = best_begin ; mid != best_end ; ++mid )
768 idx.emplace_back( mid->first.second.first, mid->first.second.second ) ;
769 ATH_MSG_DEBUG(
" found 1d mode " << ( mid->first ).first <<
" "
770 << ( mid->first ).second.first <<
" "<< mid->first.second.second );
774 if (
m_broaden && ( best_end - best_begin ) <= 2 )
776 mid = posidxwght.end();
777 if ( best_end != mid )
780 idx.emplace_back( mid->first.second.first, mid->first.second.second ) ;
781 ATH_MSG_DEBUG(
" found 1d mode " << ( mid->first ).first <<
" "
782 << ( mid->first ).second.first <<
" "<< mid->first.second.second );
1018 const std::vector<Trk::PositionAndWeight>& vectorOfPoints,
1023 double mindistcut = 999999999.9 , mindist = 999999999.9 ;
1024 double seedX = 0., seedY = 0., seedZ = 0. ;
1026 for (
const auto& pmodes :
phi)
1029 double pX = 0., pY = 0., pZ = 0. ;
1031 for (
const auto & pmode : pmodes)
1033 int idxp = pmode.first ;
1034 std::vector<Trk::PositionAndWeight>::const_iterator pposi = vectorOfPoints.begin() + idxp ;
1035 double xw = pposi->second ;
1036 pX += pposi->first.x()*xw ;
1037 pY += pposi->first.y()*xw ;
1038 pZ += pposi->first.z()*xw ;
1050 for (
const auto& rmodes : radi)
1053 double rX = 0., rY = 0., rZ = 0. ;
1055 for (
const auto & rmode : rmodes)
1057 int idxr = rmode.first ;
1058 std::vector<Trk::PositionAndWeight>::const_iterator rposi = vectorOfPoints.begin() + idxr ;
1059 double xw = rposi->second ;
1060 rX += rposi->first.x()*xw ;
1061 rY += rposi->first.y()*xw ;
1062 rZ += rposi->first.z()*xw ;
1074 double Dxy = ( ( pX - rX )*( pX - rX ) + ( pY - rY )*( pY - rY )
1075 + ( pZ - rZ )*( pZ - rZ ) )/( pwght + rwght ) ;
1077 for (
const auto& zmodes : Z)
1080 double zX = 0., zY = 0., zZ = 0. ;
1082 for (
const auto & zmode : zmodes)
1084 int idxz = zmode.first ;
1085 std::vector<Trk::PositionAndWeight>::const_iterator zposi = vectorOfPoints.begin() + idxz ;
1086 double xw = zposi->second ;
1087 zX += zposi->first.x()*xw ;
1088 zY += zposi->first.y()*xw ;
1089 zZ += zposi->first.z()*xw ;
1101 double distpz = ( pX - zX )*( pX - zX ) + ( pY - zY )*( pY - zY )
1102 + ( pZ - zZ )*( pZ - zZ ) ;
1103 double distrz = ( rX - zX )*( rX - zX ) + ( rY - zY )*( rY - zY )
1104 + ( rZ - zZ )*( rZ - zZ ) ;
1105 double dist = distpz/( pwght + zwght ) + distrz/( rwght + zwght ) + Dxy ;
1108 if ( dist < mindist )
1112 mindistcut = 0.3333*( sqrt( distpz ) + sqrt( distrz ) + sqrt( Dxy*( pwght + rwght ) ) ) ;
1116 double totwght = pwght + rwght + zwght ;
1117 seedX = ( pX*pwght + rX*rwght + zX*zwght )/totwght ;
1118 seedY = ( pY*pwght + rY*rwght + zY*zwght )/totwght ;
1119 seedX = ( pZ*pwght + rZ*rwght + zZ*zwght )/totwght ;
1121 info.pushIndices (pmodes);
1122 info.pushIndices (rmodes);
1123 info.pushIndices (zmodes);