125 static int nfound = 0;
126 static float sumprob = 0.0;
128 MdcxHel thel( 0., 0., 0., 0., 0. );
130 int nSeg = segList.length();
131 for (
int i = 0; i < nSeg; i++ ) { segList[i]->SetUsedOnHel( 0 ); }
133 double xp, yp, xl1, yl1, rl1, xl2, yl2, rl2;
134 double d0g, phi0g, omegag, z0g, tanlg;
135 double d0g_sl, phi0g_sl, omegag_sl, z0g_sl, tanlg_sl;
136 double zintAU, zintAV, zintAU_sl, zintAV_sl = 9999.;
137 double rl1_sl, rl2_sl;
138 double xc = 1.e9, yc = 1.e9;
139 double sinPhi0g_sl, cosPhi0g_sl, xp_sl, yp_sl;
140 double phiAx = 1.e9, phiStU, phiStV, xl1_sl, yl1_sl, xl2_sl, yl2_sl, xl1_0, yl1_0, xl2_0, yl2_0;
141 double sx1, sy1, sx2, sy2;
143 double fltAx = 1.e9, ztest, fltL_sl, ztest_sl;
144 int floop, trkCount = 0;
155 std::cout <<
" Test combo: (" << axlay <<
"," << stUlay <<
"," << stVlay <<
")"
164 for (
int iAx = 0; iAx < nSeg; iAx++ )
166 bool b_useGood_stU =
true;
167 bool b_useGood_stV =
true;
168 if ( ( segList[iAx]->GetUsedOnHel() != 0 ) || ( segList[iAx]->Fail() != 0 ) ||
169 ( segList[iAx]->
SuperLayer( 0 ) != axlay ) || ( segList[iAx]->Origin() != -1 ) )
174 std::cout <<
"---------1.Ax seg------ No." << iAx << std::endl;
175 segList[iAx]->printSegAll();
179 omegag = segList[iAx]->Omega();
182 if ( 4 ==
m_debug ) std::cout <<
"SKIP by maxTrkOmega " << fabs( omegag ) << std::endl;
185 if ( 4 ==
m_debug ) std::cout <<
" iAx omegag = " << omegag << std::endl;
191 d0g_sl = segList[iAx]->D0_sl_approx();
192 phi0g_sl = segList[iAx]->Phi0_sl_approx();
196 sinPhi0g_sl = -
sin( phi0g_sl );
197 cosPhi0g_sl =
cos( phi0g_sl );
198 xp_sl = segList[iAx]->Xref() + sinPhi0g_sl * d0g_sl;
199 yp_sl = segList[iAx]->Yref() + cosPhi0g_sl * d0g_sl;
200 d0g_sl = yp_sl * cosPhi0g_sl + xp_sl * sinPhi0g_sl;
201 fltL_sl = segList[iAx]->Xref() * cosPhi0g_sl - segList[iAx]->Yref() * sinPhi0g_sl;
204 std::cout <<
"--Ax :" prt( d0g_sl )
prt( phi0g_sl )
prt( omegag_sl )
prt( sinPhi0g_sl )
212 omegag = ohel.
Omega();
219 phiAx = atan2( y0g - yc, x0g - xc );
220 fltAx =
dlen( -2, phi0g, -1, segList[iAx]->Phi0(), omegag );
224 std::cout <<
"--Ax :"
234 for (
int iStU = -1;
true; )
236 if ( !b_useGood_stU && ( iStU >= ( nSeg - 1 ) ) )
break;
237 if ( b_useGood_stU && ( iStU >= ( nSeg - 1 ) ) )
240 b_useGood_stU =
false;
243 if ( ( segList[iAx]->GetUsedOnHel() != 0 ) || ( segList[iStU]->GetUsedOnHel() != 0 ) ||
244 ( segList[iStU]->Fail() != 0 ) || ( segList[iStU]->
SuperLayer( 0 ) != stUlay ) ||
245 ( segList[iStU]->Origin() != -1 )
247 || ( b_useGood_stU && ( segList[iStU]->Nhits() < 4 ) ) )
252 std::cout <<
" Test combo: AUV " << axlay <<
"," << stUlay <<
"," << stVlay
254 std::cout <<
"---------2.St U seg ------No." << iStU << std::endl;
255 segList[iStU]->printSeg();
256 std::cout <<
" omega of seg iStU = " << segList[iStU]->Omega() << std::endl;
261 double dPhiAU = fabs( hitsAx[0]->phiMid() - hitsStU[0]->phiMid() );
265 if ( dPhiAU > max_dPhiAU )
266 { cout <<
"SKIP by dPhiAU " << dPhiAU <<
" > " << max_dPhiAU << endl; }
267 else { cout <<
"KEEP by dPhiAU " << dPhiAU <<
" <= " << max_dPhiAU << endl; }
268 std::cout <<
" phi mid Ax " << hitsAx[0]->phiMid() <<
" StU " << hitsStU[0]->phiMid()
270 std::cout << std::endl;
274 if ( dPhiAU > max_dPhiAU ) {
continue; }
277 xl1_0 = segList[iStU]->Xline_bbrrf();
278 yl1_0 = segList[iStU]->Yline_bbrrf();
279 sx1 = segList[iStU]->Xline_slope();
280 sy1 = segList[iStU]->Yline_slope();
282 std::cout
prt( xl1_0 )
prt( yl1_0 )
prt( sx1 )
prt( sy1 )
prt( omegag ) << std::endl;
285 zintAU =
findz_cyl( iAx, iStU, segList );
286 xl1 = xl1_0 + sx1 * zintAU;
287 yl1 = yl1_0 + sy1 * zintAU;
288 rl1 = sqrt( xl1 * xl1 + yl1 * yl1 );
289 phiStU = atan2( yl1 - yc, xl1 - xc );
291 cout
prt( zintAU )
prt( xl1 )
prt( yl1 )
prt( rl1 )
prt( phiStU ) << endl;
293 else { zintAU = -9999.; }
296 zintAU_sl =
findz_sl( iAx, iStU, segList );
297 xl1_sl = xl1_0 + sx1 * zintAU_sl;
298 yl1_sl = yl1_0 + sy1 * zintAU_sl;
299 rl1_sl = sqrt( xl1_sl * xl1_sl + yl1_sl * yl1_sl );
301 cout
prt( zintAU_sl )
prt( xl1_sl )
prt( yl1_sl )
prt( rl1_sl ) << endl;
324 for (
int iStV = -1;
true; )
326 if ( !b_useGood_stV && ( iStV >= ( nSeg - 1 ) ) )
328 if ( 4 ==
m_debug ) std::cout << iStV <<
" no segments in V slayer " << std::endl;
331 if ( b_useGood_stV && ( iStV >= ( nSeg - 1 ) ) )
334 b_useGood_stV =
false;
337 if ( ( segList[iStV]->GetUsedOnHel() != 0 ) ||
338 ( segList[iStU]->GetUsedOnHel() != 0 ) ||
339 ( segList[iAx]->GetUsedOnHel() != 0 ) || ( segList[iStV]->Fail() != 0 ) ||
340 ( segList[iStV]->
SuperLayer( 0 ) != stVlay ) ||
341 ( segList[iStV]->Origin() != -1 )
343 || ( b_useGood_stV && ( segList[iStV]->Nhits() < 4 ) ) )
348 std::cout <<
" Test combo: AUV " << axlay <<
"," << stUlay <<
"," << stVlay
350 std::cout <<
"---------3.St V seg ------No." << iStV << std::endl;
351 segList[iStV]->printSeg();
352 std::cout <<
" omega of seg iStV = " << segList[iStV]->Omega() << std::endl;
357 double dPhiAV = fabs( hitsAx[0]->phiMid() - hitsStV[0]->phiMid() );
362 if ( dPhiAV > max_dPhiAV )
363 { cout <<
"SKIP by dPhiAV " << dPhiAV <<
" > " << max_dPhiAV << endl; }
364 else { cout <<
"KEEP by dPhiAV " << dPhiAV <<
" <= " << max_dPhiAV << endl; }
365 std::cout <<
" phi mid Ax " << hitsAx[0]->phiMid() <<
" StV "
366 << hitsStV[0]->phiMid() << std::endl;
367 std::cout << std::endl;
370 if ( dPhiAV > max_dPhiAV ) {
continue; }
373 xl2_0 = segList[iStV]->Xline_bbrrf();
374 yl2_0 = segList[iStV]->Yline_bbrrf();
375 sx2 = segList[iStV]->Xline_slope();
376 sy2 = segList[iStV]->Yline_slope();
379 zintAV =
findz_cyl( iAx, iStV, segList );
380 xl2 = xl2_0 + sx2 * zintAV;
381 yl2 = yl2_0 + sy2 * zintAV;
382 rl2 = sqrt( xl2 * xl2 + yl2 * yl2 );
385 segList[iAx]->printSeg();
386 segList[iStV]->printSeg();
387 cout <<
"zintAV " << zintAV << endl;
389 phiStV = atan2( yl2 - yc, xl2 - xc );
391 else { zintAV = -9999.; }
394 zintAV_sl =
findz_sl( iAx, iStV, segList );
395 xl2_sl = xl2_0 + sx2 * zintAV_sl;
396 yl2_sl = yl2_0 + sy2 * zintAV_sl;
397 rl2_sl = sqrt( xl2_sl * xl2_sl + yl2_sl * yl2_sl );
422 segList[iAx]->printSeg();
423 segList[iStU]->printSeg();
424 segList[iStV]->printSeg();
428 double first_prob = 0.0;
430 hitlist.append( hitsAx );
431 hitlist.append( hitsStU );
432 hitlist.append( hitsStV );
434 for (
int i = 0; i < hitlist.length(); i++ )
435 {
g_trkllmk->fill( hitlist[i]->Layer() ); }
444 std::cout <<
"---------4.Ax circle fit------" << std::endl;
447 if ( 4 ==
m_debug ) std::cout <<
"SKIP by omegag==0 " << std::endl;
454 std::cout <<
"SKIP by zintAU out of range " << zintAU <<
" "
462 std::cout <<
"SKIP by zintAU out of range " << zintAU <<
" "
469 cout <<
"dlen calc. slay U " << segList[iStU]->SuperLayer() <<
" slay V "
470 << segList[iStV]->SuperLayer() << endl;
476 { cout
prt( fltLenUV )
prt( phiStU )
prt( phiStV )
prt( omegag ) << std::endl; }
483 tanlg = ( zintAV - zintAU ) / fltLenUV;
485 cout <<
"dlen calc. slay A " << segList[iAx]->SuperLayer() <<
" slay U "
486 << segList[iStU]->SuperLayer() << endl;
507 z0g = zintAU - fltLenAU * tanlg;
509 cout
prt( z0g )
prt( tanlg )
prt( fltLenAU )
prt( zintAU )
prt( zintAV ) << endl;
516 std::cout <<
"SKIP by z0g out of range " << z0g <<
">"
520 ztest = z0g + fltAx * tanlg;
521 if ( 4 ==
m_debug ) std::cout
prt( ztest )
prt( fltAx ) << std::endl;
525 MdcxHel ghel( segList[iAx]->D0(), segList[iAx]->Phi0(), segList[iAx]->Omega(),
526 ztest, tanlg, 0.0, 11111, 0, segList[iAx]->Xref(),
527 segList[iAx]->Yref() );
530 first_prob = firstfit.
Prob();
533 std::cout <<
" after first fit: " << std::endl;
539 MdcxFittedHel nextfit( hitlist, helixOrigin, helixFitSigma );
540 first_prob = nextfit.
Prob();
543 for (
int i = 0; i < nextfit.
Nhits(); i++ )
547 if ( 4 ==
m_debug ) cout <<
" prob after helix fitting = " << first_prob << endl;
559 std::cout <<
"---------4.2 straight line fit------" << std::endl;
561 cout <<
" zintAU_sl " << zintAU_sl <<
" zintAV_sl " << zintAV_sl << endl;
564 if ( 4 ==
m_debug ) cout <<
" helix fit good , exit straight line fit." << endl;
575 double dx = xl2_sl - xl1_sl;
576 double dy = yl2_sl - yl1_sl;
577 double dl = sqrt( dx * dx + dy * dy );
578 tanlg_sl = ( zintAV_sl - zintAU_sl ) / dl;
579 dx = xl1_sl + d0g_sl *
sin( phi0g_sl );
580 dy = yl1_sl - d0g_sl *
cos( phi0g_sl );
581 dl = sqrt( dx * dx + dy * dy );
582 z0g_sl = zintAU_sl - dl * tanlg_sl;
584 cout
prt( d0g_sl )
prt( phi0g_sl )
prt( z0g_sl )
prt( tanlg_sl ) << endl;
595 ztest_sl = z0g_sl + fltL_sl * tanlg_sl;
596 if ( 4 ==
m_debug ) cout
prt( ztest_sl ) << endl;
599 MdcxHel ghel( segList[iAx]->D0_sl_approx(), segList[iAx]->Phi0_sl_approx(),
600 omegag_sl, ztest_sl, tanlg_sl, 0.0, 11111, 0, segList[iAx]->Xref(),
601 segList[iAx]->Yref() );
604 first_prob = firstfit.
Prob();
609 std::cout <<
"first_prob " << first_prob << std::endl;
615 MdcxFittedHel nextfit( hitlist, helixOrigin, helixFitSigma );
616 first_prob = nextfit.
Prob();
620 cout <<
" three seg sl nextfit" << endl;
635 std::cout <<
"---------5. try add seg to helix------" << std::endl;
639 std::cout <<
"prob" << first_prob <<
" " <<
probmin
640 <<
" fit NOT good, exit add segs " << std::endl;
643 float bchisq = fithel.
Chisq() * helixFitSigma * helixFitSigma;
644 int bndof = fithel.
Nhits() - 5;
647 segList[iAx]->SetUsedOnHel( trkCount );
648 segList[iStU]->SetUsedOnHel( trkCount );
649 segList[iStV]->SetUsedOnHel( trkCount );
653 cout <<
"in add seg to trail helix, klm seg:" << endl;
654 segList[iAx]->printSeg();
655 segList[iStU]->printSeg();
656 segList[iStV]->printSeg();
663 for (
int iSeg = 0; iSeg < nSeg; iSeg++ )
665 if ( ( segList[iSeg]->
SuperLayer( 0 ) != ilay ) ||
666 ( segList[iSeg]->GetUsedOnHel() != 0 ) ||
667 ( segList[iSeg]->Fail() != 0 ) || ( segList[iSeg]->Origin() != -1 ) )
671 std::cout << endl <<
"== add seg " << iSeg <<
" ";
672 segList[iSeg]->printSeg();
676 float phiAxSeg = segList[iAx]->XHitList()[0]->phiMid();
677 float phiAddSeg = segList[iSeg]->XHitList()[0]->phiMid();
678 double phiKNSegDiff = fabs( phiAxSeg - phiAddSeg );
707 std::cout <<
" SKIP by phi diff,same " << t_same <<
" Ax " << phiAxSeg
708 <<
" iSeg " << phiAddSeg <<
" diff " << phiKNSegDiff
715 std::cout <<
" phi diff OK, Ax " << phiAxSeg <<
" added " << phiAddSeg
716 <<
" diff=" << phiKNSegDiff << std::endl;
720 xp = segList[iSeg]->Xref() - segList[iSeg]->SinPhi0() * segList[iSeg]->D0();
721 yp = segList[iSeg]->Yref() + segList[iSeg]->CosPhi0() * segList[iSeg]->D0();
723 double proca = fithel.
Doca( hitsSegAdd[0]->wx(), hitsSegAdd[0]->wy(),
724 hitsSegAdd[0]->wz(), xp, yp );
743 std::cout <<
" SKIP by fabs(proca):" << fabs( proca ) <<
"<"
745 <<
" or Doca_Len:" << fithel.
Doca_Len() <<
"<" << fithel.
Lmax()
753 std::cout <<
" proca & len OK, |proca| " << fabs( proca ) <<
"<"
755 <<
" && Doca_Len:" << fithel.
Doca_Len() <<
"<" << fithel.
Lmax()
759 if ( fithel.
Doca_Len() < 0 )
continue;
765 newhel.
Grow( fithel, hitsSegAdd );
766 if ( newhel.
Nhits() != hitlist.length() )
770 cout <<
" rcs " << newhel.
Rcs() <<
"<=?"
779 cout <<
" prob " << newhel.
Prob() <<
"<" <<
probmin <<
", ReFit"
786 cout <<
" refit prob " << newhel.
Prob() <<
"<" <<
probmin <<
" Fail? "
787 << newhel.
Fail() << endl;
796 segList[iSeg]->SetUsedOnHel( trkCount );
797 bchisq = fithel.
Chisq() * helixFitSigma * helixFitSigma;
798 bndof = fithel.
Nhits() - 5;
800 if ( tprob > bprob ) bprob = tprob;
802 { cout <<
" segment ADDED, prob=" << newhel.
Prob() << endl; }
806 if ( 4 ==
m_debug ) std::cout <<
" fit FAILED" << std::endl;
811 segList[iSeg]->SetUsedOnHel( trkCount );
812 if ( 4 ==
m_debug ) cout <<
" segment ADDED, but no new hits" << endl;
817 if ( ( ( fithel.
Prob() < 0.90 ) && ( fithel.
Nhits() == 12 ) ) ||
818 ( fithel.
Fail() != 0 ) )
820 for (
int i = 0; i < nSeg; i++ )
822 if ( segList[i]->GetUsedOnHel() == trkCount ) segList[i]->SetUsedOnHel( 0 );
830 std::cout <<
"Track after add segs" << std::endl;
836 std::cout <<
"---------6. flip------" << std::endl;
841 int notduplicate = 1;
845 std::cout <<
"---------7. test saved track------" << std::endl;
852 while ( hitlist[kkl] )
854 if ( hitlist[kkl] == junk[kkj] ) overl++;
860 cout <<
"overlap with track # " << kki <<
" is " << junk.length()
861 <<
" hitList " << hitlist.length() <<
" overlap " << overl << endl;
862 if ( ( hitlist.length() / 4. ) <= overl ) notduplicate = 0;
869 for (
int iHit = 0; iHit < fithel.
Nhits(); iHit++ )
876 std::cout <<
"---------8. test worth saving?------"
882 std::cout << __FILE__ <<
" finehel Prob>0.001 " << finehel->
Prob() <<
" nhits "
883 << finehel->
Nhits() <<
">=15? "
884 <<
" bprob " << bprob <<
" >=?probmin " <<
probmin <<
" Fail==0? "
885 << finehel->
Fail() << std::endl;
889 if ( ( ( finehel->
Prob() > 0.001 ) || ( finehel->
Nhits() >= 15 ) ||
893 ( finehel->
Fail() == 0 ) )
896 sumprob += finehel->
Prob();
902 if ( ( finehel->
Prob() > 0.05 ) || nodrop )
906 for (
int iHit = 0; iHit < finehel->
Nhits(); iHit++ )
916 float ratdrop = float( drophel->
Nhits() ) / float( finehel->
Nhits() );
918 cout <<
"APPEND track " << trkCount <<
", drops "
919 << finehel->
Nhits() - drophel->
Nhits() <<
" helixnhit "
920 << finehel->
Nhits() <<
" drophit " << drophel->
Nhits()
921 <<
" hits, drop rate=" << ratdrop <<
">?" << 0.5 <<
" prob "
922 << drophel->
Prob() <<
" >?" << finehel->
Prob() <<
" fail==0? "
923 << drophel->
Fail() << endl;
924 if ( ( drophel->
Prob() > finehel->
Prob() ) && ( ratdrop > 0.50 ) &&
925 ( drophel->
Fail() == 0 ) )
927 if ( 4 ==
m_debug ) cout <<
"append drop helix " << endl;
930 for (
int iHit = 0; iHit < drophel->
Nhits(); iHit++ )
936 if ( 4 ==
m_debug ) cout <<
"append fine helix " << endl;
939 for (
int iHit = 0; iHit < finehel->
Nhits(); iHit++ )
947 if ( ( 4 ==
m_debug ) && ( nwl > -1 ) )
951 cout << endl <<
"found track " << trkCount << std::endl;
959 for (
int i = 0; i < nSeg; i++ )
961 if ( segList[i]->GetUsedOnHel() == trkCount ) segList[i]->SetUsedOnHel( 0 );
971 if ( 4 ==
m_debug ) cout <<
"end of this combo" << endl;
974 cout <<
" In MdcxFindTracks, found " << trkCount <<
" good tracks" << endl;