#include <MdcMergeDups.h>
Public Member Functions | |
StatusCode | beginRun () |
StatusCode | beginRun () |
int | doMergeCurl (std::vector< RecMdcTrack * > mergeTkList) |
int | doMergeCurl (std::vector< RecMdcTrack * > mergeTkList) |
int | doMergeLong (std::vector< RecMdcTrack * > mergeTkList) |
int | doMergeLong (std::vector< RecMdcTrack * > mergeTkList) |
void | dumpRecMdcTrack () |
void | dumpRecMdcTrack () |
bool | eraseTdsTrack (RecMdcTrackCol::iterator tk) |
bool | eraseTdsTrack (RecMdcTrackCol::iterator tk) |
StatusCode | execute () |
StatusCode | execute () |
StatusCode | finalize () |
StatusCode | finalize () |
StatusCode | initialize () |
StatusCode | initialize () |
MdcMergeDups (const std::string &name, ISvcLocator *pSvcLocator) | |
MdcMergeDups (const std::string &name, ISvcLocator *pSvcLocator) | |
int | mergeCurl (void) |
int | mergeCurl (void) |
int | mergeDups (void) |
int | mergeDups (void) |
void | store (TrkRecoTrk *aTrack) |
void | store (TrkRecoTrk *aTrack) |
int | testByOverlapHit (RecMdcTrack *refTk, RecMdcTrack *testTk) |
int | testByOverlapHit (RecMdcTrack *refTk, RecMdcTrack *testTk) |
int | testByParam (RecMdcTrack *refTk, RecMdcTrack *testTk) |
int | testByParam (RecMdcTrack *refTk, RecMdcTrack *testTk) |
virtual | ~MdcMergeDups () |
virtual | ~MdcMergeDups () |
Private Attributes | |
BField * | m_bfield |
BField * | m_bfield |
double | m_bunchT0 |
double | m_Bz |
int | m_debug |
const MdcDetector * | m_gm |
const MdcDetector * | m_gm |
double | m_maxDd0InMerge |
double | m_maxDphi0InMerge |
double | m_maxPdradInMerge |
double | m_maxRcsInMerge |
double | m_mergeLoadAx |
double | m_mergeLoadSt |
double | m_mergeOverlapRatio |
double | m_mergePt |
|
00059 : 00060 Algorithm(name, pSvcLocator) 00061 { 00062 declareProperty("debug", m_debug = 0); 00063 //cuts for mergeDups() 00064 declareProperty("maxDd0InMerge", m_maxDd0InMerge = 2.7); 00065 declareProperty("maxDphi0InMerge", m_maxDphi0InMerge = 0.15); 00066 declareProperty("maxDPdradInMerge", m_maxPdradInMerge= 0.22); 00067 declareProperty("maxRcsInMerge", m_maxRcsInMerge = 18.); 00068 //cuts for mergeCurl() 00069 declareProperty("mergePt", m_mergePt = 0.13); 00070 declareProperty("mergeLoadAx", m_mergeLoadAx = 3.); 00071 declareProperty("mergeLoadSt", m_mergeLoadSt = 4.); 00072 declareProperty("mergeOverlapRatio", m_mergeOverlapRatio = 0.7); 00073 }
|
|
00078 {
00079 delete m_bfield;
00080 }
|
|
|
|
|
|
|
|
00082 { 00083 //Detector geometry 00084 m_gm = MdcDetector::instance(); 00085 if(NULL == m_gm) return StatusCode::FAILURE; 00086 return StatusCode::SUCCESS; 00087 }
|
|
|
|
00407 { 00408 //------------------------------------------------------------------- 00409 int innerMostTkId = 999; 00410 RecMdcTrack* innerMostTk = NULL; 00411 unsigned innerMostLayerOfTk = 999; 00412 std::vector<RecMdcTrack*>::iterator itTk = mergeTkList.begin(); 00413 for (int iTk=0; itTk != mergeTkList.end(); itTk++,iTk++){ 00414 RecMdcTrack* tk = (*itTk); 00415 unsigned innerMostLayer = 999; 00416 for (unsigned iHit = 0; iHit < tk->getVecHits().size(); iHit++) { 00417 unsigned layer = MdcID::layer(tk->getVecHits()[iHit]->getMdcId()); 00418 if (layer < innerMostLayer) innerMostLayer=layer; 00419 } 00420 00421 if(m_debug>0)std::cout<<__FILE__<<" to be merged track id="<<tk->trackId()<< std::endl; 00422 // test inner most layer id; if same, test dz 00423 if(innerMostLayer < innerMostLayerOfTk){ 00424 innerMostTkId = iTk; 00425 innerMostTk = tk; 00426 }else if (innerMostLayer == innerMostLayerOfTk) { 00427 // test by dz 00428 if (tk->helix(3) < innerMostTk->helix(3)){ 00429 innerMostTkId = iTk; 00430 innerMostTk = tk; 00431 } 00432 } 00433 }//end of for mergeTkList 00434 innerMostTk->setStat(-1); 00435 00436 return innerMostTkId; 00437 }
|
|
|
|
00271 { 00272 //------------------------------------------------------------------- 00273 //merge hitlist 00274 double minRcs=999.; 00275 int bestTkId=999; 00276 RecMdcTrack* bestTk=NULL; 00277 std::vector<RecMdcTrack*>::iterator itTk = mergeTkList.begin(); 00278 for (int iTk=0; itTk != mergeTkList.end(); itTk++,iTk++){ 00279 RecMdcTrack* tk = (*itTk); 00280 double chi2 = tk->chi2(); 00281 double ndf = tk->ndof(); 00282 if(chi2/ndf < minRcs) { 00283 bestTkId = tk->trackId(); 00284 bestTk = tk; 00285 } 00286 } 00287 if (minRcs < m_maxRcsInMerge) return bestTkId; 00288 bestTk->setStat(-1); 00289 00290 return 999; 00291 //FIXME 00292 /* 00293 //fit with track parameter respectively 00294 MdcxFittedHel fit1(dcxhlist, *iptr); 00295 MdcxFittedHel fit2(dcxhlist, *trkl[j]); 00296 int uf = 0; 00297 //get a best fit 00298 if ( !fit1.Fail() && (fit1.Rcs()<m_maxRcsInMerge) ) uf = 1; 00299 if ( !fit2.Fail() && (fit2.Rcs()<fit1.Rcs()) ) uf = 2; 00300 00301 if (uf) {//two fit all ok 00302 //delete bad track 00303 MdcxHel fitme = (uf == 1) ? fit1 : fit2; 00304 } 00305 */ 00306 }
|
|
|
|
00470 { 00471 SmartDataPtr<RecMdcTrackCol> trackList(eventSvc(),EventModel::Recon::RecMdcTrackCol); 00472 if (!trackList) return; 00473 if (trackList->size() != 4 ) setFilterPassed(true); 00474 std::cout<<"N track after Merged = "<<trackList->size() << std::endl; 00475 if (m_debug <=1) return; 00476 RecMdcTrackCol::iterator it = trackList->begin(); 00477 for (;it!= trackList->end();it++){ 00478 RecMdcTrack *tk = *it; 00479 std::cout<< "//====RecMdcTrack "<<tk->trackId()<<"====:" << std::endl; 00480 cout <<" d0 "<<tk->helix(0) 00481 <<" phi0 "<<tk->helix(1) 00482 <<" cpa "<<tk->helix(2) 00483 <<" z0 "<<tk->helix(3) 00484 <<" tanl "<<tk->helix(4) 00485 <<endl; 00486 std::cout<<" q "<<tk->charge() 00487 <<" theta "<<tk->theta() 00488 <<" phi "<<tk->phi() 00489 <<" x0 "<<tk->x() 00490 <<" y0 "<<tk->y() 00491 <<" z0 "<<tk->z() 00492 <<" r0 "<<tk->r() 00493 <<endl; 00494 std::cout <<" p "<<tk->p() 00495 <<" pt "<<tk->pxy() 00496 <<" px "<<tk->px() 00497 <<" py "<<tk->py() 00498 <<" pz "<<tk->pz() 00499 <<endl; 00500 std::cout<<" tkStat "<<tk->stat() 00501 <<" chi2 "<<tk->chi2() 00502 <<" ndof "<<tk->ndof() 00503 <<" nhit "<<tk->getNhits() 00504 <<" nst "<<tk->nster() 00505 <<endl; 00506 //std::cout<< "errmat " << std::endl; 00507 //for (int i=0; i<15; i++){ std::cout<< " "<<tk->err(i); } 00508 //std::cout<< " " << std::endl; 00509 00510 int nhits = tk->getVecHits().size(); 00511 std::cout<<nhits <<" Hits: " << std::endl; 00512 for(int ii=0; ii <nhits ; ii++){ 00513 Identifier id(tk->getVecHits()[ii]->getMdcId()); 00514 int layer = MdcID::layer(id); 00515 int wire = MdcID::wire(id); 00516 cout<<"("<< layer <<","<<wire<<","<<tk->getVecHits()[ii]->getStat() 00517 <<",lr:"<<tk->getVecHits()[ii]->getFlagLR()<<") "; 00518 }//end of hit list 00519 std::cout << " "<< std::endl; 00520 }//end of tk list 00521 std::cout << " "<< std::endl; 00522 }
|
|
|
|
00455 { 00456 SmartDataPtr<RecMdcTrackCol> trackList(eventSvc(),EventModel::Recon::RecMdcTrackCol); 00457 if (!trackList) return false; 00458 SmartDataPtr<RecMdcHitCol> hitList(eventSvc(),EventModel::Recon::RecMdcHitCol); 00459 if (!hitList) return false; 00460 HitRefVec hits = (*tk)->getVecHits(); 00461 HitRefVec::iterator iterHit = hits.begin(); 00462 for (; iterHit != hits.end(); iterHit++) { 00463 //hitList->erase(iterHit); 00464 } 00465 trackList->erase(tk); 00466 return true; 00467 }
|
|
|
|
00113 { 00114 MsgStream log(msgSvc(), name()); 00115 log << MSG::INFO << "in execute()" << endreq; 00116 setFilterPassed(false); 00117 00118 m_bunchT0 = -999.; 00119 SmartDataPtr<RecEsTimeCol> aevtimeCol(eventSvc(),"/Event/Recon/RecEsTimeCol"); 00120 if (!aevtimeCol || aevtimeCol->size()==0) { 00121 log << MSG::WARNING<< " Could not find RecEsTimeCol"<< endreq; 00122 return StatusCode::SUCCESS; 00123 } 00124 00125 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin(); 00126 for(; iter_evt!=aevtimeCol->end(); iter_evt++){ 00127 m_bunchT0 = (*iter_evt)->getTest(); 00128 } 00129 00130 00131 int nMerged = mergeCurl(); 00132 00133 if(m_debug>0) { 00134 std::cout<<name()<<": Merged "<<nMerged << " track "<< std::endl; 00135 dumpRecMdcTrack(); 00136 } 00137 00138 return StatusCode::SUCCESS; 00139 }
|
|
|
|
00142 { 00143 MsgStream log(msgSvc(), name()); 00144 log << MSG::INFO << "in finalize()" << endreq; 00145 00146 return StatusCode::SUCCESS; 00147 }
|
|
|
|
00092 { 00093 MsgStream log(msgSvc(), name()); 00094 log << MSG::INFO << "in initialize()" << endreq; 00095 StatusCode sc; 00096 00097 00098 //Initailize magnetic filed 00099 IMagneticFieldSvc* m_pIMF; 00100 sc = service ("MagneticFieldSvc",m_pIMF); 00101 if(sc != StatusCode::SUCCESS) { 00102 log << MSG::ERROR << "Unable to open Magnetic field service"<<endreq; 00103 return StatusCode::FAILURE; 00104 } 00105 m_bfield = new BField(m_pIMF); 00106 m_Bz = m_bfield->bFieldZ(); 00107 log << MSG::INFO << "field z = "<<m_Bz<< endreq; 00108 00109 return StatusCode::SUCCESS; 00110 }
|
|
|
|
00151 { 00152 //------------------------------------------------------------------- 00153 00154 SmartDataPtr<RecMdcTrackCol> trackList(eventSvc(),EventModel::Recon::RecMdcTrackCol); 00155 if (!trackList) return -1; 00156 00157 int needMerge = 0; 00158 00159 //...Merging. Search a track to be merged... 00160 RecMdcTrackCol::iterator iterRefTk = trackList->begin(); 00161 for (; iterRefTk != trackList->end(); iterRefTk++) { 00162 RecMdcTrack* refTk = *iterRefTk; 00163 if (refTk->stat()<0) continue; 00164 std::vector<RecMdcTrack*> mergeTkList; 00165 mergeTkList.push_back(refTk); 00166 00167 00168 bool curl = false; 00169 int sameParm = 0; 00170 RecMdcTrackCol::iterator iterTestTk = trackList->begin(); 00171 for (; iterTestTk != trackList->end(); iterTestTk++) { 00172 RecMdcTrack* testTk = *iterTestTk; 00173 if (iterRefTk == iterTestTk || (testTk->stat()<0)) continue; 00174 00175 //-- overlapRatio cut 0.7 by jialk, original is 0.8 00176 if (testByOverlapHit(refTk,testTk)){ 00177 if(m_debug>0)std::cout<<__FILE__<<" overlape tk:" <<refTk->trackId()<<" with "<<testTk->trackId()<< std::endl; 00178 mergeTkList.push_back(testTk); 00179 curl = true; 00180 } 00181 sameParm = testByParam(refTk,testTk); 00182 if(sameParm >0) { 00183 if(m_debug>0) std::cout<<__FILE__<<" same param tk:" <<refTk->trackId()<<" with "<<testTk->trackId()<< std::endl; 00184 mergeTkList.push_back(testTk); 00185 } 00186 } 00187 if (mergeTkList.size()>1 && curl) needMerge = doMergeCurl(mergeTkList); 00188 if ((needMerge < 999) && mergeTkList.size()>1 ) needMerge = doMergeLong(mergeTkList); 00189 //if ((needMerge <999) && mergeTkList.size()==2 && (sameParm==2) ) needMerge = doMergeOdd(mergeTkList); //FIXME 00190 } 00191 00192 //return 0 if No track need merged 00193 if( needMerge <=0 ) return 0; 00194 00195 // reset track Id 00196 iterRefTk = trackList->begin(); 00197 int iTk=0; 00198 int nDeleted = 0; 00199 for (; iterRefTk != trackList->end(); ) { 00200 if ( (*iterRefTk)->stat() >= 0 ){ 00201 (*iterRefTk)->setTrackId(iTk); 00202 iterRefTk++; 00203 iTk++; 00204 }else { 00205 int id = (*iterRefTk)->trackId(); 00206 bool erased = eraseTdsTrack(iterRefTk); 00207 if ( erased ){ 00208 nDeleted++; 00209 if(m_debug>0)std::cout<<__FILE__<<" erase track No."<<id<< std::endl; 00210 }else { 00211 if(m_debug>0)std::cout<<__FILE__<<" erase failed !"<< std::endl; 00212 } 00213 } 00214 00215 } 00216 if(m_debug>0) std::cout<<__FILE__<<" After merge save "<<iTk<<" tracks"<< std::endl; 00217 00218 return nDeleted; 00219 }
|
|
|
|
|
|
|
|
00439 { 00440 SmartDataPtr<RecMdcTrackCol> trackList(eventSvc(),EventModel::Recon::RecMdcTrackCol); 00441 if (!trackList) return; 00442 SmartDataPtr<RecMdcHitCol> hitList(eventSvc(),EventModel::Recon::RecMdcHitCol); 00443 if (!hitList) return; 00444 00445 assert (aTrack != NULL); 00446 TrkExchangePar helix = aTrack->fitResult()->helix(0.); 00447 00448 if(m_debug>1)std::cout<<__FILE__<<" STORED"<< std::endl; 00449 MdcTrack mdcTrack(aTrack);//aTrack have been deleted in ~MdcTrack() 00450 //tkStat: 0,Tsf 1,CurlFinder 2,PatRec 3,MdcxReco 4,MergeCurl 00451 int tkStat = 4; 00452 mdcTrack.storeTrack(-1, trackList, hitList, tkStat); 00453 }
|
|
|
|
00349 { 00350 //------------------------------------------------------------------- 00351 int overlaped = 0; 00352 if ((testTk->pxy() >= m_mergePt) || (refTk->pxy() >= m_mergePt)) return overlaped; 00353 00354 HitRefVec testHits = testTk->getVecHits(); 00355 int nHit = testHits.size(); 00356 int nOverlap = 0; 00357 00358 HitRefVec::iterator iterHit = testHits.begin(); 00359 for (; iterHit != testHits.end(); iterHit++) { 00360 RecMdcHit* hit = *iterHit; 00361 00362 //-- load for Axial and Stereo layer are 3,4 by jialk, original is 2,3 00363 double load = m_mergeLoadAx; 00364 bool isStLayer = (m_gm->Layer(MdcID::layer(hit->getMdcId()))->view() != 0); 00365 if(isStLayer) load = m_mergeLoadSt; 00366 00367 //helix parameters 00368 double vx0 = refTk->getVX0(); 00369 double vy0 = refTk->getVY0(); 00370 double vz0 = refTk->getVZ0(); 00371 double dr = refTk->helix(0); 00372 double phi0 = refTk->helix(1); 00373 double r = 10000./ (Constants::c * m_Bz*refTk->helix(2)); 00374 double dz = refTk->helix(3); 00375 double tanl = refTk->helix(4); 00376 00377 //center of circle 00378 double xc = vx0 + (dr + r) * cos(phi0); 00379 double yc = vy0 + (dr + r) * sin(phi0); 00380 00381 //position of hit 00382 double zHit = hit->getZhit(); 00383 double phi = (vz0 + dz - zHit) / (r * tanl); 00384 double xHit = vx0 + dr*cos(phi0) + r*(cos(phi0) - cos(phi0+phi)); 00385 double yHit = vy0 + dr*sin(phi0) + r*(sin(phi0) - sin(phi0+phi)); 00386 00387 //distance from center of circle to hit 00388 double dx = xc - xHit; 00389 double dy = yc - yHit; 00390 double dHit2Center = sqrt(dx * dx + dy * dy); 00391 double rTk = fabs(r); 00392 00393 //is this hit overlaped ? 00394 if ( (dHit2Center>(rTk - load)) && (dHit2Center<(rTk + load))) nOverlap++; 00395 } 00396 00397 if ( nOverlap<=0 ) return overlaped; 00398 00399 double overlapRatio = double(nOverlap) / double(nHit); 00400 00401 if (overlapRatio > m_mergeOverlapRatio) overlaped = 1; 00402 00403 return overlaped; 00404 }
|
|
|
|
00224 { 00225 //------------------------------------------------------------------- 00226 int overlaped = 0; 00227 00228 00229 //Convert to Babar track convension 00230 double omega1 = (Constants::c * m_Bz*refTk->helix(2))/10000.; 00231 double omega2 = (Constants::c * m_Bz*testTk->helix(2))/10000.; 00232 //phi0_babar = phi0_belle + pi/2 [0,2pi) 00233 double phi01 = refTk->helix(1)+Constants::pi/2.; 00234 double phi02 = testTk->helix(1)+Constants::pi/2.; 00235 while(phi01>Constants::twoPi) phi01 -= Constants::twoPi; 00236 while(phi02>Constants::twoPi) phi02 -= Constants::twoPi; 00237 double d01 = -refTk->helix(0); 00238 double d02 = -testTk->helix(0); 00239 double dphi0 = fabs(phi01 - phi02); 00240 double dd0 = fabs(d01 - d02); 00241 double prodo = omega1*omega2; 00242 double r1=100000.; 00243 double r2=100000.; 00244 if (fabs(omega1)>0.00001) r1 = 1.0/fabs(omega1); 00245 if (fabs(omega2)>0.00001) r2 = 1.0/fabs(omega2); //FIXME 00246 double pdrad = fabs((r1-r2)/(r1+r2)) ; 00247 00248 if (2==m_debug){ 00249 std::cout << " fabs(d01 - d02) " << fabs(d01 - d02) << std::endl; 00250 std::cout << " fabs(phi01-phi02) " << fabs(phi01-phi02) << std::endl; 00251 } 00252 // Try to merge pair that looks like duplicates (same charge) 00253 if ( (prodo > 0.) && (dd0 < m_maxDd0InMerge) && (dphi0 < m_maxDphi0InMerge) && 00254 (pdrad < m_maxPdradInMerge)) { 00255 overlaped = 1; 00256 } 00257 00258 // Try to merge pair that looks like albedo (opp charge, large d0) 00259 if ( (prodo < 0.) && (fabs(d01+d02) < 4.0) && (dd0 > 47.0) && 00260 (fabs( dphi0 - Constants::pi) < m_maxDphi0InMerge) 00261 && (pdrad < m_maxPdradInMerge)) { 00262 overlaped = 2; 00263 } 00264 00265 return overlaped; 00266 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|