00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "MdcTrkRecon/MdcSegFinder.h"
00019 #include "MdcTrkRecon/MdcSegList.h"
00020 #include "MdcTrkRecon/countBits.h"
00021 #include "MdcTrkRecon/mdcWrapWire.h"
00022 #include "MdcTrkRecon/mdcWrapAng.h"
00023 #include "MdcGeom/Constants.h"
00024 #include "MdcTrkRecon/MdcLine.h"
00025 #include "MdcGeom/BesAngle.h"
00026 #include "MdcTrkRecon/MdcSegUsage.h"
00027 #include "MdcTrkRecon/MdcLine.h"
00028 #include "MdcData/MdcHit.h"
00029 #include "MdcTrkRecon/MdcSeg.h"
00030 #include "MdcTrkRecon/GmsList.h"
00031 #include "MdcTrkRecon/MdcMap.h"
00032 #include "MdcGeom/MdcDetector.h"
00033 #include "MdcGeom/MdcSuperLayer.h"
00034 #include "MdcData/MdcHitUse.h"
00035 #include "MdcData/MdcHitMap.h"
00036
00037 #include "GaudiKernel/NTuple.h"
00038 #include <map>
00039
00040 extern NTuple::Tuple* g_tupleFindSeg;
00041 extern NTuple::Item<double> g_findSegChi2;
00042 extern NTuple::Item<double> g_findSegIntercept;
00043 extern NTuple::Item<double> g_findSegSlope;
00044 extern NTuple::Item<double> g_findSegChi2Refit;
00045 extern NTuple::Item<double> g_findSegChi2Add;
00046 extern NTuple::Item<int> g_findSegPat;
00047 extern NTuple::Item<int> g_findSegNhit;
00048 extern NTuple::Item<int> g_findSegPat34;
00049 extern NTuple::Item<int> g_findSegSl;
00050 extern NTuple::Item<double> g_findSegMc;
00051 extern NTuple::Item<double> g_findSegAmbig;
00052 extern int haveDigiTk[43][288];
00053 extern int haveDigiAmbig[43][288];
00054
00055
00056 using std::cout;
00057 using std::endl;
00058
00059
00060 MdcSegFinder::MdcSegFinder(int useAllAmbig) :
00061 patternList(useAllAmbig) {
00062
00063
00064 }
00065
00066 int
00067 MdcSegFinder::createSegs(const MdcDetector *gm, MdcSegList &segs,
00068 const MdcMap<const MdcHit*,MdcSegUsage*>& usedHits, const MdcHitMap* map,
00069 double bunchTime) {
00070
00071
00072
00073
00074
00075 _addHits = segs.segPar()->addHits;
00076 int nSegs = 0;
00077 int newSegs;
00078 unsigned int groupWord;
00079 MdcHit *groupHits[8];
00080 int lPrevHit = 0;
00081
00082 static const int layerWire[8][2] =
00083 { { 0, -1}, { 0, 0}, { 1, 0}, { 2, -1},
00084 { 2, 0}, { 3, -1}, { 3, 0}, { 3, 1} };
00085
00086
00087 const MdcSuperLayer *slayer = gm->firstSlay();
00088 while (slayer != 0) {
00089 const MdcLayer *layArray[4];
00090 int wireIndex[4];
00091
00092
00093
00094
00095 int nslay = slayer->nLayers();
00096 for (int i = 0; i < nslay; i++) layArray[i] = slayer->layer(i);
00097 if(nslay != 4) layArray[3] = 0;
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 for (int cellIndex = 0; cellIndex < layArray[1]->nWires(); cellIndex++) {
00108
00109 double phi = layArray[1]->getWire(cellIndex)->phiE();
00110 for(int i = 0; i < 4; i++ ) {
00111 wireIndex[i] = cellIndex;
00112 if ( slayer->slayNum() > 4) continue;
00113 if ( (slayer->slayNum() > 9) && (i==3) ) break;
00114 if ( i == 1 ) continue;
00115 if ( i == 3 ) phi = layArray[2]->getWire(wireIndex[2])->phiE();
00116 BesAngle tmp(phi - layArray[i]->phiEPOffset());
00117 int wlow = (int)floor(layArray[i]->nWires() * tmp.rad() / twopi );
00118 int wbig = (int)ceil(layArray[i]->nWires() * tmp.rad() / twopi );
00119 if (tmp == 0 ){
00120 wlow = -1;
00121 wbig = 1;
00122 }
00123 if ( i!=3 ) {
00124 wireIndex[i]=wbig;
00125 }else{
00126 wireIndex[i]= wlow;
00127 }
00128
00129 wireIndex[i] = mdcWrapWire(wireIndex[i], layArray[i]->nWires());
00130 }
00131
00132 groupWord = 0u;
00133 unsigned bitWord = 1u;
00134 int nGroup = 0;
00135 for (int ii = 0; ii < 8; ii++) {
00136 groupHits[ii] = 0;
00137
00138 if(layArray[ layerWire[ii][0] ] == 0) continue;
00139
00140 int laynum = layArray[ layerWire[ii][0] ]->layNum();
00141 int wire = wireIndex[ layerWire[ii][0] ] + layerWire[ii][1];
00142 wire = mdcWrapWire(wire, layArray[ layerWire[ii][0] ]->nWires());
00143 MdcHit* thisHit = map->hitWire(laynum, wire);
00144 if (thisHit != 0) {
00145 if ( !usedHits.get(thisHit)->deadHit() ) {
00146 groupHits[ii] = thisHit;
00147 groupWord |= bitWord;
00148 nGroup++;
00149 } else {
00150
00151 }
00152 }
00153
00154 if ( (ii == 2 && nGroup < 1) || (ii == 4 && nGroup < 2) ) break;
00155 bitWord <<= 1;
00156 }
00157 if (nGroup < 3) continue;
00158
00159
00160 int lastWire = mdcWrapWire(cellIndex - 1, layArray[0]->nWires());
00161 if (map->hitWire(layArray[1]->layNum(), lastWire) != 0) lPrevHit = 1;
00162
00163 else lPrevHit = 0;
00164
00165
00166 int nPatt = patternList.npatt4[groupWord];
00167
00168 if ((layArray[1]->layNum()==5) && (cellIndex ==46)) {
00169 for(int i=0;i<4;i++){
00170
00171 }
00172
00173 }
00174
00175 if (nPatt > 0) {
00176 newSegs = tryPatterns(groupHits, groupWord, 4, lPrevHit, nPatt,
00177 patternList.allowedPatt4[groupWord], slayer, segs, usedHits, map,
00178 bunchTime);
00179 nSegs += newSegs;
00180 }
00181
00182
00183
00184 if (!segs.segPar()->find3[slayer->index()]) continue;
00185 int nUnused = 0;
00186 for (int i = 0; i < 8; i++) {
00187 if (groupHits[i] != 0) {
00188 if (usedHits.get(groupHits[i])->usedSeg() == 0) nUnused++;
00189 }
00190 }
00191 if (nUnused > 0) {
00192 nPatt = patternList.npatt3[groupWord];
00193 if (nPatt > 0) {
00194
00195 newSegs = tryPatterns(groupHits, groupWord, 3, lPrevHit, nPatt,
00196 patternList.allowedPatt3[groupWord], slayer, segs, usedHits, map,
00197 bunchTime);
00198 nSegs += newSegs;
00199 }
00200 }
00201 }
00202
00203 slayer = slayer->next();
00204 }
00205
00206 if (nSegs > 0) {
00207 segs.massageSegs();
00208 segs.resetSeed(gm);
00209 }
00210
00211 nSegs = segs.count();
00212
00213 if (5 == segs.segPar()->lPrint){
00214 cout << "Number of Segs found: " << nSegs << "\n";
00215 }
00216
00217 return nSegs;
00218 }
00219
00220
00221 int
00222 MdcSegFinder::tryPatterns(MdcHit *groupHits[8],
00223 unsigned groupWord, int nInPatt,int lPrevHit, int npatt,
00224 int *allowedPat, const MdcSuperLayer *slay, MdcSegList &segs,
00225 const MdcMap<const MdcHit*,MdcSegUsage*>& usedHits, const MdcHitMap* map, double t0) {
00226
00227 int nSegs = 0;
00228 int nbit = 8;
00229
00230 unsigned *patterns;
00231 int **ambigPatt;
00232 if (nInPatt == 3) {
00233 patterns = patternList.patt3;
00234 ambigPatt = patternList.ambigPatt3;
00235 } else {
00236 patterns = patternList.patt4;
00237 ambigPatt = patternList.ambigPatt4;
00238 }
00239
00240 MdcSeg *trialSeg = new MdcSeg(t0);
00241
00242
00243 MdcLine span(12);
00244 int spanAmbig[12];
00245 MdcHit *spanHits[12];
00246 MdcHit *ahit;
00247
00248
00249 for (int iPatt = 0; iPatt < npatt; iPatt++) {
00250 unsigned thisPat = patterns[ allowedPat[iPatt] ];
00251 unsigned testWord = thisPat & groupWord;
00252
00253 if (countbits(testWord) < nInPatt) continue;
00254 if (lPrevHit && nInPatt == 3 && (thisPat == 051 || thisPat == 0111))
00255 continue;
00256
00257
00258
00259 unsigned bitadd = 1u;
00260 int nhit = 0;
00261 for (int ibit = 0; ibit < nbit; ibit++) {
00262
00263 if (bitadd & thisPat) {
00264 const MdcLayer *layer = groupHits[ibit]->layer();
00265 if (layer == 0) cout << "huh?" << endl;
00266 span.x[nhit] = layer->rMid() - slay->rad0();
00267 spanHits[nhit] = groupHits[ibit];
00268 nhit++;
00269 if (nhit == nInPatt) break;
00270 }
00271 bitadd <<= 1;
00272 }
00273
00274
00275
00276
00277
00278 std::map<int, MdcSeg*> bestTrialSegs;
00279
00280 int namb = 1 << nInPatt;
00281
00282 for (int iamb = 0; iamb < namb; iamb++) {
00283
00284
00285 if (ambigPatt[ allowedPat[iPatt] ][iamb] != 1) continue;
00286
00287
00288 int nUsed = 0;
00289 int ihit;
00290 for (ihit = 0; ihit < nInPatt; ihit++) {
00291 spanAmbig[ihit] = ( (1u<<ihit) &iamb) ? 1: -1;
00292 nUsed += usedHits.get(spanHits[ihit])->usedAmbig( spanAmbig[ihit] );
00293 }
00294 if (nUsed >= nInPatt) continue;
00295
00296
00297
00298
00299
00300
00301
00302
00303 double rIn = slay->firstLayer()->rMid();
00304 double rOut = slay->lastLayer()->rMid();
00305 double phiIn = mdcWrapAng(spanHits[nInPatt-1]->phi(),spanHits[0]->phi());
00306 double dphidr = ( (spanHits[nInPatt-1]->phi() + spanAmbig[nhit-1] *
00307 spanHits[nInPatt-1]->driftDist(t0,spanAmbig[nhit-1]) /
00308 rOut) - (phiIn+ spanAmbig[0] * spanHits[0]->driftDist(t0,spanAmbig[0]) / rIn)) / (rOut - rIn);
00309
00310 double corr = sqrt( 1 + slay->rad0() * slay->rad0() * dphidr * dphidr );
00311
00312 if(5 == segs.segPar()->lPrint) {
00313 std::cout<<__FILE__<<" "<<__LINE__<< " corr" <<corr<< " phi_n "
00314 <<spanHits[nInPatt-1]->phi()<<" dd_n "<< spanAmbig[nhit-1] *
00315 spanHits[nInPatt-1]->driftDist(t0,spanAmbig[nhit-1])
00316 <<" phiIn " <<phiIn
00317 <<" dd_in "<< spanAmbig[0] * spanHits[0]->driftDist(t0,spanAmbig[0]) << std::endl;
00318
00319 }
00320
00321 bool crossAxis=false;
00322 double yOld = 0;
00323
00324 double sigmaSum= 0.;
00325 double driftSum= 0.;
00326 double driftHit[12];
00327
00328 for (ihit = 0; ihit < nInPatt; ihit++) {
00329 ahit = spanHits[ihit];
00330 double rinv = 1. / ahit->layer()->rMid();
00331 double drift = ahit->driftDist(t0,spanAmbig[ihit]);
00332 span.y[ihit] = ahit->phi() + spanAmbig[ihit] *
00333 drift * (corr * rinv);
00334
00335 if (5 == segs.segPar()->lPrint) {
00336 std::cout<<" in segment finding ("<<ahit->layernumber()<<","<<ahit->wirenumber()<<")"<<" |driftDist| "<< fabs(drift)<< " ambig "<<spanAmbig[ihit]<< " corr "<<corr<<" rinv "<<rinv<<" sigma "<<ahit->sigma(drift,spanAmbig[ihit])<<std::endl;
00337 }
00338
00339
00340 span.sigma[ihit] = ahit->sigma(fabs(drift), spanAmbig[ihit]) * (corr * rinv);
00341
00342
00343 sigmaSum+= span.sigma[ihit];
00344 driftSum+=drift;
00345 driftHit[ihit]=drift;
00346
00347
00348
00349 if ( (span.y[ihit]!=0) && (!crossAxis)){
00350 if ( (yOld / span.y[ihit]) < 0) crossAxis = true;
00351 yOld = span.y[ihit];
00352 }
00353
00354 }
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364 if ( crossAxis ){
00365 for (int ihit=0 ; ihit < nInPatt; ihit++){
00366
00367 if (abs(span.y[ihit]) < 0.7) break;
00368 if (span.y[ihit] < 0)span.y[ihit]+=twopi;
00369 }
00370 }
00371
00372
00373
00374
00375 if (5 == segs.segPar()->lPrint) std::cout<<" first fit("<<nInPatt<<")"<<std::endl;
00376 span.fit( nInPatt );
00377 BesAngle temp = span.intercept;
00378 span.intercept = temp.posRad();
00379 double t_segchi2 = span.chisq / (nInPatt - 2) ;
00380
00381
00382 if (5 == segs.segPar()->lPrint) {
00383 for(int ii=0;ii<nInPatt;ii++){
00384 std::cout<<__FILE__<<" "<<__LINE__<<" "<<ii <<" span.x "<<setw(10)<<span.x[ii]<<" y "<<setw(10)<<span.y[ii]<<" sigma "<<setw(10)<<span.sigma[ii]<< std::endl;
00385 }
00386 }
00387 if(g_tupleFindSeg != NULL){
00388 g_findSegSlope = span.slope;
00389 g_findSegIntercept = span.intercept;
00390 g_findSegChi2 = t_segchi2;
00391 }
00392
00393
00394
00395 if(5 == segs.segPar()->lPrint) {
00396 std::cout<<__FILE__<<" "<<__LINE__<< " pattern "<< thisPat
00397 <<" nHit "<<nInPatt <<" chi2/dof " << t_segchi2
00398 <<" chisq "<<span.chisq <<" maxChisq="<<segs.segPar()->maxChisq <<std::endl;
00399 for(int jj=0; jj<nInPatt; jj++){
00400 std::cout << "resid["<<jj<<"] "<<span.resid[jj]<<" sigma "<<span.sigma[jj]<<" chisq add "<<span.resid[jj] * span.resid[jj] / (span.sigma[jj] * span.sigma[jj]) << std::endl;
00401 }
00402 }
00403 if (span.chisq / (nInPatt - 2) > segs.segPar()->maxChisq) {
00404 if (5 == segs.segPar()->lPrint) {
00405 std::cout<<__FILE__<<" "<<__LINE__<<"CUT! chi2/(N-2) " <<span.chisq / (nInPatt - 2) <<" > "<< segs.segPar()->maxChisq<< std::endl;
00406 for(std::map<int,MdcSeg*>::iterator iter = bestTrialSegs.begin(); iter != bestTrialSegs.end(); iter++) {
00407 cout<<" bestTrialSeg nHit="<<iter->first<<endl;
00408 }
00409 }
00410 continue;
00411 }
00412
00413 if (span.slope>Constants::pi || span.slope<(-1.)*Constants::pi ) {
00414 if(5 == segs.segPar()->lPrint) std::cout<<" CUT by span.|slope| "<<span.slope<<" > pi"<<std::endl;
00415 continue;
00416 }
00417
00418 int nInSeg = nInPatt;
00419
00420
00421
00422 if (segs.segPar()->segRefit) {
00423 dphidr = span.slope;
00424 corr = sqrt( 1 + slay->rad0() * slay->rad0() * dphidr * dphidr );
00425 crossAxis = false;
00426 for (ihit = 0; ihit < nInSeg; ihit++) {
00427 ahit = spanHits[ihit];
00428 double rinv = 1. / ahit->layer()->rMid();
00429 double drift = ahit->driftDist(t0,spanAmbig[ihit]);
00430 span.y[ihit] = ahit->phi() + spanAmbig[ihit] *
00431 drift * (corr * rinv);
00432
00433
00434
00435
00436
00437
00438 span.sigma[ihit] = ahit->sigma(fabs(drift), spanAmbig[ihit]) * (corr * rinv);
00439
00440 if ( (span.y[ihit]!=0) && (!crossAxis)){
00441 if ( (yOld / span.y[ihit]) < 0) crossAxis = true;
00442 yOld = span.y[ihit];
00443 }
00444
00445 }
00446
00447 if ( crossAxis ){
00448 for (int ihit=0 ; ihit < nInPatt; ihit++){
00449
00450 if (abs(span.y[ihit]) < 0.7) break;
00451 if (span.y[ihit] < 0)span.y[ihit]+=twopi;
00452 }
00453 }
00454 if (5 == segs.segPar()->lPrint) std::cout<<" second fit("<<nInSeg<<")"<<std::endl;
00455
00456 span.fit( nInSeg);
00457 BesAngle temp = span.intercept;
00458 span.intercept = temp.posRad();
00459
00460 if (span.chisq / (nInPatt - 2) > segs.segPar()->maxChisq) {
00461 if (5 == segs.segPar()->lPrint) {
00462 std::cout<<__FILE__<<" "<<__LINE__<<"CUT! chi2/(N-2) " <<span.chisq / (nInPatt - 2) <<" > "<< segs.segPar()->maxChisq<< std::endl;
00463 for(std::map<int,MdcSeg*>::iterator iter = bestTrialSegs.begin(); iter != bestTrialSegs.end(); iter++) {
00464 cout<<" bestTrialSeg nHit="<<iter->first<<endl;
00465 }
00466 }
00467 continue;
00468 }
00469 }
00470
00471 if( g_tupleFindSeg!= NULL){
00472 g_findSegChi2Refit = span.chisq / (nInSeg - 2);
00473 }
00474
00475 trialSeg->setValues(nInPatt, nInSeg, spanHits, &span, slay, spanAmbig);
00476
00477 if (5 == segs.segPar()->lPrint) {
00478 std::cout<<" try: "<<std::endl;
00479 trialSeg->plotSegAll();
00480 std::cout<<" "<<std::endl;
00481 }
00482 if (_addHits) {
00483
00484 nInSeg = trialSeg->addHits(&span, spanHits, map, corr);
00485 }
00486
00487
00488 if (5 == segs.segPar()->lPrint) {
00489 for(std::map<int,MdcSeg*>::iterator iter = bestTrialSegs.begin(); iter != bestTrialSegs.end(); iter++) {
00490 cout<<" bestTrialSeg nHit="<<iter->first<<" chi2 "<<iter->second->chisq()<<endl;
00491 }
00492 std::cout<<"trialSeg chisq "<<trialSeg->chisq()<<std::endl;
00493 cout << "segment phi: " <<
00494 trialSeg->phi() << " slope: " << trialSeg->slope() <<
00495 " nhit: " << trialSeg->nHit() << " chi2 "<<trialSeg->chisq() << endl;
00496
00497 for (int i = 0; i < trialSeg->nHit(); i++) {
00498 int ambi = trialSeg->hit(i)->ambig();
00499 const MdcHit* theHit = trialSeg->hit(i)->mdcHit();
00500 theHit->print(cout);
00501 cout << " ambig " <<ambi;
00502 }
00503 cout << endl;
00504 }
00505 trialSeg->setPattern(iPatt);
00506 trialSeg->markHits(usedHits);
00507 if (nInPatt == 4) trialSeg->setFull();
00508
00509 if( g_tupleFindSeg!= NULL){
00510 double t_mcRadio = -1.;
00511 double t_nAmbigRight= 0.;
00512 int t_tkId= -1;
00513 for(int ii=0;ii<trialSeg->nHit();ii++){
00514 unsigned int l = trialSeg->hit(ii)->mdcHit()->layernumber();
00515 unsigned int w = trialSeg->hit(ii)->mdcHit()->wirenumber();
00516 if ( haveDigiTk[l][w]<0 || haveDigiTk[l][w]>100 ) continue;
00517 if (t_tkId==-1){
00518 t_tkId = haveDigiTk[l][w];
00519 }else if (haveDigiTk[l][w] != t_tkId){
00520 t_mcRadio = -999;
00521 }
00522
00523
00524 if ( haveDigiAmbig[l][w] == trialSeg->hit(ii)->ambig() ) t_nAmbigRight++;
00525 }
00526
00527 double t_nSame = 0.;
00528 for(int ii=0;ii<trialSeg->nHit();ii++){
00529 unsigned int l = trialSeg->hit(ii)->mdcHit()->layernumber();
00530 unsigned int w = trialSeg->hit(ii)->mdcHit()->wirenumber();
00531 if (haveDigiTk[l][w] == t_tkId){ ++t_nSame; }
00532 if(t_mcRadio>-998.) t_mcRadio = t_nSame/nInSeg;
00533 }
00534 g_findSegPat = iPatt;
00535 if(3==nInPatt) g_findSegPat34 = 3;
00536 else g_findSegPat34 = 4;
00537 g_findSegSl = slay->slayNum();
00538 g_findSegMc = t_mcRadio;
00539 g_findSegAmbig = t_nAmbigRight/nInSeg;
00540 g_findSegChi2Add = span.chisq / (nInSeg - 2);
00541 g_findSegNhit = nInSeg;
00542 g_tupleFindSeg->write();
00543 }
00544
00545
00546 if(3 == nInPatt){
00547 segs.append(trialSeg);
00548 nSegs++;
00549 }else{
00550
00551
00552
00553
00554
00555
00556 std::map<int,MdcSeg*>::iterator iter = bestTrialSegs.find(trialSeg->nHit());
00557 if(iter==bestTrialSegs.end()){
00558 bestTrialSegs.insert(std::map<int, MdcSeg*>::value_type(trialSeg->nHit(),trialSeg));
00559 if(5 == segs.segPar()->lPrint){
00560 std::cout<<" ----insert "<<trialSeg->nHit()<<std::endl;
00561 trialSeg->plotSegAll(); std::cout<<" \n "<<std::endl;
00562 }
00563 } else {
00564 if(trialSeg->chisq()<iter->second->chisq()){
00565 MdcSeg* tempSeg= iter->second;
00566 delete tempSeg;
00567 iter->second = trialSeg;
00568 if(5 == segs.segPar()->lPrint){
00569 std::cout<<" ----update "<<iter->first<<std::endl;
00570 trialSeg->plotSegAll(); std::cout<<" \n "<<std::endl;
00571 }
00572 }else{
00573 if(5 == segs.segPar()->lPrint){
00574 std::cout<< "DROP TrialSeg " <<std::endl;
00575 trialSeg->plotSegAll(); std::cout<<" \n "<<std::endl;
00576 }
00577 delete trialSeg;
00578 }
00579 }
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593 }
00594
00595
00596
00597
00598 trialSeg = new MdcSeg(t0);
00599 }
00600
00601
00602
00603 for(std::map<int,MdcSeg*>::iterator iter = bestTrialSegs.begin(); iter != bestTrialSegs.end(); iter++) {
00604 segs.append(iter->second);
00605 if (5 == segs.segPar()->lPrint) {
00606 std::cout<<" append bestTrialSeg of nHit " << iter->first <<std::endl;
00607 iter->second->plotSeg(); std::cout<<std::endl;
00608 }
00609 }
00610
00611 bestTrialSegs.clear();
00612
00613 nSegs++;
00614
00615
00616 }
00617
00618 delete trialSeg;
00619 return nSegs;
00620 }