/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Reconstruction/MdcPatRec/MdcTrkRecon/MdcTrkRecon-00-03-45/src/MdcSegFinder.cxx

Go to the documentation of this file.
00001 //--------------------------------------------------------------------------
00002 // File and Version Information:
00003 //      $Id: MdcSegFinder.cxx,v 1.17 2012/10/18 08:35:38 zhangy Exp $
00004 //
00005 // Description:
00006 //
00007 //
00008 // Environment:
00009 //      Software developed for the BaBar Detector at the SLAC B-Factory.
00010 //
00011 // Authors: 
00012 //      Steve Schaffner
00013 //      Zhang Yao(zhangyao@ihep.ac.cn) Migration for BESIII
00014 //      2010-04-13 
00015 //      Zhang Yao(zhangyao@ihep.ac.cn) Keep best segment for 4-hit pattern
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 //yzhang hist cut
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 //zhangy hist cut
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   // Forms all possible Segs of hits to act as candidate tracks
00072   // Construct group of 8 hits; translate hit wires into bit-mapped word
00073   // and look up valid patterns (if any) for this group.
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;  // flags that 2nd layer was hit in last group
00081   //which layer/wire to look at for each hit in group
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   // Loop through the superlayers
00087   const MdcSuperLayer *slayer = gm->firstSlay();
00088   while (slayer != 0) {
00089     const MdcLayer *layArray[4];
00090     int wireIndex[4];
00091 
00092 
00093     //    layArray[0] = slayer->firstLayer();
00094     //    for (int i = 1; i < 4; i++) layArray[i] = gm->nextLayer(layArray[i-1]);
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     //    std::cout<<"-------------super layer----- "<<slayer->Id() << " nlayer "<<nslay<<std::endl;
00101     //for (int i = 0; i < nslay; i++) std::cerr<<layArray[i]->Id()<<" "<<layArray[i]->nWires()<<"\n";
00102     //slayer = slayer->next();continue;
00103 
00104 
00105 
00106     // Loop over cells (index refers to cells in 2nd layer of superlayer)
00107     for (int cellIndex = 0; cellIndex < layArray[1]->nWires(); cellIndex++) {
00108       //yzhang change FIXME         
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;//nWires over No.4 slayer is uniform
00113         if ( (slayer->slayNum() > 9) && (i==3) ) break;//stop when get last layer
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         //zhangy change                                   
00129         wireIndex[i] = mdcWrapWire(wireIndex[i], layArray[i]->nWires());
00130       }
00131       // Form group of 8 wires
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());  //handle wrap-around
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             //      cout << "Skipping hit " << endl;
00151           }
00152         }
00153         // Quit if no hits in 1st 2 layers or 1 hit in 3 layers
00154         if ( (ii == 2 && nGroup < 1) || (ii == 4 && nGroup < 2) ) break;
00155         bitWord <<= 1;
00156       }
00157       if (nGroup < 3) continue;
00158 
00159       //int lastWire = mdcWrapWire(cellIndex - 1, layArray[1]->nWires());//2011-08-10 
00160       int lastWire = mdcWrapWire(cellIndex - 1, layArray[0]->nWires());
00161       if (map->hitWire(layArray[1]->layNum(), lastWire) != 0) lPrevHit = 1;
00162       //      if (layArray[1]->hitWire(lastWire) != 0) lPrevHit = 1;
00163       else lPrevHit = 0;
00164 
00165       // Try all allowed 4-hit patterns for this group (if any)
00166       int nPatt = patternList.npatt4[groupWord];
00167 
00168       if ((layArray[1]->layNum()==5) && (cellIndex ==46)) {
00169         for(int i=0;i<4;i++){
00170           //std::cout<<__FILE__<<" "<<__LINE__<<"====("<<layArray[i]->layNum()<<","<< wireIndex[i]<<")" << std::endl;
00171         }
00172         //std::cout<<__FILE__<<" "<<__LINE__<< " groupWord:"<<groupWord<<" nPatt:"<<nPatt<< std::endl;
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       // If unsuccessful, try 3-hit patterns ???? may want to try 2nd pass here
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     }  // cellIndex loop
00202 
00203     slayer = slayer->next();
00204   }   //superlayer loop
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); // start w/ 1 seg active
00241 
00242   // Create temporary array of hit structures for fitting segment
00243   MdcLine span(12);
00244   int spanAmbig[12];
00245   MdcHit *spanHits[12];
00246   MdcHit *ahit;
00247 
00248   // *** Loop over the allowed pattern for this group
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     // *** Load the hits into hit structure (radius only at this point)
00258     // radius is rel. to avg. for superlayer; resolution is converted to delphi
00259     unsigned bitadd = 1u;
00260     int nhit = 0;
00261     for (int ibit = 0; ibit < nbit; ibit++) {
00262       // Is this cell in the pattern?
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     // *** Loop through all ambiguity combinations; the loop counter also
00275     //    serves as a bit-mapped pattern of ambiguities
00276     //    Discard combo if all hits have been used w/ this ambig before
00277 
00278     std::map<int, MdcSeg*> bestTrialSegs;//yzhang 2012-09-18 
00279 
00280     int namb = 1 << nInPatt;
00281     //std::cout<< __FILE__ << "   " << __LINE__ << " namb  "<<namb<<" nInPatt "<<nInPatt<<std::endl;
00282     for (int iamb = 0; iamb < namb; iamb++) {
00283 
00284       // Skip all but allowed ambiguity patterns
00285       if (ambigPatt[ allowedPat[iPatt] ][iamb] != 1) continue;
00286 
00287       // Convert loop counter into physical ambiguity (0=> -1; 1=>+1)
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       // ***Calculate phi for each hit, correcting approx. for angle of track
00297       /* First calculate a correction factor for the drift distance (since
00298          we're treating hits as being at radius of wire).  This may slow
00299          things down.*/
00300       /* corr = 1/cos(theta), where theta = del(d)/del(r), taken over the
00301          span.  Use 1/cos = sqrt(1+tan**2) for calculating correction.  */
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);//yzhang temp FIXME
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       //yzhang add fix phi accross -x axis
00321       bool crossAxis=false;
00322       double yOld = 0;
00323       //zhangy add
00324       double sigmaSum= 0.;
00325       double driftSum= 0.;
00326       double driftHit[12];
00327       // Actual phi calc
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);//yzhang temp FIXME
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         //span.sigma[ihit] = ahit->sigma(fabs(drift), spanAmbig[ihit]);
00339         //yzhang 2010-05-20 , FIXME
00340         span.sigma[ihit] = ahit->sigma(fabs(drift), spanAmbig[ihit]) * (corr * rinv);
00341 
00342         //yzhang add temp FIXME
00343         sigmaSum+= span.sigma[ihit];
00344         driftSum+=drift;
00345         driftHit[ihit]=drift;   
00346         //zhangy add temp FIXME
00347 
00348         //yzhang add fix phi accross -x axis,set flag
00349         if ( (span.y[ihit]!=0) && (!crossAxis)){
00350           if ( (yOld / span.y[ihit]) < 0) crossAxis = true;
00351           yOld = span.y[ihit];
00352         }
00353         //zhangy add
00354       }
00355 
00356       //yzhang add temp FIXME
00357       //for (ihit = 0; ihit < nInPatt; ihit++) {
00358       //span.sigma[ihit] = sigmaSum/nInPatt*
00359       //( fabs(driftHit[ihit]-(driftSum/nInPatt))/(driftSum/nInPatt) );
00360       //}
00361       //zhangy add temp FIXME
00362 
00363       //--yzhang add, fix phi accross -x axis , if cross +twopi
00364       if ( crossAxis ){
00365         for (int ihit=0 ; ihit < nInPatt; ihit++){
00366           //Approx,for max phi of a cell is 2*pi/40, max cross 4 cell=0.628<0.7
00367           if (abs(span.y[ihit]) < 0.7) break;
00368           if (span.y[ihit] < 0)span.y[ihit]+=twopi;
00369         }
00370       }
00371       //zhangy add
00372 
00373 
00374       // Fit the segment
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       //yzhang test 2011-06-14  
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       //zhangy test 
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;//yzhang debug 
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; //yzhang add 2012-08-07 
00416       }
00417 
00418       int nInSeg = nInPatt;
00419 
00420       // *** Pick up adjacent hits and refit
00421       // Recalculate correction factor (optional)
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);//yzhang temp FIXME
00432           //yzhang add
00433           //span.y[ihit] = ahit->phi();
00434           //zhangy add
00435 
00436           //yzhang 2010-05-20 , FIXME
00437           //span.sigma[ihit] = ahit->sigma(fabs(drift), spanAmbig[ihit]);
00438           span.sigma[ihit] = ahit->sigma(fabs(drift), spanAmbig[ihit]) * (corr * rinv);
00439           //yzhang add fix phi accross -x axis,set flag
00440           if ( (span.y[ihit]!=0) && (!crossAxis)){
00441             if ( (yOld / span.y[ihit]) < 0) crossAxis = true;
00442             yOld = span.y[ihit];
00443           }
00444           //zhangy add
00445         }
00446         //yzhang add, fix phi accross -x axis , if cross +twopi
00447         if ( crossAxis ){
00448           for (int ihit=0 ; ihit < nInPatt; ihit++){
00449             //Approx,for max phi of a cell is 2*pi/40, max cross 4 cell=0.628<0.7
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         //zhangy add
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();//yzhang temp 2012-09-18 
00480         std::cout<<"   "<<std::endl;
00481       }
00482       if (_addHits) {
00483         // Look for adjacent hits
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;//<<" best chi2 " <<bestTrialSeg->chisq() <<  std::endl;
00493         cout << "segment phi: " <<
00494           trialSeg->phi() << "  slope: " << trialSeg->slope() <<
00495           "  nhit: " << trialSeg->nHit() << " chi2 "<<trialSeg->chisq() << endl;
00496         //cout << "layer, wire, ambig, used, drift: " << endl;
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;//hits in this seg not in same mc track
00521           }
00522 
00523           // test ambig right ratio
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       //--keep only one segment for ambig
00546       if(3 == nInPatt){
00547         segs.append(trialSeg);    // Add to list of Segs
00548         nSegs++;
00549       }else{
00550         //debug
00551         //cout<<" before insert nBest="<<bestTrialSegs.size()<<endl;
00552         //for(std::map<int,MdcSeg*>::iterator iter = bestTrialSegs.begin(); iter != bestTrialSegs.end(); iter++) {
00553         //  cout<<"after insert bestTrialSeg nHit="<<iter->first<<endl;
00554         //  iter->second->plotSeg();
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         //cout<<" after insert nBest="<<bestTrialSegs.size()<<endl;
00582         //for(std::map<int,MdcSeg*>::iterator iter = bestTrialSegs.begin(); iter != bestTrialSegs.end(); iter++) {
00583         //  cout<<"after insert bestTrialSeg nHit="<<iter->first<<endl;
00584         //  iter->second->plotSeg();
00585         //}
00586         //if((bestTrialSeg->nHit() == trialSeg->nHit()) && (bestTrialSeg->chisq() > trialSeg->chisq())){
00587         //  if(5 == segs.segPar()->lPrint) std::cout<< "KEEP trial as best. orignal bestTrialSeg  " 
00588         //    << bestTrialSeg->chisq()<<"/ndof "<<bestTrialSeg->nHit()-2<< "> trialSeg->chisq()  "
00589         //      <<trialSeg->chisq()<<"/ndof "<<trialSeg->nHit()-2<<std::endl;
00590         //  delete bestTrialSeg;
00591         //  bestTrialSeg = trialSeg;
00592         //  }
00593       }
00594 
00595       //--mark best trialSeg
00596       //std::cout<< __LINE__<<" best " <<bestTrialSeg->chisq()<< " trial  " << trialSeg->chisq() <<std::endl;
00597 
00598       trialSeg = new MdcSeg(t0);
00599     }// end ambiguity loop
00600 
00601 
00602     //--keep only one segment/Hit for ambig
00603     for(std::map<int,MdcSeg*>::iterator iter = bestTrialSegs.begin(); iter != bestTrialSegs.end(); iter++) {
00604       segs.append(iter->second);    // Add to list of Segs
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();//empty bestTrialSegs
00612 
00613     nSegs++;
00614 
00615 
00616   }// end pattern loop
00617 
00618   delete trialSeg;
00619   return nSegs;
00620 }

Generated on Tue Nov 29 23:13:34 2016 for BOSS_7.0.2 by  doxygen 1.4.7