17#include "MdcTrkRecon/MdcSegGrouper.h"
18#include "CLHEP/Alist/AList.h"
19#include "MdcData/MdcHit.h"
20#include "MdcData/MdcHitUse.h"
21#include "MdcGeom/Constants.h"
22#include "MdcGeom/MdcDetector.h"
23#include "MdcTrkRecon/MdcLine.h"
24#include "MdcTrkRecon/MdcSeg.h"
25#include "MdcTrkRecon/MdcSegInfo.h"
26#include "MdcTrkRecon/MdcSegInfoSterO.h"
27#include "MdcTrkRecon/MdcTrack.h"
28#include "MdcTrkRecon/mdcTwoInv.h"
29#include "MdcTrkRecon/mdcTwoVec.h"
30#include "MdcTrkRecon/mdcWrapAng.h"
31#include "PatBField/BField.h"
32#include "TrkBase/TrkExchangePar.h"
33#include "TrkBase/TrkRecoTrk.h"
34#include "TrkBase/TrkRep.h"
37#include "AIDA/IHistogram1D.h"
57 for (
int i = 0; i <
nDeep; i++ ) {
delete[]
isValid[i]; }
92 <<
"MdcSegGrouper::nextGroup starting group finder, nply = " <<
nPlyFilled << endl;
94 bool incrementNext =
true;
101 if ( printit ) std::cout <<
" reach end of list, break." << iply << std::endl;
107 if ( printit ) std::cout <<
" leaveGap " << std::endl;
109 if ( iply ==
nPlyFilled - 1 && incrementNext )
126 incrementNext =
false;
134 incrementNext =
true;
136 if ( printit ) { std::cout <<
"reach end of segs " << std::endl; }
149 if ( printit ) { std::cout << endl <<
" All done! " << std::endl; }
161 std::cout <<
"ply " << iply <<
" seg " <<
currentSeg[iply] <<
": ";
167 std::cout <<
" ct " << info->
ct();
176 std::cout << std::endl <<
" Used??";
179 if ( printit ) { std::cout <<
" segUsed! SKIP " << std::endl; }
192 if ( invalid ) { std::cout <<
" invalid " << std::endl; }
193 else { std::cout <<
" KEEP 1 " << std::endl; }
195 if ( invalid )
continue;
199 if ( printit ) std::cout <<
" KEEP 2 " << std::endl;
211 if (
leaveGap[iply] ) { segGroup[iply] = 0; }
220 if ( lBad ) std::cout <<
" incompWithGroup Bad! restart" << std::endl;
223 if ( lBad )
goto restart;
229 if ( printit ) std::cout <<
"nextGoup() found " << nFound <<
" segment(s)" << std::endl;
246 if (
nNull == 0 )
return 1;
249 for (
int igap = 0; igap <
nNull; igap++ )
256 int inext = igap + 1;
259 if ( inext >=
nNull )
return 1;
287 double maxSegChisqO,
int combineByFitHits ) {
292 std::cout << std::endl <<
"=====MdcSegGrouper::combineSegs=====" << std::endl;
293 bool lSeed = ( seed != 0 );
297 double qualBest = -1000.;
303 double chiBest = 9999.;
305 if ( lSeed ) nToUse++;
308 segGroup =
new MdcSeg*[nToUse];
309 segGroupBest =
new MdcSeg*[nToUse];
317 if ( ( 3 ==
_debug ) && lSeed )
319 std::cout <<
"seed segment: ";
321 std::cout << std::endl;
327 double seedAngle[2] = { 0., 0. };
341 segGroup[nToUse - 1] = seed;
344 if ( nInGroup < 0 )
continue;
345 if ( !
_noInner && nInGroup < 2 )
break;
346 if ( nInGroup < nSegBest )
break;
351 <<
"-----found a segment group by nextGroup()----- nInGroup " << nInGroup
352 <<
" nToUse " << nToUse << endl;
353 for (
int ii = 0; ii < nToUse; ii++ )
364 double chisq = -999.;
370 chisq =
calcParBySegs( segGroup, seedAngle, nToUse, qual, nSegFit, param );
374 if ( combineByFitHits == 0 )
375 { chisq =
calcParBySegs( segGroup, seedAngle, nToUse, qual, nSegFit, param ); }
384 chisq =
calcParByHits( segGroup, nToUse, par, qual, nSegFit, param, Bz );
389 chisq =
calcParBySegs( segGroup, seedAngle, nToUse, qual, nSegFit, param );
394 if ( chisq < 0. )
continue;
399 else chiDof = chisq / ( 2. * nSegFit - 2. );
408 std::cout << setprecision( 2 );
409 if (
_noInner ) std::cout << endl <<
" no inner chiDof = chisq " << endl;
411 <<
"chisq " << chisq <<
" nSegFit " << nSegFit <<
" chiDof " << chiDof
413 if ( chiDof > maxSegChisqO )
415 cout <<
"***** DROP this group by chiDof " << chiDof
416 <<
" > maxSegChisqO:" << maxSegChisqO << endl;
420 cout <<
"***** KEEP this group by chiDof " << chiDof
421 <<
" <= maxSegChisqO:" << maxSegChisqO << endl;
425 if ( chiDof > maxSegChisqO )
continue;
428 if ( qual > qualBest )
433 paramBest[0] = param[0];
434 paramBest[1] = param[1];
436 for (
int i = 0; i < nToUse; i++ ) { segGroupBest[i] = segGroup[i]; }
438 std::cout <<
"Keep as best group. param: phi0/z0 " << paramBest[0] <<
" cpa/ct "
439 << paramBest[1] << std::endl;
447 std::cout << endl <<
"-----Parameter best group----- " << std::endl;
448 std::cout <<
"paramBest " << paramBest[0] <<
" " << paramBest[1] <<
" chiBest "
449 << chiBest << std::endl;
452 trk =
storePar( trk, paramBest, chiBest, context, t0 );
456 std::cout << std::defaultfloat;
457 delete[] segGroupBest;
468 double smallRad = 1000.;
480 std::cout << endl <<
"-----transferHits for this segGroup----- " << std::endl;
481 for (
int i = 0; i < nSegs; i++ )
483 if ( segGroup[i] == 0 )
continue;
491 for (
int ihit = 0; ihit < segGroup[i]->
nHit(); ihit++ )
495 double radius = layer->
rMid();
496 if ( radius < smallRad )
503 if ( radius > bigRad && !trk->
hasCurled() )
516 if ( theHits == 0 )
return;
530 for (
int islayer = 0; islayer < 11; islayer++ )
532 for (
int i = 0; i <
segList[islayer].length(); i++ )
534 segList[islayer][i]->plotSegAll();
535 std::cout << std::endl;
542 double& qual,
int& nSegFit,
double param[2] ) {
545 std::cout <<
"-----calculate group param by segment param-----" << std::endl;
546 double wgtmat[3], wgtinv[3];
548 double temvec[2], diff[2];
551 wgtmat[0] = wgtmat[1] = wgtmat[2] = wgtpar[0] = wgtpar[1] = 0.0;
552 temvec[0] = temvec[1] = diff[0] = diff[1] = 0.0;
555 for ( iPly = 0; iPly < nToUse; iPly++ )
561 if ( segGroup[iPly] == 0 )
continue;
565 for (
int i = 0; i < 3; i++ ) wgtmat[i] += ( segInfo->
inverr() )[i];
566 for (
int k = 0; k < 2; k++ )
568 param[k] = segInfo->
par( k );
574 wgtpar[0] += temvec[0];
575 wgtpar[1] += temvec[1];
578 std::cout << 0 <<
": param " << param[0] <<
" inverr " << segInfo->
inverr()[0]
579 <<
" par*W " << temvec[0] << std::endl;
580 std::cout << 1 <<
": param " << param[1] <<
" " << 1 / param[1] <<
" inverr "
581 << segInfo->
inverr()[1] <<
" par*W " << temvec[1] << std::endl;
582 std::cout <<
" " << std::endl;
584 nhit += segGroup[iPly]->
nHit();
589 if ( error && ( 11 ==
_debug ) )
591 cout <<
"ErrMsg(warning) "
592 <<
"failed matrix inversion in MdcTrackList::combineSegs" << endl;
599 std::cout <<
" param of wgtinv * wgtpar" << std::endl;
600 std::cout << 0 <<
": param " << param[0] << std::endl;
601 std::cout << 1 <<
": param " << param[1] <<
" " << 1 / param[1] << std::endl;
602 std::cout <<
" " << std::endl;
608 if ( 11 ==
_debug ) cout << endl <<
"-- Calculate track & chisq for this group " << endl;
613 for ( iPly = 0; iPly < nToUse; iPly++ )
615 if ( segGroup[iPly] == 0 )
continue;
617 for (
int j = 0; j < 2; j++ )
622 else { temPar = segInfo->
par( j ); }
623 if ( 11 ==
_debug ) { std::cout <<
" segPar" << j <<
" " << temPar << std::endl; }
624 diff[j] = temPar - param[j];
629 std::cout <<
"inverr " << segInfo->
inverr()[0] <<
" " << segInfo->
inverr()[1] <<
" "
630 << segInfo->
inverr()[2] << std::endl;
631 std::cout <<
"errmat " << segInfo->
errmat()[0] <<
" " << segInfo->
errmat()[1] <<
" "
632 << segInfo->
errmat()[2] << std::endl;
633 std::cout <<
"diff " << diff[0] <<
" " << diff[1] <<
" temvec " << temvec[0] <<
" "
634 << temvec[1] << std::endl;
635 std::cout << std::endl;
639 chisq += diff[0] * temvec[0] + diff[1] * temvec[1];
643 std::cout << iPly <<
" chi2Add:" << diff[0] * temvec[0] + diff[1] * temvec[1]
644 <<
" diff0 " << diff[0] <<
" vec0 " << temvec[0] <<
" diff1 " << diff[1]
645 <<
" vec1 " << temvec[1] << std::endl;
652 else chiDof = chisq / ( 2. * nSegFit - 2. );
656 if (
_noInner ) cout <<
" no inner chiDof = chisq" << endl;
657 cout <<
"segment:" << endl
658 <<
" chiDof " << chiDof <<
" chisq " << chisq <<
" nhit " << nhit <<
" phi0/z0 "
659 << param[0] <<
" cpa/cot " << param[1] <<
" qual " << ( 2. * nhit - chiDof ) << endl;
662 qual = 2. * nhit - chiDof;
671 double& qual,
int& nSegFit,
double param[2],
double Bz ) {
675 if ( 11 ==
_debug ) debug =
true;
676 if ( debug ) std::cout <<
"-----calculate group param by hit-----" << std::endl;
681 if ( debug ) std::cout <<
"nToUse=" << nToUse << std::endl;
682 for (
int iPly = 0; iPly < nToUse; iPly++ )
684 if ( segGroup[iPly] == 0 )
continue;
688 if ( debug ) std::cout <<
"nHit in segment=" << segGroup[iPly]->
nHit() << std::endl;
689 for (
int ii = 0, iHit = 0; ii < segGroup[iPly]->
nHit(); ii++ )
698 int szCode = segInfo->
zPosition( *( segGroup[iPly]->hit( iHit ) ), par, &span, iHit,
699 segGroup[iPly]->bunchTime(), Bz );
700 if ( debug ) std::cout <<
" szCode " << szCode;
701 if ( szCode > 0 && debug )
702 std::cout << iHit <<
" s " << span.
x[iHit] <<
" z " << span.
y[iHit] <<
" sigma "
704 if ( debug ) std::cout << std::endl;
706 spanFit.
x[nHit] = span.
x[iHit];
707 spanFit.
y[nHit] = span.
y[iHit];
709 spanFit.
sigma[nHit] = 1.;
710 if ( debug ) std::cout << std::endl;
712 if ( szCode > 0 ) nHit++;
716 if ( debug ) std::cout << __FILE__ <<
" " << __LINE__ <<
" nHit " << nHit << std::endl;
717 if ( nHit > 0 ) spanFit.
fit( nHit );
721 param[1] = spanFit.
slope;
723 std::cout <<
"nHit " << nHit <<
" intercept(z0) " << param[0] <<
" slope(ct) " << param[1]
726 qual = 2. * nHit - spanFit.
chisq / ( spanFit.
nPoint - 2 );
727 if ( debug ) std::cout <<
"chisq " << spanFit.
chisq <<
" qual " << qual << std::endl;
729 return spanFit.
chisq;
AIDA::IHistogram1D * g_maxSegChisqSt
AIDA::IHistogram1D * g_maxSegChisqAx
int mdcTwoInv(double matrix[3], double invmat[3])
void mdcTwoVec(const double matrix[3], const double invect[2], double outvect[2])
double mdcWrapAng(double phi1, double phi2)
const MdcHit * mdcHit() const
unsigned layernumber() const
unsigned wirenumber() const
const MdcLayer * layer() const
int combineSegs(MdcTrack *&, MdcSeg *seed, TrkContext &, double trackT0, double maxSegChisqO, int combineByFitHits=0)
virtual void resetComb(const MdcSeg *seed)=0
MdcSegGrouper(const MdcDetector *gm, int nDeep, int debug)
HepAList< MdcSeg > * segList
HepAList< MdcSeg > ** combList
virtual int incompWithGroup(MdcSeg **segGroup, const MdcSeg *testSeg, int iply)=0
int nextGroup(MdcSeg **segGroup, bool printit)
double calcParBySegs(MdcSeg **segGroup, double seedAngle[2], int nToUse, double &qual, int &nSegFit, double param[2])
void transferHits(MdcTrack *track, int nSegs, MdcSeg **segGroup)
double calcParByHits(MdcSeg **segGroup, int nToUse, const TrkExchangePar &par, double &qual, int &nSegFit, double param[2], double Bz)
virtual MdcTrack * storePar(MdcTrack *trk, double parms[2], double chisq, TrkContext &, double trackT0)=0
int zPosition(MdcHitUse &hitUse, const TrkRecoTrk &track, MdcLine *span, int hitFit, double t0) const
virtual bool parIsAngle(int i) const =0
const double * errmat() const
const double * inverr() const
MdcSegInfo * info() const
MdcHitUse * hit(int i) const
void setFirstLayer(const MdcLayer *l)
const MdcLayer * firstLayer() const
const MdcLayer * lastLayer() const
void setLastLayer(const MdcLayer *l)
virtual TrkExchangePar helix(double fltL) const =0
TrkHitOnTrk * appendHit(const TrkHitUse &theHit)
void setFltLen(double flt)
const MdcPatRec::BField & bField() const
const TrkFit * fitResult() const