23#include "GaudiKernel/IDataManagerSvc.h"
45#include "EventModel/EventHeader.h"
46#include "GaudiKernel/MsgStream.h"
47#include "MdcGeom/MdcDetector.h"
48#include "MdcRawEvent/MdcDigi.h"
49#include "PatBField/BField.h"
51#include "CLHEP/Alist/AIterator.h"
52#include "EvTimeEvent/RecEsTime.h"
53#include "Identifier/Identifier.h"
54#include "Identifier/MdcID.h"
55#include "McTruth/McParticle.h"
56#include "McTruth/MdcMcHit.h"
57#include "MdcCalibFunSvc/IMdcCalibFunSvc.h"
58#include "MdcRecEvent/RecMdcHit.h"
59#include "MdcRecEvent/RecMdcTrack.h"
60#include "MdcRecoUtil/Pdt.h"
61#include "MdcTrkRecon/MdcTrack.h"
62#include "MdcxReco/MdcxAddHits.h"
63#include "MdcxReco/MdcxFindSegs.h"
64#include "MdcxReco/MdcxFindTracks.h"
65#include "MdcxReco/MdcxFittedHel.h"
66#include "MdcxReco/MdcxHel.h"
67#include "MdcxReco/MdcxHit.h"
68#include "MdcxReco/MdcxHits.h"
69#include "MdcxReco/MdcxMergeDups.h"
70#include "MdcxReco/MdcxSeg.h"
71#include "MdcxReco/Mdcxprobab.h"
72#include "RawDataProviderSvc/IRawDataProviderSvc.h"
73#include "RawDataProviderSvc/MdcRawDataProvider.h"
74#include "RawEvent/RawDataUtil.h"
75#include "ReconEvent/ReconEvent.h"
76#include "TrkBase/TrkErrCode.h"
77#include "TrkBase/TrkExchangePar.h"
78#include "TrkBase/TrkFit.h"
79#include "TrkBase/TrkFitStatus.h"
80#include "TrkBase/TrkHitList.h"
81#include "TrkBase/TrkRecoTrk.h"
82#include "TrkFitter/TrkHelixMaker.h"
83#include "TrkFitter/TrkLineMaker.h"
85#include "GaudiKernel/INTupleSvc.h"
86#include "GaudiKernel/NTuple.h"
87#include "MdcGeom/Constants.h"
88#include "MdcGeom/MdcTrkReconCut.h"
89#include "MdcxReco/MdcxHistItem.h"
90#include "MdcxReco/MdcxSegPatterns.h"
91#include "TrigEvent/TrigData.h"
92#include "TrkBase/TrkHotList.h"
94#include "BesTimerSvc/BesTimer.h"
95#include "BesTimerSvc/IBesTimerSvc.h"
107 : Algorithm( name, pSvcLocator ), m_mdcCalibFunSvc( 0 ) {
109 declareProperty(
"pdtFile", m_pdtFile =
"pdt.table" );
111 declareProperty(
"debug", m_debug = 0 );
112 declareProperty(
"hist", m_hist = 0 );
113 declareProperty(
"mcHist", m_mcHist =
false );
115 declareProperty(
"cresol", m_cresol = 0.013 );
117 declareProperty(
"getDigiFlag", m_getDigiFlag = 0 );
118 declareProperty(
"maxMdcDigi", m_maxMdcDigi = 0 );
119 declareProperty(
"keepBadTdc", m_keepBadTdc = 0 );
120 declareProperty(
"dropHot", m_dropHot = 0 );
121 declareProperty(
"keepUnmatch", m_keepUnmatch = 0 );
122 declareProperty(
"salvageTrk", m_salvageTrk =
false );
123 declareProperty(
"dropMultiHotInLayer", m_dropMultiHotInLayer =
false );
124 declareProperty(
"dropTrkPt", m_dropTrkPt = -999. );
125 declareProperty(
"d0Cut", m_d0Cut = 999. );
126 declareProperty(
"z0Cut", m_z0Cut = 999. );
128 declareProperty(
"minMdcDigi", m_minMdcDigi = 0 );
129 declareProperty(
"countPropTime", m_countPropTime =
true );
130 declareProperty(
"addHitCut", m_addHitCut = 5. );
131 declareProperty(
"dropHitsSigma", m_dropHitsSigma );
132 declareProperty(
"helixFitCut", m_helixFitCut );
133 declareProperty(
"minTrkProb", m_minTrkProb = 0.01 );
134 declareProperty(
"csmax4", m_csmax4 = 50. );
135 declareProperty(
"csmax3", m_csmax3 = 1. );
136 declareProperty(
"helixFitSigma", m_helixFitSigma = 5. );
137 declareProperty(
"maxRcsInAddSeg", m_maxRcsInAddSeg = 50. );
138 declareProperty(
"nSigAddHitTrk", m_nSigAddHitTrk = 5. );
139 declareProperty(
"maxProca", m_maxProca = 0.6 );
140 declareProperty(
"doSag", m_doSag =
false );
141 declareProperty(
"lineFit", m_lineFit =
false );
149 if ( m_bfield )
delete m_bfield;
155 if ( NULL == m_gm )
return StatusCode::FAILURE;
158 return StatusCode::SUCCESS;
164 MsgStream log(
msgSvc(), name() );
165 log << MSG::INFO <<
"in initialize()" << endmsg;
168 for (
int i = 0; i < 20; i++ ) t_nTkNum[i] = 0;
172 StatusCode tsc = service(
"BesTimerSvc", m_timersvc );
173 if ( tsc.isFailure() )
175 log << MSG::WARNING << name() <<
": Unable to locate BesTimer Service" << endmsg;
176 return StatusCode::FAILURE;
178 m_timer[0] = m_timersvc->addItem(
"Execution" );
179 m_timer[0]->propName(
"Execution" );
180 m_timer[1] = m_timersvc->addItem(
"findSeg" );
181 m_timer[1]->propName(
"findSeg" );
182 m_timer[2] = m_timersvc->addItem(
"findTrack" );
183 m_timer[2]->propName(
"findTrack" );
184 m_timer[3] = m_timersvc->addItem(
"fitting" );
185 m_timer[3]->propName(
"fitting" );
188 if ( m_helixFitCut.size() == 43 )
190 for (
int i = 0; i < 43; i++ )
209 StatusCode sc = service(
"MdcCalibFunSvc", m_mdcCalibFunSvc );
210 if ( sc.isFailure() )
212 log << MSG::FATAL <<
"Could not load MdcCalibFunSvc!" << endmsg;
213 return StatusCode::FAILURE;
219 sc = service(
"RawDataProviderSvc", m_rawDataProviderSvc );
220 if ( sc.isFailure() )
222 log << MSG::FATAL <<
"Could not load RawDataProviderSvc!" << endmsg;
223 return StatusCode::FAILURE;
227 sc = service(
"MagneticFieldSvc", m_pIMF );
228 if ( sc != StatusCode::SUCCESS )
229 { log << MSG::ERROR <<
"Unable to open Magnetic field service" << endmsg; }
230 m_bfield =
new BField( m_pIMF );
231 log << MSG::INFO <<
"field z = " << m_bfield->bFieldNominal() << endmsg;
234 if ( m_hist ) { bookNTuple(); }
235 if ( m_dropHitsSigma.size() == 43 )
237 for (
int ii = 0; ii < 43; ii++ )
241 return StatusCode::SUCCESS;
248 if ( sc.isFailure() )
250 error() <<
"beginRun failed" << endmsg;
251 return StatusCode::FAILURE;
256 MsgStream log(
msgSvc(), name() );
257 log << MSG::INFO <<
"in execute()" << endmsg;
261 setFilterPassed( b_saveEvent );
275 SmartDataPtr<Event::EventHeader> evtHead( eventSvc(),
"/Event/EventHeader" );
278 log << MSG::FATAL <<
"Could not retrieve event header" << endmsg;
279 return StatusCode::FAILURE;
281 m_eventNo = evtHead->eventNumber();
283 std::cout <<
"x evt: " << evtHead->runNumber() <<
" " << m_eventNo << std::endl;
284 long t_evtNo = m_eventNo;
287 IDataManagerSvc* dataManSvc;
288 DataObject* aTrackCol;
292 SmartIF<IDataManagerSvc> dataManSvc( eventSvc() );
293 eventSvc()->findObject(
"/Event/Recon/RecMdcTrackCol", aTrackCol );
296 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcTrackCol" );
297 eventSvc()->unregisterObject(
"/Event/Recon/RecMdcTrackCol" );
299 eventSvc()->findObject(
"/Event/Recon/RecMdcHitCol", aHitCol );
302 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcHitCol" );
303 eventSvc()->unregisterObject(
"/Event/Recon/RecMdcHitCol" );
310 DataObject* aReconEvent;
311 eventSvc()->findObject(
"/Event/Recon", aReconEvent );
312 if ( aReconEvent == NULL )
315 sc = eventSvc()->registerObject(
"/Event/Recon", aReconEvent );
316 if ( sc != StatusCode::SUCCESS )
318 log << MSG::FATAL <<
"Could not register ReconEvent" << endmsg;
319 return StatusCode::FAILURE;
323 eventSvc()->findObject(
"/Event/Recon/RecMdcTrackCol", aTrackCol );
324 if ( aTrackCol ) { trackList =
dynamic_cast<RecMdcTrackCol*
>( aTrackCol ); }
329 if ( !sc.isSuccess() )
331 log << MSG::FATAL <<
" Could not register RecMdcTrack collection" << endmsg;
332 return StatusCode::FAILURE;
336 eventSvc()->findObject(
"/Event/Recon/RecMdcHitCol", aHitCol );
337 if ( aHitCol ) { hitList =
dynamic_cast<RecMdcHitCol*
>( aHitCol ); }
342 if ( !sc.isSuccess() )
344 log << MSG::FATAL <<
" Could not register RecMdcHit collection" << endmsg;
345 return StatusCode::FAILURE;
352 DataObject* pnode = 0;
353 sc = eventSvc()->retrieveObject(
"/Event/Hit", pnode );
354 if ( !sc.isSuccess() )
356 pnode =
new DataObject;
357 sc = eventSvc()->registerObject(
"/Event/Hit", pnode );
358 if ( !sc.isSuccess() )
360 log << MSG::FATAL <<
" Could not register /Event/Hit branch " << endmsg;
361 return StatusCode::FAILURE;
364 SmartDataPtr<MdcHitCol> m_hitCol( eventSvc(),
"/Event/Hit/MdcHitCol" );
368 sc = eventSvc()->registerObject(
"/Event/Hit/MdcHitCol", m_hitCol );
369 if ( !sc.isSuccess() )
371 log << MSG::FATAL <<
" Could not register hit collection" << endmsg;
372 return StatusCode::FAILURE;
380 SmartDataPtr<RecEsTimeCol> aevtimeCol( eventSvc(),
"/Event/Recon/RecEsTimeCol" );
381 if ( !aevtimeCol || aevtimeCol->size() == 0 )
383 log << MSG::WARNING <<
"evt " << m_eventNo <<
" Could not find RecEsTimeCol" << endmsg;
384 return StatusCode::SUCCESS;
387 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
388 for ( ; iter_evt != aevtimeCol->end(); iter_evt++ )
390 m_bunchT0 = ( *iter_evt )->getTest();
391 m_t0Stat = ( *iter_evt )->getStat();
393 std::cout << name() <<
" " << t_evtNo <<
" t0 " << m_bunchT0 <<
" t0Stat " << m_t0Stat
395 if ( ( m_t0Stat == 0 ) || ( m_bunchT0 < 0. ) || ( m_bunchT0 > 9999.0 ) )
397 log << MSG::WARNING <<
"Skip evt:" << m_eventNo <<
" by t0 = " << m_bunchT0 << endmsg;
402 std::cout << name() <<
" evt " << t_evtNo <<
" t0 " << m_bunchT0 <<
" t0Stat "
403 << m_t0Stat << std::endl;
404 int trigtiming = -10;
405 SmartDataPtr<TrigData> trigData( eventSvc(),
"/Event/Trig/TrigData" );
408 log << MSG::INFO <<
"Trigger conditions 0--43:" << endmsg;
409 for (
int i = 0; i < 48; i++ )
411 log << MSG::INFO << trigData->getTrigCondName( i ) <<
" ---- "
412 << trigData->getTrigCondition( i ) << endmsg;
414 for (
int i = 0; i < 16; i++ )
415 log << MSG::INFO <<
"Trigger channel " << i <<
": " << trigData->getTrigChannel( i )
417 m_timing = trigData->getTimingType();
419 log << MSG::INFO <<
"Tigger Timing type: " << trigtiming << endmsg;
426 uint32_t getDigiFlag = 0;
427 getDigiFlag += m_maxMdcDigi;
431 mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
432 t_nDigi = mdcDigiVec.size();
438 if ( t_nDigi < m_minMdcDigi )
440 if ( 0 == t_nDigi ) { log << MSG::WARNING <<
" No hits in MdcDigiVec" << endmsg; }
441 log << MSG::WARNING <<
" Skip this event for MdcDigiVec.size() < " << m_minMdcDigi
443 return StatusCode::SUCCESS;
445 m_mdcxHits.create( mdcDigiVec, m_bunchT0, m_cresol );
448 if ( m_debug > 2 ) m_mdcxHits.print( std::cout, 6796 );
455 if ( m_debug > 1 ) { dumpMdcxSegs( seglist ); }
456 t_nSeg = seglist.length();
468 if ( m_debug > 1 ) dumpTrackList( firsttrkl );
499 sc = FitMdcxTrack( trkl, dchitlist, m_hitCol, trackList, hitList );
500 if ( !sc.isSuccess() ) {
return StatusCode::SUCCESS; }
501 t_nTdsTk = trackList->size();
503 t_nTkTot += trackList->size();
504 if ( t_nTdsTk < 20 ) t_nTkNum[t_nTdsTk]++;
511 if ( m_hist ) fillEvent();
515 eventSvc()->retrieveObject(
"/Event/Recon/RecMdcTrackCol", pNode );
517 eventSvc()->retrieveObject(
"/Event/Recon/RecMdcHitCol", pNode );
519 if ( tmpTrackCol ) nTdsTk = tmpTrackCol->size();
522 std::cout <<
"MdcxTrackFinder: evtNo " << m_eventNo <<
" t0=" << m_bunchT0 <<
" Found "
523 << trkl.length() <<
" keep " << t_nTdsTk <<
" finialy keep " << nTdsTk;
526 trkl.length() - trackList->size();
527 if ( ndelete > 0 ) std::cout <<
" delete " << ndelete;
528 std::cout <<
" track(s)" << endl;
531 if ( m_debug > 1 ) dumpTdsTrack( tmpTrackCol );
532 if ( m_debug > 1 ) dumpTrack( tmpTrackCol );
535 if ( ( trackList->size() != 4 ) ) b_saveEvent =
true;
536 setFilterPassed( b_saveEvent );
538 return StatusCode::SUCCESS;
542 MsgStream log(
msgSvc(), name() );
543 log << MSG::INFO <<
"in finalize()" << endmsg;
545 std::cout <<
" --after " << name() <<
" keep " << t_nTkTot <<
" tracks " << std::endl;
546 for (
int i = 0; i < 20; i++ )
548 if ( t_nTkNum[i] > 0 ) std::cout <<
" nTk=" << i <<
" " << t_nTkNum[i] << std::endl;
552 return StatusCode::SUCCESS;
558 if ( 0 == mdcxHits.length() )
return;
561 while ( mdcxHits[ihits] )
564 const MdcHit* newhit = mdcxHits[ihits]->getMdcHit();
567 const MdcDigi* theDigi = mdcxHits[ihits]->getDigi();
568 int layer =
MdcID::layer( mdcxHits[ihits]->getDigi()->identify() );
569 int wire =
MdcID::wire( mdcxHits[ihits]->getDigi()->identify() );
570 m_digiMap[layer][wire] = mdcxHits[ihits]->getDigi();
576 mdcHitCol->push_back( thehit );
579 MdcRecoHitOnTrack temp( *newhit, ambig, m_bunchT0 );
580 MdcHitOnTrack* newhot = &temp;
601 MsgStream log(
msgSvc(), name() );
611 MdcxAddHits dcaddem( trkl, dchitlist, m_addHitCut );
622 TrkHelixMaker helixfactory;
624 int tkLen = trkl.length();
625 for (
int kk = 0; kk < tkLen; kk++ )
627 const HepAList<MdcxHit>& xhits = trkl[kk]->XHitList();
630 std::cout << __FILE__ <<
" FitMdcxTrack " << kk << std::endl;
631 for (
int i = 0; i < xhits.length(); i++ ) { xhits[i]->print( std::cout ); }
632 std::cout << std::endl;
635 if ( m_debug > 2 ) std::cout <<
" before add hits nhits=" << xhits.length() << std::endl;
636 HepAList<MdcxHit> xass = dcaddem.GetAssociates( kk );
637 if ( m_debug > 2 ) { std::cout <<
" after,add " << xass.length() <<
" hits" << std::endl; }
639 MdcxFittedHel mdcxHelix = *trkl[kk];
640 double thechisq = mdcxHelix.
Chisq();
641 TrkExchangePar tt( -mdcxHelix.
D0(), mdcxHelix.
Phi0(), mdcxHelix.
Omega(), -mdcxHelix.
Z0(),
649 aTrack = linefactory.
makeTrack( tt, thechisq, *m_context, m_bunchT0 * 1.e-9 );
655 aTrack = helixfactory.
makeTrack( tt, thechisq, *m_context, m_bunchT0 * 1.e-9 );
660 TrkHitList* m_trkHitList = aTrack->
hits();
661 if ( 0 == m_trkHitList )
668 MdcxHitsToHots( mdcxHelix, xhits, m_trkHitList, m_hitCol );
671 MdcxHitsToHots( mdcxHelix, xass, m_trkHitList, m_hitCol );
676 if ( m_dropMultiHotInLayer ) dropMultiHotInLayer( m_trkHitList );
679 if ( m_debug > 1 ) { std::cout <<
"== put to official fitter " << std::endl; }
680 TrkErrCode err = m_trkHitList->
fit();
684 std::cout <<
"== after official fitter " << std::endl;
688 const TrkFit* theFit = aTrack->
fitResult();
693 int ndof = theFit->
nActive() - nparm;
694 if ( ndof > 0 ) rcs = theFit->
chisq() / float( ndof );
697 if ( 4 == nparm ) cout <<
" TrkLineMaker";
698 else cout <<
" TrkHelixMaker";
699 cout <<
" trkNo. " << kk <<
" success " << err.
success() <<
" rcs " << rcs <<
" chi2 "
700 << theFit->
chisq() <<
" nactive " << theFit->
nActive() << endl;
704 if ( ( 1 == err.
success() ) && ( rcs < 20.0 ) )
706 if ( m_debug > 1 ) std::cout <<
"== fit success " << std::endl;
707 if ( 4 == nparm ) { linefactory.
setFlipAndDrop( *aTrack,
false,
false ); }
710 if ( m_debug > 1 ) { cout <<
"MdcxTrackFinder: accept a track " << endl; }
713 store( aTrack, trackList, hitList );
715 else if ( ( 2 == err.
success() ) && ( rcs < 150.0 ) )
718 std::cout <<
"== fit success = 2, refit now" << std::endl;
720 while ( nrefit++ < 5 )
722 if ( m_debug > 1 ) std::cout <<
"refit time " << nrefit << std::endl;
723 err = m_trkHitList->
fit();
724 if ( err.
success() == 1 )
break;
728 if ( 4 == nparm ) { linefactory.
setFlipAndDrop( *aTrack,
false,
false ); }
734 store( aTrack, trackList, hitList );
741 std::cout <<
"== fit faild " << std::endl;
751 std::cout <<
"== Fit no good; try a better input helix" << std::endl;
752 mdcxHelix.
Grow( *trkl[kk], xass );
755 int fail = mdcxHelix.
ReFit();
756 if ( m_debug > 1 ) std::cout << __FILE__ <<
" refit fail:" << fail << std::endl;
757 if ( !mdcxHelix.
Fail() )
759 const HepAList<MdcxHit>& bxhits = mdcxHelix.
XHitList();
760 thechisq = mdcxHelix.
Chisq();
761 TrkExchangePar tb( mdcxHelix.
D0(), mdcxHelix.
Phi0(), mdcxHelix.
Omega(), mdcxHelix.
Z0(),
766 bTrack = linefactory.
makeTrack( tb, thechisq, *m_context, m_bunchT0 * 1.e-9 );
771 bTrack = helixfactory.
makeTrack( tb, thechisq, *m_context, m_bunchT0 * 1.e-9 );
774 TrkHitList* bhits = bTrack->
hits();
782 MdcxHitsToHots( mdcxHelix, bxhits, bhits, m_hitCol );
783 TrkErrCode berr = bhits->
fit();
784 const TrkFit* bFit = bTrack->
fitResult();
788 int ndof = bFit->
nActive() - nparm;
789 if ( ndof > 0 ) rcs = bFit->
chisq() / float( ndof );
792 if ( 4 == nparm ) cout <<
" TrkLineMaker";
793 else cout <<
" TrkHelixMaker";
794 cout <<
" success trkNo. " << kk <<
" status " << berr.
success() <<
" rcs " << rcs
795 <<
" chi2 " << bFit->
chisq() <<
" nactive " << bFit->
nActive() << endl;
798 if ( ( 1 == berr.
success() ) && ( rcs < 50.0 ) )
804 cout <<
"MdcxTrackFinder: accept b track and store to TDS" << endl;
807 store( bTrack, trackList, hitList );
813 cout <<
" fit failed " << endl;
830 if ( m_debug > 1 ) dumpTdsTrack( trackList );
831 return StatusCode::SUCCESS;
839 int trackId = trackList->size();
841 if ( m_dropTrkPt > 0. && ( aTrack->
fitResult()->
pt() < m_dropTrkPt ) )
844 std::cout <<
"MdcxTrackFinder delete track by pt " << aTrack->
fitResult()->
pt()
845 <<
"<ptCut " << m_dropTrkPt << std::endl;
849 if ( ( ( fabs( helix.
d0() ) > m_d0Cut ) || ( fabs( helix.
z0() ) > m_z0Cut ) ) )
852 std::cout << name() <<
" delete track by d0 " << helix.
d0() <<
">d0Cut " << m_d0Cut
853 <<
" or z0 " << helix.
z0() <<
" >z0Cut " << m_z0Cut << std::endl;
857 if ( m_hist ) fillTrack( aTrack );
858 MdcTrack mdcTrack( aTrack );
861 int nHitbefore = hitList->size();
863 mdcTrack.storeTrack( trackId, trackList, hitList, tkStat );
864 int nHitAfter = hitList->size();
865 if ( nHitAfter - nHitbefore < 10 ) setFilterPassed(
true );
869 RecMdcTrackCol::iterator i_tk = trackList->begin();
870 for ( ; i_tk != trackList->end(); i_tk++ ) { printTrack( *( i_tk ) ); }
873void MdcxTrackFinder::printTrack(
RecMdcTrack* tk ) {
875 std::cout <<
" MdcTrack Id:" << tk->
trackId() <<
" q:" << tk->
charge() << std::endl;
876 std::cout <<
"dr Fi0 Cpa Dz Tanl Chi2 Ndf nSt FiTerm poca" << std::endl;
877 std::cout <<
"(" << setw( 5 ) << tk->
helix( 0 ) <<
"," << setw( 5 ) << tk->
helix( 1 ) <<
","
878 << setw( 5 ) << tk->
helix( 2 ) <<
"," << setw( 5 ) << tk->
helix( 3 ) <<
","
879 << setw( 5 ) << tk->
helix( 4 ) <<
")" << setw( 5 ) << tk->
chi2() << setw( 4 )
882 std::cout <<
" ErrMat " << tk->
err() << std::endl;
884 std::cout <<
"hitId tkId (l,w) fltLen lr dt ddl tdc "
885 <<
"doca entr z tprop stat " << std::endl;
888 HitRefVec::iterator it = hl.begin();
889 for ( ; it != hl.end(); ++it )
894 const MdcLayer* _layerPtr = m_gm->Layer( layer );
895 double _zlen = _layerPtr->
zLength();
898 if ( 0 == layer % 2 )
900 tprop = ( 0.5 * _zlen + z ) / _vprop;
904 tprop = ( 0.5 * _zlen - z ) / _vprop;
919 std::cout << setw( 3 ) << h->
getId() << setw( 2 ) << h->
getTrkId() <<
"("
924 setw( 8 ) << h->
getTdc() <<
926 << setw( 10 ) << tprop << setw( 2 ) << h->
getStat() << std::endl;
930void MdcxTrackFinder::bookNTuple() {
931 MsgStream log(
msgSvc(), name() );
933 if ( !m_hist )
return;
966 g_trklel =
histoSvc()->book(
"trklel",
"trklel", 200, 0., 0.025, 43, 0, 43 );
967 g_trkldl =
histoSvc()->book(
"trkldl",
"trkldl", 200, -1.2, 1.2, 43, 0, 43 );
971 histoSvc()->book(
"dropHitsSigma",
"dropHitsSigma", 43, 0, 43, 100, 0, 11 );
976 NTuplePtr nt1(
ntupleSvc(),
"MdcxReco/rec" );
981 "MdcxReco reconsturction results" );
1030 log << MSG::ERROR <<
" Cannot book N-tuple: MdcxReco/rec" << endmsg;
1034 NTuplePtr nt4(
ntupleSvc(),
"MdcxReco/evt" );
1039 ntupleSvc()->book(
"MdcxReco/evt", CLID_ColumnWiseTuple,
"MdcxReco event data" );
1062 log << MSG::ERROR <<
"Cannot book N-tuple: MdcxReco/evt" << endmsg;
1068 NTuplePtr ntSeg(
ntupleSvc(),
"MdcxReco/seg" );
1073 "MdcxTrackFinder segment data" );
1095 log << MSG::ERROR <<
"Cannot book N-tuple: MdcxReco/evt" << endmsg;
1099 NTuplePtr nt5(
ntupleSvc(),
"MdcxReco/trkl" );
1104 ntupleSvc()->book(
"MdcxReco/trkl", CLID_RowWiseTuple,
"MdcxReco track info" );
1112 log << MSG::ERROR <<
"Cannot book N-tuple: MdcxReco/trkl" << endmsg;
1117 NTuplePtr ntCsmcSew(
ntupleSvc(),
"MdcxReco/csmc" );
1122 "MdcxReco reconsturction results" );
1134 log << MSG::ERROR <<
"Cannot book N-tuple: MdcxReco/csmc" << endmsg;
1138 NTuplePtr ntSegAdd1(
ntupleSvc(),
"MdcxReco/addSeg1" );
1143 ntupleSvc()->book(
"MdcxReco/addSeg1", CLID_ColumnWiseTuple,
"MdcxReco event data" );
1162 log << MSG::ERROR <<
"Cannot book N-tuple: MdcxReco/addSeg1" << endmsg;
1167 NTuplePtr ntSegComb(
ntupleSvc(),
"MdcxReco/segComb" );
1172 ntupleSvc()->book(
"MdcxReco/segComb", CLID_ColumnWiseTuple,
"MdcxReco event data" );
1190 log << MSG::ERROR <<
"Cannot book N-tuple: MdcxReco/segComb" << endmsg;
1195 NTuplePtr ntDropHits(
ntupleSvc(),
"MdcxReco/dropHits" );
1200 ntupleSvc()->book(
"MdcxReco/dropHits", CLID_ColumnWiseTuple,
"MdcxReco event data" );
1214 log << MSG::ERROR <<
"Cannot book N-tuple: MdcxReco/dropHits" << endmsg;
1218 NTuplePtr ntAddSeg2(
ntupleSvc(),
"MdcxReco/addSeg2" );
1223 ntupleSvc()->book(
"MdcxReco/addSeg2", CLID_ColumnWiseTuple,
"MdcxReco event data" );
1233 log << MSG::ERROR <<
"Cannot book N-tuple: MdcxReco/addSeg2" << endmsg;
1240void MdcxTrackFinder::fillEvent() {
1258 MdcDigiCol::iterator
iter = mdcDigiVec.begin();
1259 for ( ; iDigi < t_nDigi;
iter++ )
1272void MdcxTrackFinder::fillTrack(
TrkRecoTrk* atrack ) {
1280 if ( atrack == NULL )
return;
1282 const TrkFit* fitResult = atrack->
fitResult();
1283 if ( fitResult == 0 )
return;
1287 int seg[11] = { 0 };
1291 const TrkHitList* hitlist = atrack->
hits();
1294 int layerCount[43] = { 0 };
1296 for ( ; hot != hitlist->
end(); hot++ )
1299 const MdcRecoHitOnTrack* recoHot;
1300 recoHot =
dynamic_cast<const MdcRecoHitOnTrack*
>( &( *hot ) );
1306 layerCount[layer]++;
1310 double fltLen = recoHot->
fltLen();
1331 double res = 999., rese = 999.;
1332 if ( recoHot->
resid( res, rese,
false ) ) {}
1337 if ( layer > 0 ) { segme = ( layer - 1 ) / 4; }
1339 if ( recoHot->
layer()->
view() ) { ++nSt; }
1344 for (
int i = 0; i < 11; i++ )
1346 if ( seg[i] > 0 ) nSlay++;
1353 double fltLenPoca = 0.0;
1354 TrkExchangePar helix = fitResult->
helix( fltLenPoca );
1359 if ( fabs(
m_xz0 ) > 20 || fabs(
m_xd0 ) > 2 )
1363 std::cout <<
"evt:" << m_eventNo <<
" BigVtx:"
1364 <<
" d0 " << helix.
d0() <<
" z0 " << helix.
z0() << std::endl;
1369 CLHEP::Hep3Vector
p1 = fitResult->
momentum( fltLenPoca );
1370 double px, py, pz, pxy;
1371 pxy = fitResult->
pt();
1399 cout << name() <<
" found " << segList.length() <<
" segs :" << endl;
1400 for (
int i = 0; i < segList.length(); i++ )
1402 std::cout << i <<
" ";
1403 segList[i]->printSeg();
1410 int cellMax[43] = { 40, 44, 48, 56, 64, 72, 80, 80, 76, 76, 88,
1411 88, 100, 100, 112, 112, 128, 128, 140, 140, 160, 160,
1412 160, 160, 176, 176, 176, 176, 208, 208, 208, 208, 240,
1413 240, 240, 240, 256, 256, 256, 256, 288, 288, 288 };
1415 int hitInSegList[43][288];
1416 for (
int ii = 0; ii < 43; ii++ )
1418 for (
int jj = 0; jj < cellMax[ii]; jj++ ) { hitInSegList[ii][jj] = 0; }
1420 for (
int i = 0; i < segList.length(); i++ )
1422 MdcxSeg* aSeg = segList[i];
1423 for (
int ihit = 0; ihit < aSeg->
Nhits(); ihit++ )
1425 const MdcxHit* hit = aSeg->
XHitList()[ihit];
1426 int layer = hit->
Layer();
1427 int wire = hit->
WireNo();
1428 hitInSegList[layer][wire]++;
1431 for (
int i = 0; i < segList.length(); i++ )
1433 MdcxSeg* aSeg = segList[i];
1434 if ( aSeg == NULL )
continue;
1446 for (
int ii = 0; ii < 14; ii++ )
1454 for (
int ii = 0; ii < 20; ii++ )
1465 for (
int ihit = 0; ihit < aSeg->
Nhits(); ihit++ )
1467 const MdcxHit* hit = aSeg->
XHitList()[ihit];
1468 int layer = hit->
Layer();
1469 int wire = hit->
WireNo();
1472 m_xtsInSeg[ihit] = hitInSegList[layer][wire];
1481 std::cout <<
"dump track list " << std::endl;
1482 for (
int i = 0; i < trackList.length(); i++ )
1484 std::cout <<
"track " << i << std::endl;
1485 for (
int ihit = 0; ihit < trackList[i]->Nhits(); ihit++ )
1487 const MdcxHit* hit = trackList[i]->XHitList()[ihit];
1488 int layer = hit->
Layer();
1489 int wire = hit->
WireNo();
1490 std::cout <<
" (" << layer <<
"," << wire <<
") ";
1492 std::cout << std::endl;
1500 for (
int i = 0; i < firsttrkl.length(); i++ ) { nDigi += firsttrkl[i]->Nhits(); }
1501 for (
int i = 0; i < firsttrkl.length(); i++ )
1503 for (
int ihit = 0; ihit < firsttrkl[i]->Nhits(); ihit++ )
1505 const MdcxHit* hit = firsttrkl[i]->XHitList()[ihit];
1506 int layer = hit->
Layer();
1507 int wire = hit->
WireNo();
1516void MdcxTrackFinder::fillMcTruth() {
1517 MsgStream log(
msgSvc(), name() );
1520 for (
int ii = 0; ii < 43; ii++ )
1522 for (
int jj = 0; jj < 288; jj++ ) { haveDigi[ii][jj] = -2; }
1524 int nDigi = mdcDigiVec.size();
1525 for (
int iDigi = 0; iDigi < nDigi; iDigi++ )
1527 int l =
MdcID::layer( ( mdcDigiVec[iDigi] )->identify() );
1528 int w =
MdcID::wire( ( mdcDigiVec[iDigi] )->identify() );
1537 SmartDataPtr<Event::McParticleCol> mcParticleCol( eventSvc(),
"/Event/MC/McParticleCol" );
1538 if ( !mcParticleCol ) { log << MSG::INFO <<
"Could not retrieve McParticelCol" << endmsg; }
1541 Event::McParticleCol::iterator iter_mc = mcParticleCol->begin();
1542 for ( ; iter_mc != mcParticleCol->end(); iter_mc++ )
1544 if ( ( *iter_mc )->primaryParticle() )
1546 m_t0Truth = ( *iter_mc )->initialPosition().t();
1576void MdcxTrackFinder::dropMultiHotInLayer(
TrkHitList* trkHitList ) {
1578 double tdr_wire[43];
1579 for (
int i = 0; i < 43; i++ ) { tdr[i] = 9999.; }
1583 while ( hotIter != trkHitList->
hotList().
end() )
1585 MdcHitOnTrack* hot =
const_cast<MdcHitOnTrack*
>( &( *hotIter->
mdcHitOnTrack() ) );
1593 if (
dt < tdr[layer] )
1596 tdr_wire[layer] = wire;
1607 while ( hotIter != trkHitList->
hotList().
end() )
1613 if ( ( tdr[layer] < 9998. ) && ( tdr_wire[layer] != wire ) )
1615 MdcHitOnTrack* hot =
const_cast<MdcHitOnTrack*
>( &( *hotIter->
mdcHitOnTrack() ) );
1624 std::cout <<
"tksize = " << trackList->size() << std::endl;
1625 RecMdcTrackCol::iterator it = trackList->begin();
1626 for ( ; it != trackList->end(); it++ )
1628 RecMdcTrack* tk = *it;
1629 std::cout <<
"//====RecMdcTrack " << tk->
trackId() <<
"====:" << std::endl;
1630 cout <<
" d0 " << tk->
helix( 0 ) <<
" phi0 " << tk->
helix( 1 ) <<
" cpa " << tk->
helix( 2 )
1631 <<
" z0 " << tk->
helix( 3 ) <<
" tanl " << tk->
helix( 4 ) << endl;
1632 std::cout <<
" q " << tk->
charge() <<
" theta " << tk->
theta() <<
" phi " << tk->
phi()
1633 <<
" x0 " << tk->
x() <<
" y0 " << tk->
y() <<
" z0 " << tk->
z() <<
" r0 "
1635 std::cout <<
" p " << tk->
p() <<
" pt " << tk->
pxy() <<
" px " << tk->
px() <<
" py "
1636 << tk->
py() <<
" pz " << tk->
pz() << endl;
1637 std::cout <<
" tkStat " << tk->
stat() <<
" chi2 " << tk->
chi2() <<
" ndof " << tk->
ndof()
1638 <<
" nhit " << tk->
getNhits() <<
" nst " << tk->
nster() << endl;
1641 std::cout << nhits <<
" Hits: " << std::endl;
1642 for (
int ii = 0; ii < nhits; ii++ )
1644 Identifier id( tk->
getVecHits()[ii]->getMdcId() );
1647 cout <<
"(" << layer <<
"," << wire <<
"," << tk->
getVecHits()[ii]->getStat()
1648 <<
",lr:" << tk->
getVecHits()[ii]->getFlagLR() <<
") ";
1650 std::cout <<
" " << std::endl;
1652 std::cout <<
" " << std::endl;
1656void MdcxTrackFinder::dumpTdsHits(
RecMdcHitCol* hitList ) {
1657 std::cout << __FILE__ <<
" " << __LINE__ <<
" All hits in TDS, nhit=" << hitList->size()
1659 RecMdcHitCol::iterator it = hitList->begin();
1660 for ( ; it != hitList->end(); it++ )
1662 RecMdcHit* h = ( *it );
1666 cout <<
"(" << layer <<
"," << wire <<
") lr:" << h->
getFlagLR()
1667 <<
" stat:" << h->
getStat() <<
" tk:" << h->
getTrkId() <<
" doca:" << setw( 10 )
DECLARE_COMPONENT(BesBdkRc)
HepGeom::Point3D< double > HepPoint3D
ObjectVector< MdcHit > MdcHitCol
double MdcTrkReconCut_helix_fit[43]
ObjectVector< RecMdcHit > RecMdcHitCol
ObjectVector< RecMdcTrack > RecMdcTrackCol
SmartRefVector< RecMdcHit > HitRefVec
NTuple::Array< double > m_xfltLen
AIDA::IHistogram1D * g_dPhiAV
NTuple::Item< double > m_addSegAddPhiLay
NTuple::Array< double > m_xwire
NTuple::Item< double > m_xtsXline_bbrrf
NTuple::Item< double > m_xt0Stat
NTuple::Array< double > m_xdriftT
AIDA::IHistogram1D * g_trkldrop1
NTuple::Array< double > m_xdriftD
NTuple::Item< double > m_xpocax
NTuple::Item< double > m_xtsChisq
NTuple::Item< long > m_xnHit
AIDA::IHistogram1D * g_dPhiAU_1
NTuple::Item< double > m_xtsYline_slope
NTuple::Item< long > m_xt5Layer
NTuple::Item< double > m_xtsYline_bbrrf
NTuple::Item< double > m_xq
AIDA::IHistogram1D * g_csmax3
AIDA::IHistogram1D * g_trklappend2
NTuple::Item< double > m_addSegSeedPhi0
NTuple::Array< double > m_xambig
NTuple::Item< double > m_xtiming
NTuple::Item< double > m_segCombDLenUV
AIDA::IHistogram1D * g_trklappend1
AIDA::IHistogram1D * g_dPhiAV_0
NTuple::Item< long > m_addSegSlayer
AIDA::IHistogram2D * g_poison
NTuple::Item< double > m_xchi2
NTuple::Array< double > m_xresid
NTuple::Item< long > m_addSegSame
NTuple::Item< double > m_xpocaz
AIDA::IHistogram1D * g_trklproca
NTuple::Item< long > m_segDropHitsWire
NTuple::Item< long > m_xtsNDigi
NTuple::Item< double > m_addSegSeedSl
NTuple::Tuple * m_xtupleTrkl
NTuple::Item< double > m_xnAct
NTuple::Array< double > m_xtof
NTuple::Tuple * m_xtupleAddSeg1
NTuple::Item< double > m_addSegAddLen
AIDA::IHistogram1D * g_addSegPhi
AIDA::IHistogram1D * g_dPhiAV_1
NTuple::Item< long > m_xtsSl
NTuple::Item< double > m_xt4nTdsTk
NTuple::Item< double > m_addSegLen
AIDA::IHistogram1D * g_trkle
NTuple::Item< long > m_xtsPat
AIDA::IHistogram1D * g_dPhiAU_5
NTuple::Item< double > m_xp
AIDA::IHistogram1D * g_trkld
NTuple::Array< long > m_xtsWire
NTuple::Item< double > m_xt0
AIDA::IHistogram1D * g_trkltemp
NTuple::Item< double > m_segDropHitsDoca
NTuple::Item< long > m_xt4nSeg
NTuple::Item< double > m_xtsPhi0_sl_approx
AIDA::IHistogram1D * g_csmax4
NTuple::Item< double > m_csmcTanl
NTuple::Item< double > m_segDropHitsSigma
AIDA::IHistogram2D * g_trklel
NTuple::Item< double > m_xtsD0
NTuple::Item< double > m_addSegSeedPhiLay
NTuple::Array< double > m_xact
NTuple::Item< double > m_csmcOmega
NTuple::Item< double > m_xpz
NTuple::Item< double > m_addSegSeedLen
NTuple::Item< double > m_xnSt
NTuple::Array< long > m_xtsInSeg
NTuple::Item< double > m_segCombSlV
NTuple::Item< long > m_segDropHitsLayer
NTuple::Item< double > m_addSegSeedD0
AIDA::IHistogram1D * g_dPhiAU_7
NTuple::Tuple * m_xtuple1
AIDA::IHistogram2D * g_dropHitsSigma
NTuple::Item< double > m_xtsPhi0
AIDA::IHistogram1D * g_trklappend3
NTuple::Item< double > m_xt4t0
AIDA::IHistogram1D * g_trklhelix
NTuple::Item< double > m_xt4timeFit
NTuple::Item< double > m_xt4t0Truth
NTuple::Item< double > m_segDropHitsMcTkId
NTuple::Array< double > m_xdoca
AIDA::IHistogram1D * g_trkllmk
NTuple::Item< double > m_xevtNo
AIDA::IHistogram1D * g_addHitCut
AIDA::IHistogram2D * g_trkldl
NTuple::Item< long > m_xt4t0Stat
NTuple::Item< double > m_xt4nRecTk
NTuple::Item< double > m_segCombPhiA
NTuple::Item< long > m_xt4EvtNo
AIDA::IHistogram1D * g_dPhiAU_0
NTuple::Item< double > m_segCombSlA
NTuple::Item< double > m_xt4timeTrack
NTuple::Array< double > m_xsigma
NTuple::Item< double > m_xt4time
NTuple::Item< double > m_segCombDLenAU
AIDA::IHistogram2D * g_addHitCut2d
NTuple::Item< long > m_xt5Wire
AIDA::IHistogram1D * g_trklgood
AIDA::IHistogram1D * g_trkllayer
NTuple::Item< double > m_xphi0
NTuple::Item< double > m_segCombSlU
NTuple::Item< long > m_segCombEvtNo
NTuple::Item< double > m_segCombPhiU
NTuple::Item< double > m_csmcPhi0
NTuple::Array< double > m_xadc
NTuple::Array< double > m_xt4Time
AIDA::IHistogram1D * g_dPhiAU
NTuple::Item< double > m_segCombSameUV
NTuple::Item< double > m_addSegAddPhi
NTuple::Item< double > m_xt4timeSeg
NTuple::Item< double > m_addSegSeedPhi
NTuple::Array< double > m_xx
NTuple::Item< double > m_xz0
NTuple::Item< double > m_csmcPt
NTuple::Item< long > m_xnSlay
AIDA::IHistogram1D * g_trkldrop2
NTuple::Array< double > m_xtdc
NTuple::Item< double > m_segCombPhiV
NTuple::Item< double > m_xtanl
NTuple::Item< double > m_addSegAddPhi0
NTuple::Item< double > m_xt0Truth
AIDA::IHistogram1D * g_dPhiAV_8
NTuple::Tuple * m_xtupleSegComb
NTuple::Item< double > m_addSegAddSl
NTuple::Item< double > m_segCombOmega
NTuple::Array< long > m_xt4Layer
NTuple::Item< double > m_xtsD0_sl_approx
NTuple::Item< double > m_xtkId
NTuple::Item< double > m_addSegAddD0
NTuple::Item< long > m_segDropHitsEvtNo
NTuple::Item< double > m_segCombSameAU
NTuple::Tuple * m_xtupleEvt
NTuple::Item< double > m_xpt
NTuple::Item< double > m_xpocay
NTuple::Item< double > m_segDropHitsPull
NTuple::Item< double > m_xcpa
NTuple::Item< double > m_csmcD0
AIDA::IHistogram1D * g_trklfirstProb
NTuple::Tuple * m_xtupleAddSeg2
AIDA::IHistogram1D * g_omegag
NTuple::Array< long > m_xtsLayer
AIDA::IHistogram1D * g_trkldoca
NTuple::Array< double > m_xentra
NTuple::Item< double > m_xnDof
NTuple::Array< double > m_xlayer
NTuple::Array< double > m_xy
NTuple::Array< double > m_xz
NTuple::Item< double > m_xtsOmega
NTuple::Item< double > m_xd0
NTuple::Item< long > m_addSegEvtNo
NTuple::Item< double > m_segDropHitsDrift
NTuple::Item< long > m_xt4nDigi
AIDA::IHistogram1D * g_dPhiAV_6
NTuple::Tuple * m_xtupleDropHits
NTuple::Item< double > m_csmcZ0
NTuple::Tuple * m_xtupleSeg
NTuple::Item< double > m_addSegPoca
NTuple::Tuple * m_xtupleCsmcSew
AIDA::IHistogram1D * g_trklcircle
NTuple::Item< double > m_xtsXline_slope
NTuple::Array< double > m_xt4Charge
TrkSimpleMaker< TrkLineRep > TrkLineMaker
IHistogramSvc * histoSvc()
static const double vpropInner
const double theta() const
const HepSymMatrix err() const
const double chi2() const
const int trackId() const
const HepVector helix() const
......
const HepPoint3D poca() const
static MdcDetector * instance()
virtual const MdcHit * mdcHit() const
double entranceAngle() const
const MdcLayer * layer() const
unsigned layernumber() const
unsigned wirenumber() const
double driftTime(double tof, double z) const
void setCountPropTime(const bool count)
void setCalibSvc(const IMdcCalibFunSvc *calibSvc)
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
static int wire(const Identifier &id)
double zLength(void) const
const MdcHit * mdcHit() const
const HepAList< MdcxSeg > & GetMdcxSeglist()
const HepAList< MdcxFittedHel > & GetMdcxTrklist()
const HepAList< MdcxHit > & XHitList() const
int SuperLayer(int hitno=0) const
int Fail(float Probmin=0.0) const
void SetChiDofBail(float r)
MdcxFittedHel & Grow(const MdcxFittedHel &, const HepAList< MdcxHit > &)
static void setMdcCalibFunSvc(const IMdcCalibFunSvc *calibSvc)
static void setMdcDetector(const MdcDetector *gm)
static void setCountPropTime(bool countPropTime)
const HepAList< MdcxFittedHel > & GetMergedTrklist()
static double maxRcsInAddSeg
static float dropHitsSigma[43]
static double helixFitSigma
static double nSigAddHitTrk
static const unsigned patt4[14]
static const unsigned patt3[20]
virtual ~MdcxTrackFinder()
MdcxTrackFinder(const std::string &name, ISvcLocator *pSvcLocator)
static void readMCppTable(std::string filenm)
static double MdcTime(int timeChannel)
static double MdcCharge(int chargeChannel)
const int getFlagLR(void) const
const double getZhit(void) const
const int getTrkId(void) const
const int getId(void) const
const int getStat(void) const
const Identifier getMdcId(void) const
const double getTdc(void) const
const double getDriftT(void) const
const double getEntra(void) const
const double getDriftDistLeft(void) const
const double getFltLen(void) const
const double getDoca(void) const
const HitRefVec getVecHits(void) const
const int getNhits() const
const double getFiTerm() const
virtual void getInfo(double fltLen, HepPoint3D &pos, Hep3Vector &direction) const =0
virtual Hep3Vector momentum(double fltL=0.) const =0
virtual double pt(double fltL=0.) const =0
virtual double chisq() const =0
virtual int charge() const =0
virtual int nDof() const =0
virtual const TrkDifTraj & traj() const =0
virtual HepPoint3D position(double fltL) const =0
void print(std::ostream &ostr) const
virtual void addHistory(const TrkErrCode &status, const char *modulename)
virtual int nActive() const =0
virtual TrkExchangePar helix(double fltL) const =0
static double nSigmaCut[43]
hot_iterator begin() const
TrkHitOnTrk * appendHot(const TrkHitOnTrk *theHot)
const TrkHotList & hotList() const
bool removeHit(const TrkFundHit *theHit)
TrkHotList::hot_iterator hot_iterator
void setActivity(bool turnOn)
void setUsability(int usability)
double resid(bool exclude=false) const
virtual const MdcHitOnTrack * mdcHitOnTrack() const
const TrkRep * getParentRep() const
TrkHitOnTrkIter< TrkHotList::const_iterator_traits > hot_iterator
hot_iterator begin() const
const TrkFit * fitResult() const
virtual void printAll(std::ostream &) const
const TrkFitStatus * status() const
virtual double arrivalTime(double fltL) const
bool setFlipAndDrop(TrkRecoTrk &, bool allowFlips, bool allowDrops) const
TrkRecoTrk * makeTrack(const TrkExchangePar &helix, const double chi2, const TrkContext &, double trackT0) const
_EXTERN_ std::string RecMdcTrackCol
_EXTERN_ std::string RecMdcHitCol