2#include "EvTimeEvent/RecEsTime.h"
3#include "EventModel/EventHeader.h"
4#include "GaudiKernel/Bootstrap.h"
5#include "GaudiKernel/DataSvc.h"
6#include "GaudiKernel/IDataManagerSvc.h"
7#include "GaudiKernel/IDataProviderSvc.h"
8#include "GaudiKernel/INTupleSvc.h"
9#include "GaudiKernel/ISvcLocator.h"
10#include "GaudiKernel/MsgStream.h"
11#include "GaudiKernel/PropertyMgr.h"
12#include "GaudiKernel/SmartDataPtr.h"
13#include "Identifier/Identifier.h"
14#include "Identifier/MdcID.h"
15#include "MdcData/MdcHit.h"
16#include "MdcData/MdcHitMap.h"
17#include "MdcData/MdcHitOnTrack.h"
18#include "MdcData/MdcHitUse.h"
19#include "MdcData/MdcRecoHitOnTrack.h"
20#include "MdcGeom/Constants.h"
21#include "MdcGeom/MdcDetector.h"
22#include "MdcRawEvent/MdcDigi.h"
23#include "MdcRecEvent/RecMdcHit.h"
24#include "MdcRecEvent/RecMdcTrack.h"
25#include "MdcRecoUtil/Pdt.h"
26#include "MdcTrkRecon/GmsList.h"
27#include "MdcTrkRecon/MdcHistItem.h"
28#include "MdcTrkRecon/MdcSeg.h"
29#include "MdcTrkRecon/MdcSegData.h"
30#include "MdcTrkRecon/MdcSegFinder.h"
31#include "MdcTrkRecon/MdcSegList.h"
32#include "MdcTrkRecon/MdcTrack.h"
33#include "MdcTrkRecon/MdcTrackList.h"
34#include "MdcTrkRecon/MdcTrackListCsmc.h"
35#include "PatBField/BField.h"
36#include "RawDataProviderSvc/IRawDataProviderSvc.h"
37#include "RawDataProviderSvc/MdcRawDataProvider.h"
38#include "RawEvent/RawDataUtil.h"
39#include "ReconEvent/ReconEvent.h"
40#include "TrkBase/TrkDifTraj.h"
41#include "TrkBase/TrkExchangePar.h"
42#include "TrkBase/TrkRep.h"
43#include "TrkFitter/TrkContextEv.h"
44#include "TrkFitter/TrkHelixFitter.h"
46#include "McTruth/McParticle.h"
47#include "McTruth/MdcMcHit.h"
48#include "MdcPrintSvc/IMdcPrintSvc.h"
49#include "MdcTrkRecon/MdcSegUsage.h"
51#ifdef MDCPATREC_TIMETEST
52# include "BesTimerSvc/BesTimer.h"
53# include "BesTimerSvc/BesTimerSvc.h"
54# include "BesTimerSvc/IBesTimerSvc.h"
70 : Algorithm( name, pSvcLocator )
76 declareProperty(
"FittingMethod", m_fittingMethod = 2 );
77 declareProperty(
"ConfigFile", m_configFile =
"MDCConfig.xml" );
78 declareProperty(
"OnlyUnusedHits", m_onlyUnusedHits = 0 );
79 declareProperty(
"PoisonHits", m_poisonHits = 0 );
80 declareProperty(
"doLineFit", m_doLineFit =
false );
81 declareProperty(
"paramFile", m_paramFile =
"params" );
82 declareProperty(
"pdtFile", m_pdtFile =
"pdt.table" );
83 declareProperty(
"allHit", m_allHit = 1 );
84 declareProperty(
"hist", m_hist =
false );
85 declareProperty(
"recForEsTime", m_recForEsTime =
false );
86 declareProperty(
"tryBunch", m_tryBunch =
false );
87 declareProperty(
"d0Cut", m_d0Cut = -999. );
88 declareProperty(
"z0Cut", m_z0Cut = -999. );
89 declareProperty(
"dropTrkPt", m_dropTrkPt = -999. );
90 declareProperty(
"debug", m_debug = 0 );
91 declareProperty(
"mcHist", m_mcHist =
false );
92 declareProperty(
"fieldCosmic", m_fieldCosmic =
false );
93 declareProperty(
"doSag", m_doSagFlag =
false );
94 declareProperty(
"arbitrateHits", m_arbitrateHits =
true );
96 declareProperty(
"helixHitsSigma", m_helixHitsSigma );
98 declareProperty(
"getDigiFlag", m_getDigiFlag = 0 );
99 declareProperty(
"maxMdcDigi", m_maxMdcDigi = 0 );
100 declareProperty(
"keepBadTdc", m_keepBadTdc = 0 );
101 declareProperty(
"dropHot", m_dropHot = 0 );
102 declareProperty(
"keepUnmatch", m_keepUnmatch = 0 );
103 declareProperty(
"minMdcDigi", m_minMdcDigi = 0 );
104 declareProperty(
"selEvtNo", m_selEvtNo );
105 declareProperty(
"combineTracking", m_combineTracking =
false );
106 declareProperty(
"noInner", m_noInner =
false );
108#ifdef MDCPATREC_RESLAYER
109 declareProperty(
"resLayer", m_resLayer = -1 );
115 m_segFinder.reset( 0 );
116 m_hitData.reset( 0 );
122 MsgStream log(
msgSvc(), name() );
123 log << MSG::INFO <<
"in beginRun()" << endmsg;
128 if ( NULL == _gm )
return StatusCode::FAILURE;
131 m_segs.reset(
new MdcSegList( _gm->nSuper(), m_flags.segPar ) );
133 return StatusCode::SUCCESS;
139 MsgStream log(
msgSvc(), name() );
140 log << MSG::INFO <<
"in initialize()" << endmsg;
147 m_flags.readPar( m_paramFile );
148 m_flags.lHist = m_hist;
149 m_flags.setDebug( m_debug );
156 std::cout <<
"MdcTrkRecon d0Cut " << m_d0Cut <<
" z0Cut " << m_z0Cut <<
" ptCut "
157 << m_dropTrkPt << std::endl;
161 sc = service(
"MagneticFieldSvc", m_pIMF );
162 if ( sc != StatusCode::SUCCESS )
163 { log << MSG::ERROR << name() <<
" Unable to open magnetic field service" << endmsg; }
164 m_bfield =
new BField( m_pIMF );
165 log << MSG::INFO << name() <<
" field z = " << m_bfield->bFieldNominal() << endmsg;
168 sc = service(
"RawDataProviderSvc", m_rawDataProviderSvc );
169 if ( sc.isFailure() )
171 log << MSG::FATAL << name() <<
" Could not load RawDataProviderSvc!" << endmsg;
172 return StatusCode::FAILURE;
176 sc = service(
"MdcPrintSvc", m_mdcPrintSvc );
177 if ( sc.isFailure() )
179 log << MSG::FATAL <<
"Could not load MdcPrintSvc!" << endmsg;
180 return StatusCode::FAILURE;
187 if ( m_flags.findSegs )
188 { m_segFinder.reset(
new MdcSegFinder( m_flags.segPar.useAllAmbig ) ); }
191 if ( m_doLineFit ) { m_tracks.reset(
new MdcTrackListCsmc( m_flags.tkParTight ) ); }
192 else { m_tracks.reset(
new MdcTrackList( m_flags.tkParTight ) ); }
193 m_tracks->setNoInner( m_noInner );
199 if ( !sc.isSuccess() ) { m_flags.lHist = 0; }
206 return StatusCode::SUCCESS;
214 if ( sc.isFailure() )
216 error() <<
"beginRun failed" << endmsg;
217 return StatusCode::FAILURE;
222 setFilterPassed(
false );
224 MsgStream log(
msgSvc(), name() );
225 log << MSG::INFO <<
"in execute()" << endmsg;
230 for (
int ii = 0; ii < 43; ii++ )
232 for (
int jj = 0; jj < 288; jj++ )
241 mcDrift[ii][jj] = -99.;
246 hitPoisoned[ii][jj] = -99;
252#ifdef MDCPATREC_TIMETEST
257 SmartDataPtr<Event::EventHeader> evtHead( eventSvc(),
"/Event/EventHeader" );
260 log << MSG::FATAL <<
"Could not retrieve event header" << endmsg;
261 return ( StatusCode::FAILURE );
263 t_eventNo = evtHead->eventNumber();
265 std::cout << t_iExexute <<
" run " << evtHead->runNumber() <<
" evt " << t_eventNo
269 if ( m_selEvtNo.size() > 0 )
271 std::vector<int>::iterator it = m_selEvtNo.begin();
272 for ( ; it != m_selEvtNo.end(); it++ )
274 if ( ( *it ) == t_eventNo ) setFilterPassed(
true );
281 bool iterateT0 =
false;
282 const int nBunch = 3;
284 double BeamDeltaTime = 24. / nBunch;
285 SmartDataPtr<RecEsTimeCol> evTimeCol( eventSvc(),
"/Event/Recon/RecEsTimeCol" );
286 if ( !evTimeCol || evTimeCol->size() == 0 )
288 log << MSG::WARNING <<
" run " << evtHead->runNumber() <<
" evt " << t_eventNo
289 <<
" Could not find RecEsTimeCol" << endmsg;
292 return StatusCode::SUCCESS;
295 RecEsTimeCol::iterator iter_evt = evTimeCol->begin();
297 if ( iter_evt != evTimeCol->end() )
299 t_t0Stat = ( *iter_evt )->getStat();
300 t_t0 = ( *iter_evt )->getTest();
305 if (
abs( t_t0 ) < 0.00001 || ( t_t0 < 0 ) || ( t_t0 > 9999.0 ) )
307 log << MSG::WARNING <<
"Skip with t0 = " << t_t0 << endmsg;
308 return StatusCode::SUCCESS;
312 if ( m_debug > 0 ) std::cout << name() <<
" t0 " << t0 <<
" " << std::endl;
316 if ( !m_recForEsTime && m_tryBunch )
318 if ( t_t0Stat < 10 )
return StatusCode::SUCCESS;
322 if ( iBunch > ( nBunch - 1 ) )
return StatusCode::SUCCESS;
323 if ( t_t0Stat < 0 ) { iterateT0 =
true; }
327 if ( ( t_t0Stat > -1 ) && ( fabs( iBunch * BeamDeltaTime - t_t0 ) < 2. ) )
332 else { t0 = iBunch * BeamDeltaTime * 1.e-9; }
337 SmartDataPtr<MdcHitMap> hitMap( eventSvc(),
"/Event/Hit/MdcHitMap" );
340 log << MSG::FATAL <<
"Could not retrieve MDC hit map" << endmsg;
341 return ( StatusCode::FAILURE );
344 SmartDataPtr<MdcHitCol> hitCol( eventSvc(),
"/Event/Hit/MdcHitCol" );
347 log << MSG::FATAL <<
"Could not retrieve MDC hit list" << endmsg;
348 return ( StatusCode::FAILURE );
353 DataObject* aReconEvent;
354 eventSvc()->findObject(
"/Event/Recon", aReconEvent );
355 if ( aReconEvent == NULL )
358 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon", aReconEvent );
359 if ( sc != StatusCode::SUCCESS )
361 log << MSG::FATAL <<
"Could not register ReconEvent" << endmsg;
362 return ( StatusCode::FAILURE );
366 DataObject* aTrackCol;
367 DataObject* aRecHitCol;
369 SmartIF<IDataManagerSvc> dataManSvc( eventSvc() );
370 if ( !m_combineTracking )
372 eventSvc()->findObject(
"/Event/Recon/RecMdcTrackCol", aTrackCol );
375 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcTrackCol" );
376 eventSvc()->unregisterObject(
"/Event/Recon/RecMdcTrackCol" );
378 eventSvc()->findObject(
"/Event/Recon/RecMdcHitCol", aRecHitCol );
381 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcHitCol" );
382 eventSvc()->unregisterObject(
"/Event/Recon/RecMdcHitCol" );
387 eventSvc()->findObject(
"/Event/Recon/RecMdcTrackCol", aTrackCol );
388 if ( aTrackCol ) { trackList =
dynamic_cast<RecMdcTrackCol*
>( aTrackCol ); }
393 if ( !sc.isSuccess() )
395 log << MSG::FATAL <<
" Could not register RecMdcTrack collection" << endmsg;
396 return StatusCode::FAILURE;
400 eventSvc()->findObject(
"/Event/Recon/RecMdcHitCol", aRecHitCol );
401 if ( aRecHitCol ) { hitList =
dynamic_cast<RecMdcHitCol*
>( aRecHitCol ); }
406 if ( !sc.isSuccess() )
408 log << MSG::FATAL <<
" Could not register RecMdcHit collection" << endmsg;
409 return StatusCode::FAILURE;
413 if ( m_debug > 0 ) std::cout << name() <<
" t0 " << t0 <<
" " << std::endl;
414 m_hitData->loadevent( hitCol, hitMap, t0 );
415 t_nDigi = hitCol->size();
417 if (
poisoningHits() ) { m_hitData->poisonHits( _gm, m_debug ); }
421 for (
int i = 0; i < m_hitData->nhits(); i++ )
423 const MdcHit* thisHit = m_hitData->hit( i );
426 if ( m_hitData->segUsage().get( thisHit )->deadHit() ) { hitPoisoned[l][
w] = 1; }
427 else { hitPoisoned[l][
w] = 0; }
431#ifdef MDCPATREC_TIMETEST
432 SmartDataPtr<Event::McParticleCol> mcParticleCol( eventSvc(),
"/Event/MC/McParticleCol" );
433 if ( !mcParticleCol ) { log << MSG::INFO <<
"Could not retrieve McParticelCol" << endmsg; }
434 m_mcTkNum = mcParticleCol->size();
442 if ( m_flags.findSegs )
445 nSegs = m_segFinder->createSegs( _gm, *m_segs, m_hitData->segUsage(), m_hitData->hitMap(),
448 log << MSG::INFO <<
" Found " << nSegs <<
" segments" << endmsg;
451 std::cout <<
"------------------------------------------------" << std::endl;
452 std::cout <<
"==event " << t_eventNo <<
" Found " << nSegs <<
" segments" << std::endl;
456 if ( m_flags.lHist || m_flags.segPar.lPrint ) {
fillSegList(); }
463 if ( m_flags.findTracks && m_flags.findSegs )
468 m_tracks->createFromSegs( m_segs.get(), m_hitData->hitMap(), _gm, context, t0 );
471 if ( m_arbitrateHits ) nDeleted = m_tracks->arbitrateHits();
472 int nKeep = nTracks - nDeleted;
474 if ( m_debug > 0 && ( nTracks - nDeleted ) > 0 )
476 std::cout <<
"MdcTrkRecon: evt " << setw( 5 ) << t_eventNo <<
" nDigi " << setw( 4 )
477 << t_nDigi <<
" t0 " << setw( 5 ) << t_t0 <<
" keep " << nKeep <<
" track(s)";
478 if ( nDeleted != 0 ) { std::cout <<
",deleted " << nDeleted; }
479 std::cout << std::endl;
485 std::cout <<
"MdcTrkRecon: evt " << setw( 5 ) << t_eventNo <<
" nDigi " << setw( 4 )
486 << t_nDigi <<
" t0 " << setw( 5 ) << t_t0 <<
" found 0 track " << endl;
490 if ( m_flags.lHist ) t_nRecTk = nKeep;
492#ifdef MDCPATREC_RESLAYER
493 m_tracks->setResLayer( m_resLayer );
497 m_tracks->store( trackList, hitList );
501 std::cout << name() <<
" print track list " << std::endl;
502 m_mdcPrintSvc->printRecMdcTrackCol();
507#ifdef MDCPATREC_TIMETEST
508 RecMdcTrackCol::iterator
iter = trackList->begin();
509 for ( ;
iter != trackList->end();
iter++ )
512 ti_nHit += tk->getNhits();
517 m_segs->destroySegs();
524#ifdef MDCPATREC_TIMETEST
528 m_eventTime = m_timer[1]->elapsed();
529 m_t5recTkNum = m_tracks->length();
530 m_t5EvtNo = t_eventNo;
533 sc = m_tupleTime->write();
546 return StatusCode::SUCCESS;
551 MsgStream log(
msgSvc(), name() );
552 log << MSG::INFO <<
"in finalize()" << endmsg;
555#ifdef MDCPATREC_TIMETEST
558 return StatusCode::SUCCESS;
562 MsgStream log(
msgSvc(), name() );
563 StatusCode sc = StatusCode::SUCCESS;
566 h_sfHit =
histoSvc()->book(
"sfHit",
"Hits after segment finding", 46, -1., 44. );
570 histoSvc()->book(
"residVsLayer",
"Residual vs. layer", 60, -5, 50., 100, -0.5, 1.2 );
572 histoSvc()->book(
"residVsDoca",
"Residial vs. doca", 50, -2., 2., 100, -0.5, 1.2 );
577 histoSvc()->book(
"cirTkChi2",
"chi2 per dof in circle finding", 21, -1., 20. );
580 "nSigAdd",
"max allowed n sigma to add hit to existing segment", 50, 0, 50 );
582 histoSvc()->book(
"z0Cut",
"z0 for including stereo segs in cluster", 100, 0, 600 );
584 histoSvc()->book(
"ctCut",
"ct for including stereo segs in cluster", 100, -50, 50 );
585 g_delCt =
histoSvc()->book(
"delCt",
"del ct cut forming seg group", 100, -20, 20 );
586 g_delZ0 =
histoSvc()->book(
"delZ0",
"del z0 cut forming seg group", 100, -60, 60 );
587 g_phiDiff =
histoSvc()->book(
"phiDiff",
"phidiff mult for drop dup seg", 100, -0.5, 6.5 );
588 g_slopeDiff =
histoSvc()->book(
"slopeDiff",
"slopediff for drop dup seg", 100, -0.3, 0.3 );
590 histoSvc()->book(
"maxSegChisqAx",
"max chisqDof ax seg combine", 1000, 0., 1000. );
592 histoSvc()->book(
"maxSegChisqSt",
"max chisqDof st seg combine", 200, -10., 200. );
605 NTuplePtr ntWireEff(
ntupleSvc(),
"MdcWire/mc" );
626 else { log << MSG::ERROR <<
"Cannot book tuple MdcWire/mc" << endmsg; }
630 NTuplePtr ntt(
ntupleSvc(),
"MdcRec/test" );
635 ntupleSvc()->book(
"MdcRec/test", CLID_ColumnWiseTuple,
"MdcTrkRecon t particle" );
646 log << MSG::ERROR <<
"Cannot book tuple MdcRec/test" << endmsg;
652 NTuplePtr ntMc(
ntupleSvc(),
"MdcMc/mcTk" );
657 ntupleSvc()->book(
"MdcMc/mcTk", CLID_ColumnWiseTuple,
"MdcTrkRecon Mc particle" );
665 log << MSG::ERROR <<
"Cannot book tuple MdcMc/mcTk" << endmsg;
671 NTuplePtr ntMcHit(
ntupleSvc(),
"MdcMc/mcHit" );
676 ntupleSvc()->book(
"MdcMc/mcHit", CLID_ColumnWiseTuple,
"MdcTrkRecon Mc hit" );
699 log << MSG::ERROR <<
"Cannot book tuple MdcMc/mcHit" << endmsg;
704 NTuplePtr nt1(
ntupleSvc(),
"MdcRec/rec" );
708 m_tuple1 =
ntupleSvc()->book(
"MdcRec/rec", CLID_ColumnWiseTuple,
"MdcTrkRecon results" );
765 log << MSG::ERROR <<
"Cannot book tuple MdcRec/rec" << endmsg;
770 NTuplePtr ntSeg(
ntupleSvc(),
"MdcSeg/seg" );
775 ntupleSvc()->book(
"MdcSeg/seg", CLID_ColumnWiseTuple,
"MdcTrkRecon segment data" );
788 log << MSG::ERROR <<
"Cannot book tuple MdcSeg/seg" << endmsg;
794 NTuplePtr nt4(
ntupleSvc(),
"MdcRec/evt" );
799 ntupleSvc()->book(
"MdcRec/evt", CLID_ColumnWiseTuple,
"MdcTrkRecon event data" );
821 log << MSG::ERROR <<
"Cannot book N-tuple: MdcRec/evt" << endmsg;
827 NTuplePtr ntCombAx(
ntupleSvc(),
"MdcCombAx/combAx" );
832 "MdcTrkRecon cuts in combine ax seg" );
856 log << MSG::ERROR <<
"Cannot book N-tuple: FILE101/combAx" << endmsg;
862 NTuplePtr ntFindSeg(
ntupleSvc(),
"MdcSeg/findSeg" );
867 "MdcTrkRecon cuts in segment finder" );
884 log << MSG::ERROR <<
"Cannot book N-tuple: FILE101/findSeg" << endmsg;
890 NTuplePtr ntPick(
ntupleSvc(),
"MdcTrk/pick" );
895 ntupleSvc()->book(
"MdcTrk/pick", CLID_ColumnWiseTuple,
"MdcTrkRecon pickHits" );
919 log << MSG::ERROR <<
"Cannot book N-tuple: MdcTrk/pick" << endmsg;
924#ifdef MDCPATREC_TIMETEST
926 NTuplePtr nt5(
ntupleSvc(),
"MdcTime/ti" );
927 if ( nt5 ) { m_tupleTime = nt5; }
930 m_tupleTime =
ntupleSvc()->book(
"MdcTime/ti", CLID_RowWiseTuple,
"MdcTrkRecon time" );
933 sc = m_tupleTime->addItem(
"eventtime", m_eventTime );
934 sc = m_tupleTime->addItem(
"recTkNum", m_t5recTkNum );
935 sc = m_tupleTime->addItem(
"mcTkNum", m_mcTkNum );
936 sc = m_tupleTime->addItem(
"evtNo", m_t5EvtNo );
937 sc = m_tupleTime->addItem(
"nHit", m_t5nHit );
938 sc = m_tupleTime->addItem(
"nDigi", m_t5nDigi );
942 log << MSG::ERROR <<
"Cannot book N-tuple: FILE101/time" << endmsg;
946 sc = service(
"BesTimerSvc", m_timersvc );
947 if ( sc.isFailure() )
949 log << MSG::WARNING <<
" Unable to locate BesTimerSvc" << endmsg;
952 m_timer[1] = m_timersvc->addItem(
"Execution" );
953 m_timer[1]->propName(
"nExecution" );
956#ifdef MDCPATREC_RESLAYER
958 NTuplePtr nt6(
ntupleSvc(),
"MdcRes/res" );
959 if ( nt6 ) { g_tupleres = nt6; }
962 g_tupleres =
ntupleSvc()->book(
"MdcRes/res", CLID_RowWiseTuple,
"MdcTrkRecon res" );
965 sc = g_tupleres->addItem(
"resid", g_resLayer );
966 sc = g_tupleres->addItem(
"layer", g_t6Layer );
970 log << MSG::ERROR <<
"Cannot book N-tuple: FILE101/res" << endmsg;
971 return StatusCode::FAILURE;
980 MsgStream log(
msgSvc(), name() );
983 for (
int i = 0; i < 100; i++ )
985 isPrimaryOfMcTk[i] = -9999;
986 pdgOfMcTk[i] = -9999;
988 double ptOfMcTk[100] = { 0. };
989 double thetaOfMcTk[100] = { 0. };
990 double phiOfMcTk[100] = { 0. };
991 double nDigiOfMcTk[100] = { 0. };
995 SmartDataPtr<Event::MdcMcHitCol> mcMdcMcHitCol( eventSvc(),
"/Event/MC/MdcMcHitCol" );
996 if ( !mcMdcMcHitCol ) { log << MSG::INFO <<
"Could not find MdcMcHit" << endmsg; }
999 Event::MdcMcHitCol::iterator iter_mchit = mcMdcMcHitCol->begin();
1000 for ( ; iter_mchit != mcMdcMcHitCol->end(); iter_mchit++ )
1002 const Identifier id = ( *iter_mchit )->identify();
1005 int iMcTk = ( *iter_mchit )->getTrackIndex();
1006 if ( iMcTk < 100 && iMcTk > 0 ) nDigiOfMcTk[iMcTk]++;
1007 mcDrift[layer][wire] = ( *iter_mchit )->getDriftDistance() / 10.;
1009 mcX[layer][wire] = ( *iter_mchit )->getPositionX() / 10.;
1010 mcY[layer][wire] = ( *iter_mchit )->getPositionY() / 10.;
1011 mcZ[layer][wire] = ( *iter_mchit )->getPositionZ() / 10.;
1012 mcLR[layer][wire] = ( *iter_mchit )->getPositionFlag();
1013 if ( mcLR[layer][wire] == 0 ) mcLR[layer][wire] = -1;
1014 t_nHitInTk[iMcTk]++;
1022 SmartDataPtr<Event::McParticleCol> mcParticleCol( eventSvc(),
"/Event/MC/McParticleCol" );
1023 if ( !mcParticleCol ) { log << MSG::INFO <<
"Could not retrieve McParticelCol" << endmsg; }
1027 Event::McParticleCol::iterator it = mcParticleCol->begin();
1028 for ( ; it != mcParticleCol->end(); it++ )
1035 it = mcParticleCol->begin();
1036 for ( ; it != mcParticleCol->end(); it++ )
1038 int tkId = ( *it )->trackIndex();
1039 if ( ( *it )->primaryParticle() )
1041 t_t0Truth = ( *it )->initialPosition().t();
1042 isPrimaryOfMcTk[tkId] = 1;
1046 isPrimaryOfMcTk[tkId] = 0;
1050 int pdg_code = ( *it )->particleProperty();
1051 pdgOfMcTk[tkId] = pdg_code;
1055 const CLHEP::Hep3Vector& true_mom = ( *it )->initialFourMomentum().vect();
1056 const CLHEP::HepLorentzVector& posIni = ( *it )->initialPosition();
1057 const CLHEP::HepLorentzVector& posFin = ( *it )->finalPosition();
1058 if ( tkId < 100 && tkId >= 0 )
1060 ptOfMcTk[tkId] = true_mom.perp();
1061 thetaOfMcTk[tkId] = ( *it )->initialFourMomentum().theta();
1062 phiOfMcTk[tkId] = ( *it )->initialFourMomentum().phi();
1070 m_tMcD0 = posIni.perp() / 10.;
1072 m_tMcTheta = ( *it )->initialFourMomentum().theta();
1089 uint32_t getDigiFlag = 0;
1090 getDigiFlag += m_maxMdcDigi;
1094 MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
1095 if ( (
int)mdcDigiVec.size() < m_minMdcDigi )
1096 { std::cout <<
" Skip this event for MdcDigiVec.size() < " << m_minMdcDigi << endl; }
1098 if ( mdcDigiVec.size() <= 0 )
return;
1100 MdcDigiCol::iterator
iter = mdcDigiVec.begin();
1101 for ( ;
iter != mdcDigiVec.end();
iter++ )
1105 int tkId = ( *iter )->getTrackIndex();
1108 haveDigiPt[l][
w] = ptOfMcTk[( *iter )->getTrackIndex()];
1110 haveDigiPhi[l][
w] = phiOfMcTk[( *iter )->getTrackIndex()];
1116 if ( tkId >= 1000 ) tkId -= 1000;
1133 if ( hitInSegList[l][
w] > 0 )
m_we_seg = 1;
1137 if ( l == 35 && tkId >= 0 &&
abs( pdgOfMcTk[tkId] ) == 11 && hitInSegList[l][
w] <= 0 )
1139 cout <<
"layer " << l <<
" cell " <<
w <<
" gwire " << gwire <<
" inseg "
1140 << hitInSegList[l][
w] << endl;
1151 if ( 2 == m_flags.segPar.lPrint )
1152 { std::cout <<
"print after Segment finding " << std::endl; }
1153 if ( !m_flags.lHist )
return;
1155 for (
int ii = 0; ii < 43; ii++ )
1157 for (
int jj = 0; jj < 288; jj++ ) { hitInSegList[ii][jj] = 0; }
1160 for (
int i = 0; i < _gm->nSuper(); i++ )
1166 for (
int ihit = 0; ihit < aSeg->
nHit(); ihit++ )
1171 hitInSegList[layer][wire]++;
1180 for (
int ii = 0; ii < 43; ii++ )
1182 for (
int jj = 0; jj < 288; jj++ )
1188 m_tsInSeg[iDigi] = hitInSegList[ii][jj];
1199 std::cout <<
"tksize = " << trackList->size() << std::endl;
1200 RecMdcTrackCol::iterator it = trackList->begin();
1201 for ( ; it != trackList->end(); it++ )
1204 std::cout << endl <<
"//====RecMdcTrack " << tk->
trackId() <<
"====:" << std::endl;
1205 cout <<
" d0 " << tk->
helix( 0 ) <<
" phi0 " << tk->
helix( 1 ) <<
" cpa " << tk->
helix( 2 )
1206 <<
" z0 " << tk->
helix( 3 ) <<
" tanl " << tk->
helix( 4 ) << endl;
1207 std::cout <<
" q " << tk->
charge() <<
" theta " << tk->
theta() <<
" phi " << tk->
phi()
1208 <<
" x0 " << tk->
x() <<
" y0 " << tk->
y() <<
" z0 " << tk->
z() <<
" r0 "
1210 std::cout <<
" p " << tk->
p() <<
" pt " << tk->
pxy() <<
" px " << tk->
px() <<
" py "
1211 << tk->
py() <<
" pz " << tk->
pz() << endl;
1212 std::cout <<
" tkStat " << tk->
stat() <<
" chi2 " << tk->
chi2() <<
" ndof " << tk->
ndof()
1213 <<
" nhit " << tk->
getNhits() <<
" nst " << tk->
nster() << endl;
1214 std::cout <<
"errmat mat " << std::endl;
1215 std::cout << tk->
err() << std::endl;
1221 std::cout << nhits <<
" Hits: " << std::endl;
1222 for (
int ii = 0; ii < nhits; ii++ )
1227 cout <<
"(" << layer <<
"," << wire <<
"," << tk->
getVecHits()[ii]->getStat()
1228 <<
",lr:" << tk->
getVecHits()[ii]->getFlagLR() <<
") ";
1230 std::cout <<
" " << std::endl;
1232 std::cout <<
" " << std::endl;
1236 if ( m_flags.debugFlag() > 1 )
1238 std::cout <<
"=======Print after Track finding=======" << std::endl;
1242 if ( !m_flags.lHist )
return;
1244 int nTk = ( *m_tracks ).nTrack();
1245 for (
int itrack = 0; itrack < nTk; itrack++ )
1247 MdcTrack* atrack = ( *m_tracks )[itrack];
1248 if ( atrack == NULL )
continue;
1250 if ( fitResult == 0 )
continue;
1254 int seg[11] = { 0 };
1259 int layerCount[43] = { 0 };
1260 for (
int iii = 0; iii < 43; iii++ ) { layerCount[iii] = 0; }
1262 for ( ; hot != hitlist->
end(); hot++ )
1268 layerCount[layer]++;
1272 if ( layer > 0 ) { segme = ( layer - 1 ) / 4; }
1274 if ( recoHot->
layer()->
view() ) { ++nSt; }
1281 double fltLen = recoHot->
fltLen();
1301 m_dx[i] =
m_x[i] - mcX[layer][wire];
1302 m_dy[i] =
m_y[i] - mcY[layer][wire];
1303 m_dz[i] =
m_z[i] - mcZ[layer][wire];
1308 Constants::twoPi * _gm->Layer( layer )->rMid() / _gm->Layer( layer )->nWires();
1311 double res = 999., rese = 999.;
1312 if ( recoHot->
resid( res, rese,
false ) ) {}
1318 for (
int i = 0; i < 11; i++ )
1320 if ( seg[i] > 0 ) nSlay++;
1327 double fltLenPoca = 0.0;
1338 CLHEP::Hep3Vector
p1 = fitResult->
momentum( fltLenPoca );
1339 double px, py, pz, pxy;
1340 pxy = fitResult->
pt();
1346 HepPoint3D poca = fitResult->
position( fltLenPoca );
1371 uint32_t getDigiFlag = 0;
1372 getDigiFlag += m_maxMdcDigi;
1376 MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
1377 if ( (
int)mdcDigiVec.size() < m_minMdcDigi )
1378 { std::cout <<
" Skip this event for MdcDigiVec.size() < " << m_minMdcDigi << endl; }
1382 MdcDigiCol::iterator
iter = mdcDigiVec.begin();
1393 m_t4PhiMid[iDigi] = _gm->Layer( l )->phiWire(
w );
1402 SmartDataPtr<MdcDigiCol> mdcDigiCol( eventSvc(),
"/Event/Digi/MdcDigiCol" );
1410 uint32_t getDigiFlag = 0;
1411 getDigiFlag += m_maxMdcDigi;
1415 MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
1416 MdcDigiCol::iterator
iter = mdcDigiVec.begin();
1417 std::cout << name() <<
" dump MdcDigiVec, nDigi=" << mdcDigiVec.size() << std::endl;
1418 for (
int iDigi = 0;
iter != mdcDigiVec.end();
iter++, iDigi++ )
1422 int tkTruth = ( *iter )->getTrackIndex();
1425 std::cout <<
"(" << l <<
"," <<
w <<
";" << tkTruth <<
",t " << tdc <<
",c " << adc <<
")";
1426 if ( iDigi % 4 == 0 ) std::cout << std::endl;
1428 std::cout << std::endl;
DECLARE_COMPONENT(BesBdkRc)
std::vector< MdcDigi * > MdcDigiVec
ObjectVector< RecMdcHit > RecMdcHitCol
ObjectVector< RecMdcTrack > RecMdcTrackCol
NTuple::Array< long > m_tsLayer
NTuple::Array< double > m_entra
NTuple::Array< long > m_tsMcTkId
NTuple::Item< double > g_findSegMc
NTuple::Tuple * m_tupleMcHit
NTuple::Tuple * m_tupleSeg
NTuple::Item< double > m_t4nMcTk
NTuple::Array< double > m_tMcLR
NTuple::Array< double > m_adc
NTuple::Item< long > m_tsNDigi
NTuple::Item< double > g_combAxMcPt
NTuple::Item< long > m_tMcNHit
NTuple::Item< double > g_combAxSlTest
NTuple::Array< double > m_dDriftD
NTuple::Array< double > m_dz
NTuple::Array< double > m_ambig
NTuple::Array< long > m_pickIs2D
NTuple::Item< double > m_tMcEvtNo
NTuple::Item< double > m_nSt
NTuple::Item< long > m_we_poisoned
NTuple::Item< double > m_we_pt
NTuple::Item< double > g_combAxQualitySeed
NTuple::Array< long > m_t4Layer
NTuple::Item< double > g_combAxPatSeed
NTuple::Item< double > m_nSlay
NTuple::Item< long > m_tMcTkId
NTuple::Item< long > m_t4nDigi
NTuple::Array< double > m_pickPt
NTuple::Tuple * g_tupleFindSeg
NTuple::Item< long > m_pickLayer
NTuple::Item< double > m_pocax
NTuple::Item< double > m_tMcPz
NTuple::Array< long > m_pickMcTk
NTuple::Array< double > m_dlr
NTuple::Item< double > g_combAxMcAmbigTest
NTuple::Item< int > g_findSegPat34
NTuple::Item< double > m_p
NTuple::Item< double > g_findSegAmbig
NTuple::Item< long > m_tMcNTk
NTuple::Item< int > g_findSegPat
NTuple::Array< long > m_tsWire
AIDA::IHistogram1D * g_pickHitWire
NTuple::Item< long > m_pickNCellWithDigi
NTuple::Array< double > m_tof
NTuple::Array< double > m_tMcWire
NTuple::Item< double > m_we_phi
AIDA::IHistogram1D * g_delCt
AIDA::IHistogram1D * g_phiDiff
NTuple::Array< double > m_pickPhiLowCut
NTuple::Array< double > m_doca
NTuple::Item< double > m_tMcPx
NTuple::Item< double > g_findSegChi2Refit
NTuple::Item< double > m_phi0
NTuple::Item< long > m_tw
NTuple::Item< double > m_nDof
NTuple::Array< double > m_tdc
NTuple::Item< long > m_t4EvtNo
NTuple::Item< double > m_tMcPy
double haveDigiDrift[43][288]
NTuple::Item< long > m_we_layer
NTuple::Tuple * m_tupleWireEff
NTuple::Item< double > m_tdncell
NTuple::Array< double > m_tMcZ
NTuple::Array< long > m_t4Wire
NTuple::Array< double > m_pickDriftCut
NTuple::Item< double > m_z0
int haveDigiAmbig[43][288]
NTuple::Item< long > m_nHit
NTuple::Item< double > m_tMcTheta
NTuple::Item< double > g_findSegIntercept
double haveDigiPhi[43][288]
AIDA::IHistogram1D * g_nSigAdd
NTuple::Item< double > m_tdphi
NTuple::Array< double > m_act
NTuple::Item< long > m_we_primary
NTuple::Item< double > m_pz
NTuple::Array< double > m_tMcX
NTuple::Array< double > m_wire
NTuple::Item< double > m_pocay
NTuple::Item< double > m_tMcZ0
NTuple::Item< long > m_we_seg
NTuple::Array< double > m_t4Charge
NTuple::Item< double > m_evtNo
NTuple::Item< long > m_we_tkId
NTuple::Item< double > m_d0
NTuple::Array< double > m_pickCurv
NTuple::Item< double > m_we_theta
NTuple::Item< long > m_we_track
NTuple::Array< double > m_resid
NTuple::Array< double > m_pickDrift
NTuple::Item< long > m_tMcPid
NTuple::Item< long > m_we_pdg
NTuple::Array< double > m_tMcY
NTuple::Item< double > m_tMcD0
NTuple::Item< double > m_t4t0
double haveDigiTheta[43][288]
NTuple::Array< double > m_z
AIDA::IHistogram1D * g_delZ0
AIDA::IHistogram1D * g_z0Cut
NTuple::Array< double > m_pickResid
NTuple::Array< int > m_pickPhizOk
NTuple::Item< long > m_we_wire
NTuple::Item< double > m_t4nRecTk
NTuple::Item< double > m_q
AIDA::IHistogram2D * g_residVsLayer
NTuple::Array< double > m_x
NTuple::Item< double > g_combAxMcTheta
AIDA::IHistogram1D * g_cirTkChi2
AIDA::IHistogram1D * g_maxSegChisqSt
NTuple::Item< long > m_tsNSeg
NTuple::Item< double > g_findSegChi2
NTuple::Item< double > g_combAxQualityTest
AIDA::IHistogram1D * h_sfHit
NTuple::Item< double > m_chi2
NTuple::Item< double > m_t0
NTuple::Array< double > m_pickSigma
AIDA::IHistogram1D * g_3dTkChi2
NTuple::Item< long > m_t4t0Stat
NTuple::Item< double > g_combAxNhitTest
AIDA::IHistogram2D * g_residVsDoca
NTuple::Item< double > g_combAxSigPhi0
NTuple::Item< double > m_nTdsTk
NTuple::Item< double > m_tphi
NTuple::Item< double > g_combAxdCurv
NTuple::Array< long > m_pickWire
NTuple::Item< double > m_pocaz
NTuple::Array< double > m_tMcDrift
NTuple::Tuple * m_tupleEvt
NTuple::Item< double > g_findSegChi2Add
NTuple::Array< double > m_cellWidth
NTuple::Tuple * m_tuplePick
NTuple::Item< double > m_nMcTk
NTuple::Array< double > m_pickDriftTruth
NTuple::Item< double > g_findSegSlope
NTuple::Item< double > g_combAxSigCurv
NTuple::Array< double > m_driftT
NTuple::Item< double > m_tMcFiTerm
NTuple::Item< long > m_tl
NTuple::Array< double > m_dx
NTuple::Array< long > m_tsInSeg
NTuple::Array< double > m_dy
NTuple::Item< double > m_t4t0Truth
double haveDigiPt[43][288]
NTuple::Item< double > m_t0Truth
NTuple::Item< double > g_combAxdPhi0
NTuple::Array< double > m_pickZ
AIDA::IHistogram1D * g_slopeDiff
NTuple::Array< double > m_pickPredDrift
NTuple::Array< double > m_tMcLayer
NTuple::Item< int > g_findSegSl
NTuple::Array< double > m_t4PhiMid
NTuple::Array< double > m_layer
NTuple::Item< double > m_pt
NTuple::Item< double > m_cpa
NTuple::Array< double > m_driftD
NTuple::Item< double > m_tanl
NTuple::Item< double > m_t0Stat
NTuple::Array< double > m_sigma
NTuple::Item< double > g_combAxPatTest
NTuple::Item< double > g_combAxNhitSeed
NTuple::Item< double > m_nAct
NTuple::Item< double > g_combAxMc
NTuple::Item< long > m_we_gwire
NTuple::Item< long > m_t4nDigiUnmatch
NTuple::Array< double > m_y
AIDA::IHistogram1D * g_maxSegChisqAx
AIDA::IHistogram1D * g_ctCut
NTuple::Array< double > m_t4Time
NTuple::Item< double > g_combAxSlSeed
NTuple::Tuple * g_tupleCombAx
NTuple::Tuple * m_tupleMc
NTuple::Item< long > m_pickNCell
NTuple::Item< double > g_combAxMcAmbigSeed
NTuple::Item< long > m_tsEvtNo
NTuple::Item< double > g_combAxMcPhi
NTuple::Array< double > m_fltLen
NTuple::Array< double > m_pickPhiHighCut
NTuple::Item< double > m_tkId
NTuple::Array< double > m_t4Hot
NTuple::Item< int > g_findSegNhit
IHistogramSvc * histoSvc()
static const double twoPi
static const int nWireBeforeLayer[43]
const double theta() const
const HepSymMatrix err() const
const double chi2() const
const int trackId() const
const HepVector helix() const
......
GmsListLink * next() const
static MdcDetector * instance()
double entranceAngle() const
const MdcLayer * layer() const
const MdcHit * mdcHit() const
unsigned layernumber() const
unsigned wirenumber() const
double driftTime(double tof, double z) const
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
static int wire(const Identifier &id)
const MdcHit * mdcHit() const
MdcHitUse * hit(int i) const
void dumpTdsTrack(RecMdcTrackCol *trackList)
bool ignoringUsedHits() const
MdcTrkRecon(const std::string &name, ISvcLocator *pSvcLocator)
bool poisoningHits() const
static void readMCppTable(std::string filenm)
static double MdcTime(int timeChannel)
static double MdcCharge(int chargeChannel)
const HitRefVec getVecHits(void) const
const int getNhits() 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
virtual int nActive() const =0
virtual TrkExchangePar helix(double fltL) const =0
static double nSigmaCut[43]
hot_iterator begin() const
TrkHotList::hot_iterator hot_iterator
double resid(bool exclude=false) const
const TrkRep * getParentRep() const
const TrkFit * fitResult() const
virtual double arrivalTime(double fltL) const
_EXTERN_ std::string RecMdcTrackCol
_EXTERN_ std::string RecMdcHitCol