18#include "MdcTrkRecon/MdcSegFinder.h"
19#include "MdcData/MdcHit.h"
20#include "MdcData/MdcHitMap.h"
21#include "MdcData/MdcHitUse.h"
22#include "MdcGeom/BesAngle.h"
23#include "MdcGeom/Constants.h"
24#include "MdcGeom/MdcDetector.h"
25#include "MdcGeom/MdcSuperLayer.h"
26#include "MdcTrkRecon/GmsList.h"
27#include "MdcTrkRecon/MdcLine.h"
28#include "MdcTrkRecon/MdcMap.h"
29#include "MdcTrkRecon/MdcSeg.h"
30#include "MdcTrkRecon/MdcSegList.h"
31#include "MdcTrkRecon/MdcSegUsage.h"
32#include "MdcTrkRecon/countBits.h"
33#include "MdcTrkRecon/mdcWrapAng.h"
34#include "MdcTrkRecon/mdcWrapWire.h"
36#include "GaudiKernel/NTuple.h"
74 unsigned int groupWord;
78 static const int layerWire[8][2] = { { 0, -1 }, { 0, 0 }, { 1, 0 }, { 2, -1 },
79 { 2, 0 }, { 3, -1 }, { 3, 0 }, { 3, 1 } };
91 for (
int i = 0; i < nslay; i++ ) layArray[i] = slayer->
layer( i );
92 if ( nslay != 4 ) layArray[3] = 0;
100 for (
int cellIndex = 0; cellIndex < layArray[1]->
nWires(); cellIndex++ )
103 double phi = layArray[1]->
getWire( cellIndex )->
phiE();
104 for (
int i = 0; i < 4; i++ )
106 wireIndex[i] = cellIndex;
107 if ( slayer->
slayNum() > 4 )
continue;
108 if ( ( slayer->
slayNum() > 9 ) && ( i == 3 ) )
break;
109 if ( i == 1 )
continue;
110 if ( i == 3 ) phi = layArray[2]->
getWire( wireIndex[2] )->
phiE();
111 BesAngle tmp( phi - layArray[i]->phiEPOffset() );
112 int wlow = (int)floor( layArray[i]->nWires() * tmp.
rad() / twopi );
113 int wbig = (int)ceil( layArray[i]->nWires() * tmp.
rad() / twopi );
119 if ( i != 3 ) { wireIndex[i] = wbig; }
120 else { wireIndex[i] = wlow; }
122 wireIndex[i] =
mdcWrapWire( wireIndex[i], layArray[i]->nWires() );
126 unsigned bitWord = 1u;
128 for (
int ii = 0; ii < 8; ii++ )
132 if ( layArray[layerWire[ii][0]] == 0 )
continue;
134 int laynum = layArray[layerWire[ii][0]]->
layNum();
135 int wire = wireIndex[layerWire[ii][0]] + layerWire[ii][1];
136 wire =
mdcWrapWire( wire, layArray[layerWire[ii][0]]->nWires() );
137 MdcHit* thisHit =
map->hitWire( laynum, wire );
140 if ( !usedHits.
get( thisHit )->deadHit() )
142 groupHits[ii] = thisHit;
143 groupWord |= bitWord;
152 if ( ( ii == 2 && nGroup < 1 ) || ( ii == 4 && nGroup < 2 ) )
break;
155 if ( nGroup < 3 )
continue;
158 int lastWire =
mdcWrapWire( cellIndex - 1, layArray[0]->nWires() );
159 if (
map->hitWire( layArray[1]->
layNum(), lastWire ) != 0 ) lPrevHit = 1;
164 int nPatt = patternList.npatt4[groupWord];
166 if ( ( layArray[1]->layNum() == 5 ) && ( cellIndex == 46 ) )
168 for (
int i = 0; i < 4; i++ )
179 newSegs = tryPatterns( groupHits, groupWord, 4, lPrevHit, nPatt,
180 patternList.allowedPatt4[groupWord], slayer, segs, usedHits,
188 for (
int i = 0; i < 8; i++ )
190 if ( groupHits[i] != 0 )
192 if ( usedHits.
get( groupHits[i] )->usedSeg() == 0 ) nUnused++;
197 nPatt = patternList.npatt3[groupWord];
201 newSegs = tryPatterns( groupHits, groupWord, 3, lPrevHit, nPatt,
202 patternList.allowedPatt3[groupWord], slayer, segs, usedHits,
209 slayer = slayer->
next();
218 nSegs = segs.
count();
220 if ( 5 == segs.
segPar()->
lPrint ) { cout <<
"Number of Segs found: " << nSegs <<
"\n"; }
226int MdcSegFinder::tryPatterns(
MdcHit* groupHits[8],
unsigned groupWord,
int nInPatt,
227 int lPrevHit,
int npatt,
int* allowedPat,
239 patterns = patternList.
patt3;
244 patterns = patternList.patt4;
245 ambigPatt = patternList.ambigPatt4;
248 MdcSeg* trialSeg =
new MdcSeg( t0 );
253 MdcHit* spanHits[12];
257 for (
int iPatt = 0; iPatt < npatt; iPatt++ )
259 unsigned thisPat = patterns[allowedPat[iPatt]];
260 unsigned testWord = thisPat & groupWord;
262 if (
countbits( testWord ) < nInPatt )
continue;
263 if ( lPrevHit && nInPatt == 3 && ( thisPat == 051 || thisPat == 0111 ) )
continue;
267 unsigned bitadd = 1u;
269 for (
int ibit = 0; ibit < nbit; ibit++ )
272 if ( bitadd & thisPat )
274 const MdcLayer* layer = groupHits[ibit]->
layer();
275 if ( layer == 0 ) cout <<
"huh?" << endl;
276 span.x[nhit] = layer->
rMid() - slay->
rad0();
277 spanHits[nhit] = groupHits[ibit];
279 if ( nhit == nInPatt )
break;
288 std::map<int, MdcSeg*> bestTrialSegs;
290 int namb = 1 << nInPatt;
293 for (
int iamb = 0; iamb < namb; iamb++ )
297 if ( ambigPatt[allowedPat[iPatt]][iamb] != 1 )
continue;
302 for ( ihit = 0; ihit < nInPatt; ihit++ )
304 spanAmbig[ihit] = ( ( 1u << ihit ) & iamb ) ? 1 : -1;
305 nUsed += usedHits.
get( spanHits[ihit] )->usedAmbig( spanAmbig[ihit] );
307 if ( nUsed >= nInPatt )
continue;
318 double phiIn =
mdcWrapAng( spanHits[nInPatt - 1]->phi(), spanHits[0]->phi() );
320 ( ( spanHits[nInPatt - 1]->
phi() +
321 spanAmbig[nhit - 1] *
322 spanHits[nInPatt - 1]->driftDist( t0, spanAmbig[nhit - 1] ) / rOut ) -
323 ( phiIn + spanAmbig[0] * spanHits[0]->driftDist( t0, spanAmbig[0] ) / rIn ) ) /
326 double corr = sqrt( 1 + slay->
rad0() * slay->
rad0() * dphidr * dphidr );
330 std::cout << __FILE__ <<
" " << __LINE__ <<
" corr" << corr <<
" phi_n "
331 << spanHits[nInPatt - 1]->
phi() <<
" dd_n "
332 << spanAmbig[nhit - 1] *
333 spanHits[nInPatt - 1]->
driftDist( t0, spanAmbig[nhit - 1] )
334 <<
" phiIn " << phiIn <<
" dd_in "
335 << spanAmbig[0] * spanHits[0]->
driftDist( t0, spanAmbig[0] ) << std::endl;
338 bool crossAxis =
false;
341 double sigmaSum = 0.;
342 double driftSum = 0.;
345 for ( ihit = 0; ihit < nInPatt; ihit++ )
347 ahit = spanHits[ihit];
348 double rinv = 1. / ahit->
layer()->
rMid();
349 double drift = ahit->
driftDist( t0, spanAmbig[ihit] );
351 ahit->
phi() + spanAmbig[ihit] * drift * ( corr * rinv );
355 std::cout <<
" in segment finding (" << ahit->
layernumber() <<
","
357 <<
" |driftDist| " << fabs( drift ) <<
" ambig " << spanAmbig[ihit]
358 <<
" corr " << corr <<
" rinv " << rinv <<
" sigma "
359 << ahit->
sigma( drift, spanAmbig[ihit] ) << std::endl;
363 span.sigma[ihit] = ahit->
sigma( fabs( drift ), spanAmbig[ihit] ) * ( corr * rinv );
366 sigmaSum += span.sigma[ihit];
368 driftHit[ihit] = drift;
372 if ( ( span.y[ihit] != 0 ) && ( !crossAxis ) )
374 if ( ( yOld / span.y[ihit] ) < 0 ) crossAxis =
true;
390 for (
int ihit = 0; ihit < nInPatt; ihit++ )
393 if (
abs( span.y[ihit] ) < 0.7 )
break;
394 if ( span.y[ihit] < 0 ) span.y[ihit] += twopi;
401 std::cout <<
" first fit(" << nInPatt <<
")" << std::endl;
403 BesAngle temp = span.intercept;
404 span.intercept = temp.
posRad();
405 double t_segchi2 = span.chisq / ( nInPatt - 2 );
410 for (
int ii = 0; ii < nInPatt; ii++ )
412 std::cout << __FILE__ <<
" " << __LINE__ <<
" " << ii <<
" span.x " << setw( 10 )
413 << span.x[ii] <<
" y " << setw( 10 ) << span.y[ii] <<
" sigma "
414 << setw( 10 ) << span.sigma[ii] << std::endl;
427 std::cout << __FILE__ <<
" " << __LINE__ <<
" pattern " << thisPat <<
" nHit "
428 << nInPatt <<
" chi2/dof " << t_segchi2 <<
" chisq " << span.chisq
430 for (
int jj = 0; jj < nInPatt; jj++ )
432 std::cout <<
"resid[" << jj <<
"] " << span.resid[jj] <<
" sigma " << span.sigma[jj]
434 << span.resid[jj] * span.resid[jj] / ( span.sigma[jj] * span.sigma[jj] )
442 std::cout << __FILE__ <<
" " << __LINE__ <<
"CUT! chi2/(N-2) "
443 << span.chisq / ( nInPatt - 2 ) <<
" > " << segs.
segPar()->
maxChisq
445 for ( std::map<int, MdcSeg*>::iterator
iter = bestTrialSegs.begin();
446 iter != bestTrialSegs.end();
iter++ )
447 { cout <<
" bestTrialSeg nHit=" <<
iter->first << endl; }
455 std::cout <<
" CUT by span.|slope| " << span.slope <<
" > pi" << std::endl;
459 int nInSeg = nInPatt;
466 corr = sqrt( 1 + slay->
rad0() * slay->
rad0() * dphidr * dphidr );
468 for ( ihit = 0; ihit < nInSeg; ihit++ )
470 ahit = spanHits[ihit];
471 double rinv = 1. / ahit->
layer()->
rMid();
472 double drift = ahit->
driftDist( t0, spanAmbig[ihit] );
474 ahit->
phi() + spanAmbig[ihit] * drift * ( corr * rinv );
481 span.sigma[ihit] = ahit->
sigma( fabs( drift ), spanAmbig[ihit] ) * ( corr * rinv );
483 if ( ( span.y[ihit] != 0 ) && ( !crossAxis ) )
485 if ( ( yOld / span.y[ihit] ) < 0 ) crossAxis =
true;
493 for (
int ihit = 0; ihit < nInPatt; ihit++ )
496 if (
abs( span.y[ihit] ) < 0.7 )
break;
497 if ( span.y[ihit] < 0 ) span.y[ihit] += twopi;
501 std::cout <<
" second fit(" << nInSeg <<
")" << std::endl;
504 BesAngle temp = span.intercept;
505 span.intercept = temp.
posRad();
511 std::cout << __FILE__ <<
" " << __LINE__ <<
"CUT! chi2/(N-2) "
512 << span.chisq / ( nInPatt - 2 ) <<
" > " << segs.
segPar()->
maxChisq
514 for ( std::map<int, MdcSeg*>::iterator
iter = bestTrialSegs.begin();
515 iter != bestTrialSegs.end();
iter++ )
516 { cout <<
" bestTrialSeg nHit=" <<
iter->first << endl; }
524 trialSeg->
setValues( nInPatt, nInSeg, spanHits, &span, slay, spanAmbig );
528 std::cout <<
" try: " << std::endl;
530 std::cout <<
" " << std::endl;
535 nInSeg = trialSeg->
addHits( &span, spanHits, map, corr );
540 for ( std::map<int, MdcSeg*>::iterator
iter = bestTrialSegs.begin();
541 iter != bestTrialSegs.end();
iter++ )
543 cout <<
" bestTrialSeg nHit=" <<
iter->first <<
" chi2 " <<
iter->second->chisq()
546 std::cout <<
"trialSeg chisq " << trialSeg->
chisq()
548 cout <<
"segment phi: " << trialSeg->
phi() <<
" slope: " << trialSeg->
slope()
549 <<
" nhit: " << trialSeg->
nHit() <<
" chi2 " << trialSeg->
chisq() << endl;
551 for (
int i = 0; i < trialSeg->
nHit(); i++ )
553 int ambi = trialSeg->
hit( i )->
ambig();
554 const MdcHit* theHit = trialSeg->
hit( i )->
mdcHit();
555 theHit->
print( cout );
556 cout <<
" ambig " << ambi;
562 if ( nInPatt == 4 ) trialSeg->
setFull();
566 double t_mcRadio = -1.;
567 double t_nAmbigRight = 0.;
569 for (
int ii = 0; ii < trialSeg->
nHit(); ii++ )
585 for (
int ii = 0; ii < trialSeg->
nHit(); ii++ )
590 if ( t_mcRadio > -998. ) t_mcRadio = t_nSame / nInSeg;
618 std::map<int, MdcSeg*>::iterator
iter = bestTrialSegs.find( trialSeg->
nHit() );
619 if (
iter == bestTrialSegs.end() )
621 bestTrialSegs.insert(
622 std::map<int, MdcSeg*>::value_type( trialSeg->
nHit(), trialSeg ) );
625 std::cout <<
" ----insert " << trialSeg->
nHit() << std::endl;
627 std::cout <<
" \n " << std::endl;
632 if ( trialSeg->
chisq() <
iter->second->chisq() )
634 MdcSeg* tempSeg =
iter->second;
636 iter->second = trialSeg;
639 std::cout <<
" ----update " <<
iter->first << std::endl;
641 std::cout <<
" \n " << std::endl;
648 std::cout <<
"DROP TrialSeg " << std::endl;
650 std::cout <<
" \n " << std::endl;
678 trialSeg =
new MdcSeg( t0 );
682 for ( std::map<int, MdcSeg*>::iterator
iter = bestTrialSegs.begin();
683 iter != bestTrialSegs.end();
iter++ )
688 std::cout <<
" append bestTrialSeg of nHit " <<
iter->first << std::endl;
689 iter->second->plotSeg();
690 std::cout << std::endl;
694 bestTrialSegs.clear();
NTuple::Item< double > g_findSegMc
NTuple::Tuple * g_tupleFindSeg
NTuple::Item< int > g_findSegPat34
NTuple::Item< double > g_findSegAmbig
NTuple::Item< int > g_findSegPat
NTuple::Item< double > g_findSegChi2Refit
int haveDigiAmbig[43][288]
NTuple::Item< double > g_findSegIntercept
NTuple::Item< double > g_findSegChi2
NTuple::Item< double > g_findSegChi2Add
NTuple::Item< double > g_findSegSlope
NTuple::Item< int > g_findSegSl
NTuple::Item< int > g_findSegNhit
int countbits(unsigned word)
double mdcWrapAng(double phi1, double phi2)
int mdcWrapWire(int wireIn, int nCell)
const MdcSuperLayer * firstSlay(void) const
const MdcHit * mdcHit() const
unsigned layernumber() const
unsigned wirenumber() const
void print(std::ostream &o) const
double sigma(double, int, double, double, double) const
double driftDist(double, int, double, double, double) const
const MdcLayer * layer() const
MdcSWire * getWire(int wire) const
bool get(const K &theKey, V &theAnswer) const
MdcSegFinder(int useAllAmbig)
int createSegs(const MdcDetector *gm, MdcSegList &segs, const MdcMap< const MdcHit *, MdcSegUsage * > &usedHits, const MdcHitMap *map, double tbunch)
void append(MdcSeg *aSeg)
void resetSeed(const MdcDetector *gm)
void setValues(int nInPatt, int nhit, MdcHit *hits[], MdcLine *span, const MdcSuperLayer *slay, int ambig[])
int addHits(MdcLine *span, MdcHit *hits[], const MdcHitMap *, double corr)
void setPattern(unsigned thePatt)
MdcHitUse * hit(int i) const
void markHits(const MdcMap< const MdcHit *, MdcSegUsage * > &usedHits) const
const MdcSuperLayer * next(void) const
const MdcLayer * lastLayer(void) const
const MdcLayer * layer(int i) const
const MdcLayer * firstLayer(void) const