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

Go to the documentation of this file.
00001 //
00002 // $Id: MdcTrackListCsmc.cxx,v 1.7 2008/04/01 03:14:36 zhangy Exp $
00003 //
00004 #include "MdcTrkRecon/MdcTrackListCsmc.h"
00005 #include <math.h>
00006 #include <iostream>
00007 #include "MdcData/MdcHitOnTrack.h"
00008 #include "MdcRawEvent/MdcDigi.h"
00009 #include "MdcTrkRecon/MdcTrack.h"
00010 #include "MdcTrkRecon/MdcSegGrouperSt.h"
00011 #include "MdcTrkRecon/MdcSegList.h"
00012 #include "MdcTrkRecon/MdcSegGrouperCsmc.h"
00013 #include "TrkBase/TrkHitList.h"
00014 #include "TrkBase/TrkExchangePar.h"
00015 #include "TrkBase/TrkRecoTrk.h"
00016 #include "TrkBase/TrkFit.h"
00017 #include "TrkBase/TrkExchangePar.h"
00018 #include "TrkBase/TrkExchangePar.h"
00019 #include "TrkBase/TrkErrCode.h"
00020 #include "TrkFitter/TrkLineMaker.h"
00021 
00022 //yzhang hist cut
00023 #include "AIDA/IHistogram1D.h"
00024 //extern AIDA::IHistogram1D*  g_tkChi2;
00025 //zhangy hist cut
00026 
00027 // IOS_USING_DECLARATION_MARKER - BaBar iostreams migration, do not touch this line!
00028 using std::cout;
00029 using std::endl;
00030 
00031 // End Implementation Dependencies -------------------------------------
00032 
00033 // *************************************************************************
00034 MdcTrackListCsmc::MdcTrackListCsmc(const MdcTrackParams &tkPar) : 
00035   MdcTrackListBase(tkPar) { 
00036 // *************************************************************************
00037     return;
00038   }
00039 
00040 // *************************************************************************
00041 MdcTrackListCsmc::~MdcTrackListCsmc() {} 
00042 // *************************************************************************
00043 
00044 // *************************************************************************
00045 int MdcTrackListCsmc::createFromSegs(MdcSegList *segs, const MdcHitMap*, 
00046                                      const MdcDetector* gm, 
00047                                      TrkContext& context, double t0) {
00048 // *************************************************************************
00049   // Forms tracks out of list of superlayer segments
00050   int nTracks = 0;
00051   // Create empty list of stereo segs (to save time)
00052   MdcSegGrouperSt stereoSegs(gm,tkParam.lPrint);
00053   // *** Create r-phi track
00054 
00055   // Create list of axial segments, treated as on straight tracks
00056   MdcSegGrouperCsmc straightSegs(gm, tkParam.lPrint);
00057   straightSegs.fillWithSegs(segs);
00058   //std::cout<< "after straight fill  " << std::endl; 
00059   //segs->plot();//yzhang debug
00060   MdcSeg *seed;
00061   int goodOnly = 1;
00062   MdcTrack* trialTrack = 0;
00063   while (1) {
00064     seed = segs->getSeed(0,goodOnly);
00065     if (seed == 0 && goodOnly == 1) {
00066       segs->resetSeed(gm);
00067       goodOnly = 0;
00068       continue;
00069     }
00070     else if (seed == 0 && goodOnly == 0) {
00071       break;
00072     }
00073     delete trialTrack;
00074     trialTrack = 0;            
00075     int success = straightSegs.combineSegs(trialTrack, seed,
00076                                            context, t0, tkParam.maxSegChisqO);
00077     if (!success) {
00078       //std::cout<< " MdcTrackListCsmc::combineSegs not successed!" << std::endl;
00079       continue;
00080     }
00081 
00082     if (tkParam.lPrint > 1) {
00083       trialTrack->track().printAll(cout);
00084     }
00085     // *** End r-phi track-finding
00086 
00087     // *** Add stereo to taste
00088     stereoSegs.fillWithSegs(segs, trialTrack);
00089 
00090     success = stereoSegs.combineSegs(trialTrack, 0, context, t0, 
00091                                      tkParam.maxSegChisqO);
00092     if (success) {
00093     // Finish 3-d track;
00094       success = finish3d(trialTrack->track());
00095       //      success = finish3d(trialTrack->track()); // GSciolla: try to repeat
00096     }  
00097     if (!success) {
00098       //std::cout<< " MdcTrackListCsmc::finish3d not successed!" << std::endl;
00099       continue;
00100     }
00101 
00102     if (tkParam.lPrint > 1) {
00103       trialTrack->track().printAll(cout);
00104     }
00105 
00106     nTracks++;
00107     append(trialTrack);    // Add to list of Tracks
00108     trialTrack = 0;
00109     
00110   }  // end while(1)   
00111   delete trialTrack;
00112   
00113 
00114   //cout << " Number of Tracks found= " << nTracks  ;
00115   //cout << " " << endl;
00116   return nTracks;
00117 }
00118 
00119 // ************************************************************************
00120 int MdcTrackListCsmc::finish3d(TrkRecoTrk &trk) {
00121 // ************************************************************************
00122   int success = 0;
00123   int nParamFit = 0 ;
00124 
00125   TrkErrCode fitResult;
00126 
00127   // ------------------------
00128   //   4 param fit (line)
00129   // ------------------------
00130   nParamFit = 4;
00131   TrkLineMaker makeFit;
00132   makeFit.changeFit(trk);
00133   makeFit.setFlipAndDrop(trk, true, true);
00134   //setCosmic(&trk);    // set hot to cosmics OBSOLETE! REMOVE!
00135   fitResult = trk.hits()->fit();
00136   makeFit.setFlipAndDrop(trk, false, false);  
00137   
00138   // ---------------------------------------------------------------
00139   // Are there some TDC that can be replaced with later measurements? ( beginning) 
00140   // ---------------------------------------------------------------
00141   // Note to Sciolla: multiple hits commented out for now OK! I will put it back later...
00142   /*  if( _flags.useMultipleHits ) { 
00143     int NHITS   = trk.nHit(); 
00144     
00145     if (fitResult.success()) {
00146       int ifirst = 0;     
00147       for (int ihot = 0; ihot < NHITS ; ihot++) {
00148         
00149         MdcHitOnTrack* ahot = (MdcHitOnTrack*)trk.hitAList()[ihot];
00150         double firstTime = ahot->mdcHit()->rawTime(0); 
00151         
00152         // Get the list of times for this Digi 
00153         const MdcDigi* tmpDigi = ahot->mdcHit()->digi() ; 
00154 //      int nTDChits = tmpDigi->getTdcTimeAList()->length() ;
00155         int nTDChits = tmpDigi->tmdcits() ;
00156         
00157         double newTime=0. ; 
00158         
00159         for( int il = 1; il<nTDChits ; il++){ 
00160           
00161           // get the time corresponding to this doca ---> distance to time 
00162           newTime = tmpDigi->TdcTime(il); 
00163           double newDrift = ahot->layer()->timeToDistance(newTime); 
00164           
00165           double tmp_doca  = ahot->dcaToWire();
00166           double new_diff = fabs(fabs(tmp_doca)-fabs(newDrift)); 
00167           double tmp_drift = ahot->drift();
00168           double tmp_drift2 = 
00169             ahot->layer()->timeToDistance(tmpDigi->TdcTime(0)); 
00170           double old_diff  = fabs(fabs(tmp_doca)-fabs(tmp_drift2)); 
00171           
00172           if( ((old_diff-new_diff)>0.1)  // new time better then old of at least 1 mm  
00173               && (new_diff<=0.8) ) { // and newresid < 2 mm 
00174             //  if(_flags.debug) {                  
00175             if(1) { 
00176               
00177               if(ifirst==0) { 
00178                 ifirst = 1 ; 
00179                 cout <<" nHits | time1  |fittim | time2 | doca(mm) | drift1 " 
00180                      <<"  drift1(rec) | drift2 | layer | wire | isActive" 
00181                      << " | chi2 | nactive" << endl; 
00182               }
00183               
00184               int isAct = 1 ; 
00185               if (!ahot->isActive()) { 
00186                 isAct = 0 ; 
00187                 //      cout<< " >> " ;    
00188                 //      cout << "This hit is not active " << endl ;
00189               }
00190               
00191               cout << "   " << nTDChits 
00192                    << "    " << tmpDigi->TdcTime(0) 
00193                    << "  " << ahot->fitTime()
00194                    << "  " <<  newTime  
00195                    << "  " << tmp_doca*10
00196                    << "  " << tmp_drift*10 
00197                    << "  " << tmp_drift2*10 
00198                    << "  " << newDrift*10 
00199                    << "  " << ahot->layer()->layNum() 
00200                    << "  " << ahot->wire()
00201                    << "  " <<  isAct 
00202                    << "  " << trk.chisq()
00203                    << "  " << trk.nActive() 
00204                    << endl;       
00205               
00206               cout << " old/new diff (mm) = " << old_diff*10 
00207                    << " | " << new_diff*10
00208                    << endl ; 
00209             }     
00210             
00211             ahot->setTimeIndex(il) ; 
00212             //  cout << "new rawtime =" 
00213             //     << ahot->mdcHit()->rawTime(0)<< endl ; // check the new value 
00214             
00215             
00216             // store results in ntuple to see improvements ... before ...               
00217             HepTuple* tupleMultHits = _manager->ntuple("multiHits");
00218             
00219             tupleMultHits->column("ch2Dof1", trk.chisq()/(trk.nActive() - 4));
00220             tupleMultHits->column("nActiv1", trk.nActive());
00221             tupleMultHits->column("resid1",ahot->resid());
00222             tupleMultHits->column("doca1",ahot->resid()+ahot->drift()); 
00223             tupleMultHits->column("time1",  ahot->fitTime() );   
00224             tupleMultHits->column("rawtime1",  ahot->mdcHit()->rawTime(il) ); 
00225             
00226             // - make the hit active and usable 
00227             ahot->setActivity(true);
00228             
00229             // now refit the track ... 
00230             fitResult = trk.fit();
00231             
00232             // store results in ntuple to see improvements ... after ...                
00233             tupleMultHits->column("ch2Dof2", trk.chisq()/(trk.nActive() - 4));
00234             tupleMultHits->column("nActiv2", trk.nActive());
00235             tupleMultHits->column("resid2",ahot->resid());
00236             tupleMultHits->column("doca2",ahot->resid()+ahot->drift()); 
00237             tupleMultHits->column("time2",  ahot->fitTime() );   
00238             tupleMultHits->column("rawtime2",  ahot->mdcHit()->rawTime(il) );   
00239             tupleMultHits->dumpData();
00240           }
00241         }
00242       }
00243     }  
00244   } // Are there some TDC that can be replaced with later measurements?  (end)
00245   */
00246   
00247   const TrkFit* tkFit = trk.fitResult();
00248   double chisqperDOF = 0.;
00249   if (fitResult.success()) {
00250     int nDOF = tkFit->nActive() - nParamFit;
00251     if (nDOF > nParamFit) 
00252       chisqperDOF = tkFit->chisq() / nDOF;
00253     else 
00254       chisqperDOF = tkFit->chisq();
00255     int goodMatch = 1;
00256     if (chisqperDOF > tkParam.maxChisq) goodMatch = 0;
00257     if (tkFit->nActive() < tkParam.minHits) goodMatch = 0;
00258 
00259     if (goodMatch) success = 1;
00260   }
00261   
00262   return success;
00263 }
00264 
00265 
00267 //void MdcTrackListCsmc::setCosmic(TrkRecoTrk  *recoTrk ) {
00269 //
00273   //TrkHitList* hitList = recoTrk->hits();
00274   //assert (hitList != 0);
00275   //for (int layer = 1; layer <= 16; layer++) {
00277     //TrkHitList::hot_iterator end(hitList->end());
00278     //for ( TrkHitList::hot_iterator ihot(hitList->begin()) ; ihot != end; ++ihot) {
00279       //const MdcHitOnTrack* ahot = ihot->mdcHitOnTrack();
00280 //
00285 //
00286     //}  // loop over hits
00287   //}
00288 //}
00289 
00290 
00291 
00292 

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