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