17#include "MdcGeomSvc/IMdcGeomSvc.h"
18#include "MdcTables/MdcTables.h"
21#include "TrkReco/TConformalFinder.h"
22#include "TrkReco/TConformalFinder0.h"
23#include "TrkReco/TCurlFinder.h"
24#include "TrkReco/TFastFinder.h"
25#include "TrkReco/TMDC.h"
26#include "TrkReco/TMDCWire.h"
27#include "TrkReco/TMDCWireHit.h"
28#include "TrkReco/TMLink.h"
29#include "TrkReco/TPerfectFinder.h"
30#include "TrkReco/TTrack.h"
31#include "TrkReco/TTrackBase.h"
32#include "TrkReco/TTrackHEP.h"
33#include "TrkReco/TTrackMC.h"
35#include "EvTimeEvent/RecEsTime.h"
36#include "MdcCalibFunSvc/IMdcCalibFunSvc.h"
39#include "GaudiKernel/Bootstrap.h"
40#include "GaudiKernel/IDataManagerSvc.h"
41#include "GaudiKernel/IDataProviderSvc.h"
42#include "GaudiKernel/IMessageSvc.h"
43#include "GaudiKernel/ISvcLocator.h"
44#include "GaudiKernel/MsgStream.h"
45#include "GaudiKernel/PropertyMgr.h"
46#include "GaudiKernel/SmartDataPtr.h"
47#include "GaudiKernel/StatusCode.h"
49#include "EventModel/EventHeader.h"
50#include "Identifier/Identifier.h"
51#include "Identifier/MdcID.h"
52#include "McTruth/McParticle.h"
53#include "McTruth/MdcMcHit.h"
54#include "MdcRawEvent/MdcDigi.h"
55#include "RawDataProviderSvc/IRawDataProviderSvc.h"
56#include "RawEvent/RawDataUtil.h"
57#include "ReconEvent/ReconEvent.h"
59#include "RawDataProviderSvc/MdcRawDataProvider.h"
65#include "BesTimerSvc/IBesTimerSvc.h"
67#include "BesTimerSvc/BesTimer.h"
76 : Algorithm( name, pSvcLocator )
79 , _rkfitter(
"range fitter", false, 0, true )
85 std::cout << std::fixed << std::setprecision( 3 );
94 MsgStream log(
msgSvc(), name() );
95 log << MSG::INFO <<
"in initialize()" << endmsg;
97 _rkfitter.setBesFromGdml();
103 sc = service(
"RawDataProviderSvc", irawDataProviderSvc );
104 _rawDataProviderSvc = irawDataProviderSvc;
105 if ( sc.isFailure() )
107 log << MSG::FATAL <<
"Could not load RawDataProviderSvc!" << endmsg;
108 return StatusCode::FAILURE;
121 sc = service(
"MdcCalibFunSvc", imdcCalibSvc );
122 _mdcCalibFunSvc = imdcCalibSvc;
123 if ( sc.isFailure() ) { log << MSG::FATAL <<
"Could not load MdcCalibFunSvc!" << endmsg; }
151 else if ( !_confFinder )
165 if (
b_doSalvage == 2 ) _confFinder->doSalvage(
true );
203 StatusCode sc = service(
"BesTimerSvc", m_timersvc );
204 if ( sc.isFailure() )
206 log << MSG::WARNING <<
" Unable to locate BesTimerSvc" << endmsg;
207 return StatusCode::FAILURE;
209 m_timer[1] = m_timersvc->addItem(
"Execution" );
210 m_timer[1]->propName(
"nExecution" );
213 return StatusCode::SUCCESS;
216TMDC* TrkReco::cdcInit(
void ) {
253 if ( _confFinder )
delete _confFinder;
254 if ( _curlFinder )
delete _curlFinder;
256 return StatusCode::SUCCESS;
261 StatusCode sc1 = Gaudi::svcLocator()->service(
"MdcGeomSvc", imdcGeomSvc );
262 _mdcGeomSvc = imdcGeomSvc;
263 if ( sc1.isFailure() ) {
return ( StatusCode::FAILURE ); }
266 return StatusCode::SUCCESS;
278 if ( sc.isFailure() )
280 error() <<
"beginRun failed" << endmsg;
281 return StatusCode::FAILURE;
286 MsgStream log(
msgSvc(), name() );
287 log << MSG::INFO <<
"in execute()" << endmsg;
294 for (
int ii = 0; ii < 43; ii++ )
296 for (
int jj = 0; jj < 288; jj++ )
298 havedigi[ii][jj] = -99;
309 IDataManagerSvc* dataManSvc;
310 DataObject* aTrackCol;
311 DataObject* aRecHitCol;
315 dataManSvc =
dynamic_cast<IDataManagerSvc*
>( eventSvc().get() );
316 eventSvc()->findObject(
"/Event/Recon/RecMdcTrackCol", aTrackCol );
317 if (
nullptr != aTrackCol )
319 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcTrackCol" );
320 eventSvc()->unregisterObject(
"/Event/Recon/RecMdcTrackCol" );
322 eventSvc()->findObject(
"/Event/Recon/RecMdcHitCol", aRecHitCol );
323 if (
nullptr != aRecHitCol )
325 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcHitCol" );
326 eventSvc()->unregisterObject(
"/Event/Recon/RecMdcHitCol" );
329 DataObject* aReconEvent;
330 eventSvc()->findObject(
"/Event/Recon", aReconEvent );
334 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon", recevt );
335 if ( sc != StatusCode::SUCCESS )
337 log << MSG::FATAL <<
"Could not register ReconEvent" << endmsg;
338 return ( StatusCode::FAILURE );
342 eventSvc()->findObject(
"/Event/Recon/RecMdcTrackCol", aTrackCol );
343 if ( aTrackCol ) { trkcol =
dynamic_cast<RecMdcTrackCol*
>( aTrackCol ); }
348 if ( !sc.isSuccess() )
350 log << MSG::FATAL <<
" Could not register RecMdcTrack collection" << endmsg;
351 return StatusCode::FAILURE;
355 eventSvc()->findObject(
"/Event/Recon/RecMdcHitCol", aRecHitCol );
356 if ( aRecHitCol ) { hitcol =
dynamic_cast<RecMdcHitCol*
>( aRecHitCol ); }
361 if ( !sc.isSuccess() )
363 log << MSG::FATAL <<
" Could not register RecMdcHit collection" << endmsg;
364 return StatusCode::FAILURE;
372 SmartDataPtr<RecEsTimeCol> aevtimeCol( eventSvc(),
"/Event/Recon/RecEsTimeCol" );
374 if ( aevtimeCol && aevtimeCol->size() )
376 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
377 t0_bes = ( *iter_evt )->getTest();
378 t0Sta = ( *iter_evt )->getStat();
382 log << MSG::WARNING <<
"Could not find EsTimeCol" << endmsg;
383 return StatusCode::SUCCESS;
388 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
391 log << MSG::FATAL <<
"Could not find Event Header" << endmsg;
392 return ( StatusCode::FAILURE );
394 _nEvents = eventHeader->eventNumber();
395 if (
b_tuple ) std::cout <<
"TrkReco ... processing ev# " << _nEvents << std::endl;
399 uint32_t getDigiFlag = 0;
403 MdcDigiVec mdcDigiVec = _rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
404 if ( 0 == mdcDigiVec.size() )
406 log << MSG::WARNING <<
" No hits in MdcDigiVec" << endmsg;
407 return StatusCode::SUCCESS;
414 MdcDigiVec::iterator iter1 = mdcDigiVec.begin();
415 MC_DIGI_SIZE = mdcDigiVec.size();
427 for ( ; iter1 != mdcDigiVec.end(); iter1++, digiId++ )
430 mdcId = ( *iter1 )->identify();
442 havedigi[layerId][wireId] = ( *iter1 )->getTrackIndex();
447 mhit.
geo = _mdcGeomSvc->Wire( layerId, wireId );
457 _trackManager.sett0bes( t0_bes );
460 mhit.
adc = ( *iter1 )->getChargeChannel();
465 double timewalk = _mdcCalibFunSvc->getTimeWalk( layerId, mhit.
adc );
466 double T0 = _mdcCalibFunSvc->getT0( layerId, wireId );
467 double drifttime = mhit.
tdc - tof - timewalk - T0;
468 double dist2 = _mdcCalibFunSvc->driftTimeToDist( drifttime, layerId, wireId, 2,
470 mhit.
erddl = _mdcCalibFunSvc->getSigma( layerId, 2, dist2, 0.0, 0.0, 0.0, mhit.
adc );
472 mhit.
ddl = dist2 / 10.;
482 mhit.
stat = mhit.
stat |= 1073741824;
493 t10_drift = mhit.
ddl;
494 t10_dDrift = mhit.
erddl;
496 t10_localId = wireId;
501 unsigned nT0Reset = 0;
510 if ( mdcDigiVec.size() > 2000 )
512 log << MSG::WARNING <<
" Too many hits in MdcDigiVec" << endmsg;
513 return StatusCode::SUCCESS;
534 _perfectFinder->doit( axialHits, stereoHits,
tracks, tracks2D );
535 _trackManager.append(
tracks );
552 _confFinder->doit( axialHits, stereoHits,
tracks, tracks2D );
558 if ( ( (
TConformalFinder*)_confFinder )->T0ResetDone() )
goto TrkReco_start;
564 _trackManager.append(
tracks );
565 _trackManager.append2D( tracks2D );
568 if (
b_doSalvage == 1 ) _trackManager.salvage( allHits );
577 _trackManager.maskCurlHits( axialHits, stereoHits, _trackManager.tracks() );
579 tracks.append( confTracks );
580 _curlFinder->doit( axialHits, stereoHits,
tracks, tracks2D );
581 tracks.remove( confTracks );
591 _trackManager.append(
tracks );
592 _trackManager.append2D( tracks2D );
597 _trackManager.merge();
626 if ( scTds != StatusCode::SUCCESS )
return ( StatusCode::FAILURE );
632 if (
b_tuple ) t3_t0Rec = _trackManager.paraT0();
639 SmartDataPtr<RecEsTimeCol> aevtimeCol( eventSvc(),
"/Event/Recon/RecEsTimeCol" );
640 if ( aevtimeCol && aevtimeCol->size() )
642 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
643 t0_bes = ( *iter_evt )->getTest();
644 t0Sta = ( *iter_evt )->getStat();
648 log << MSG::WARNING <<
"Could not find EsTimeCol" << endmsg;
649 return StatusCode::SUCCESS;
653 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
656 log << MSG::FATAL <<
"Could not find Event Header" << endmsg;
657 return ( StatusCode::FAILURE );
659 _nEvents = eventHeader->eventNumber();
660 if (
b_tuple ) std::cout <<
"TrkReco ... processing ev# " << _nEvents << std::endl;
663 uint32_t getDigiFlag = 0;
667 MdcDigiVec mdcDigiVec = _rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
668 if ( 0 == mdcDigiVec.size() )
670 log << MSG::WARNING <<
" No hits in MdcDigiVec" << endmsg;
671 return StatusCode::SUCCESS;
673 MdcDigiVec::iterator iter1 = mdcDigiVec.begin();
674 MC_DIGI_SIZE = mdcDigiVec.size();
684 for ( ; iter1 != mdcDigiVec.end(); iter1++, digiId++ )
686 mdcId = ( *iter1 )->identify();
689 if (
b_goodTrk &&
b_tuple ) havedigi[layerId][wireId] = ( *iter1 )->getTrackIndex();
694 mhit.
geo = _mdcGeomSvc->Wire( layerId, wireId );
701 _trackManager.sett0bes( t0_bes );
702 mhit.
adc = ( *iter1 )->getChargeChannel();
703 double timewalk = _mdcCalibFunSvc->getTimeWalk( layerId, mhit.
adc );
704 double T0 = _mdcCalibFunSvc->getT0( layerId, wireId );
705 double drifttime = mhit.
tdc - tof - timewalk - T0;
706 double dist2 = _mdcCalibFunSvc->driftTimeToDist( drifttime, layerId, wireId, 2, 0 );
707 mhit.
erddl = _mdcCalibFunSvc->getSigma( layerId, 2, dist2, 0.0, 0.0, 0.0, mhit.
adc );
708 mhit.
ddl = dist2 / 10.;
718 mhit.
stat = mhit.
stat |= 1073741824;
725 t10_drift = mhit.
ddl;
726 t10_dDrift = mhit.
erddl;
728 t10_localId = wireId;
733 unsigned nT0Reset = 0;
736 if ( mdcDigiVec.size() > 2000 )
738 log << MSG::WARNING <<
" Too many hits in MdcDigiVec" << endmsg;
739 return StatusCode::SUCCESS;
752 _allHits[2].append( _allHits[0] );
753 _allHits[2].append( _allHits[1] );
758 log << MSG::ERROR <<
"Unable to retrieve RecMdcTrackCol" << endmsg;
759 return StatusCode::FAILURE;
763 log << MSG::DEBUG <<
"RecMdcTrackCol retrieved of size " << mdcTracks->size() << endmsg;
765 for ( RecMdcTrackCol::iterator it = mdcTracks->begin(); it != mdcTracks->end(); it++ )
770 HitRefVec gothits = ( *it )->getVecHits();
771 HitRefVec::iterator it_gothit = gothits.begin();
772 unsigned stat = ( *it )->stat();
774 for ( ; it_gothit != gothits.end(); it_gothit++ )
776 for (
int i = 0; i < _allHits[2].length(); i++ )
778 int lyrraw = _allHits[2][i]->wire()->layerId();
779 int wireraw = _allHits[2][i]->wire()->localId();
780 int g_layer =
MdcID::layer( ( *it_gothit )->getMdcId() );
781 int g_wire =
MdcID::wire( ( *it_gothit )->getMdcId() );
782 if ( lyrraw == g_layer && g_wire == wireraw )
785 t1->
append( *_allHits[2][i] );
791 int err = _rkfitter.fit( *rr );
792 int nhits = rr->
links().length();
795 if ( nhits <= 10 ) nmax = 0;
796 if ( nhits > 10 ) nmax = (int)nhit * 0.3;
797 for (
int ii = 0; ii < nmax; ii++ )
801 if ( ndrop ) err = _rkfitter.fit( *rr );
804 if ( err == -2 ) counter++;
809 for (
int i = 0; i < 43; i++ ) { err = _rkfitter.fit( *tt, 0, i ); }
815 rktracks.append( *
t );
816 t->setFinderType( 100 + stat );
825 t->setFinderType( 100 + stat );
826 rktracks.append( *
t );
836 _trackManager.append( rktracks );
837 IDataManagerSvc* dataManSvc;
838 DataObject* aTrackCol;
839 DataObject* aRecHitCol;
842 dataManSvc =
dynamic_cast<IDataManagerSvc*
>( eventSvc().get() );
843 eventSvc()->findObject(
"/Event/Recon/RecMdcTrackCol", aTrackCol );
846 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcTrackCol" );
847 eventSvc()->unregisterObject(
"/Event/Recon/RecMdcTrackCol" );
849 eventSvc()->findObject(
"/Event/Recon/RecMdcHitCol", aRecHitCol );
852 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcHitCol" );
853 eventSvc()->unregisterObject(
"/Event/Recon/RecMdcHitCol" );
856 DataObject* aReconEvent;
857 eventSvc()->findObject(
"/Event/Recon", aReconEvent );
861 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon", recevt );
862 if ( sc != StatusCode::SUCCESS )
864 log << MSG::FATAL <<
"Could not register ReconEvent" << endmsg;
865 return ( StatusCode::FAILURE );
869 eventSvc()->findObject(
"/Event/Recon/RecMdcTrackCol", aTrackCol );
870 if ( aTrackCol ) { trkcol =
dynamic_cast<RecMdcTrackCol*
>( aTrackCol ); }
875 if ( !sc.isSuccess() )
877 log << MSG::FATAL <<
" Could not register RecMdcTrack collection" << endmsg;
878 return StatusCode::FAILURE;
882 eventSvc()->findObject(
"/Event/Recon/RecMdcHitCol", aRecHitCol );
883 if ( aRecHitCol ) { hitcol =
dynamic_cast<RecMdcHitCol*
>( aRecHitCol ); }
888 if ( !sc.isSuccess() )
890 log << MSG::FATAL <<
" Could not register RecMdcHit collection" << endmsg;
891 return StatusCode::FAILURE;
903 if (
b_tuple ) t3_t0Rec = _trackManager.paraT0();
905 for (
unsigned i = 0; i < 3; i++ )
907 if ( i == 2 ) HepAListDeleteAll( _allHits[i] );
908 else _allHits[i].removeAll();
911 rktracks.removeAll();
926 return StatusCode::SUCCESS;
929void TrkReco::mcInformation(
void ) {
936 unsigned nTrk = allTracks.length();
937 unsigned* N = (
unsigned*)malloc( nHep *
sizeof(
unsigned ) );
938 for (
unsigned i = 0; i < nHep; i++ ) N[i] = 0;
941 for (
unsigned i = 0; i < nTrk; i++ )
947 _mcTracks.append( mc );
948 allTracks[i]->_mc = mc;
952 if ( mc->
hepId() != -1 )
957 for (
unsigned i = 0; i < nHep; i++ )
961 for (
unsigned j = 0; j < nTrk; j++ )
962 if ( allTracks[j]->_mc->hepId() == i ) allTracks[j]->_mc->_quality +=
TTrackUnique;
967 for (
unsigned i = 0; i < nTrk; i++ )
969 unsigned& quality = allTracks[i]->_mc->_quality;
980 HepAListDeleteAll( _mcTracks );
986 _trackManager.clear();
987 _trackManager.clearTables();
992bool TrkReco::mcEvent(
void )
const {
1008void TrkReco::initPara(
void ) {
1012 declareProperty(
"mcPar",
b_mcPar = 0 );
1013 declareProperty(
"mcHit",
b_mcHit = 0 );
1014 declareProperty(
"tuple",
b_tuple = 0 );
1015 declareProperty(
"goodTrk",
b_goodTrk = 0 );
1016 declareProperty(
"timeTest",
b_timeTest = 0 );
1021 declareProperty(
"useESTime",
useESTime = 1.0 );
1039 declareProperty(
"conformalFittingFlag",
1044 declareProperty(
"conformalMinNSegments",
1051 declareProperty(
"conformalStereoSzSegmentDistance",
1055 declareProperty(
"doConformalFinderStereo",
1067 declareProperty(
"doMerge",
b_doMerge = 0 );
1071 declareProperty(
"sortMode",
b_sortMode = 0 );
1072 declareProperty(
"test",
b_test = 0 );
1077 declareProperty(
"dropHot",
m_dropHot = 0 );
1084 declareProperty(
"min_segment",
min_segment = 5 );
1085 declareProperty(
"min_salvage",
min_salvage = 10 );
1104 declareProperty(
"merge_exe",
merge_exe = 1 );
1105 declareProperty(
"merge_ratio",
merge_ratio = 0.1 );
1106 declareProperty(
"merge_z_diff",
merge_z_diff = 10.0 );
1115 declareProperty(
"z_cut",
z_cut = 50.0 );
1127 declareProperty(
"ULTIMATE_MIN_RADIUS_OF_STRANGE_TRACK",
1132void TrkReco::InitTuple(
void ) {
1133 m_tuple =
ntupleSvc()->book(
"FILE101/rec3D", CLID_ColumnWiseTuple,
"MdcRecEvent" );
1134 m_tuple->addItem(
"mc_phi", t_mcphi );
1135 m_tuple->addItem(
"mc_theta", t_mctheta );
1136 m_tuple->addItem(
"mc_ptot", t_mcptot );
1137 m_tuple->addItem(
"mc_pt", t_mcpt );
1138 m_tuple->addItem(
"mc_pz", t_mcpz );
1139 m_tuple->addItem(
"mc_t0", t_mct0 );
1140 m_tuple->addItem(
"nDigi", t_nDigi );
1142 m_tuple->addItem(
"dr", t_dr );
1143 m_tuple->addItem(
"dz", t_dz );
1144 m_tuple->addItem(
"pt", t_pt );
1145 m_tuple->addItem(
"ptot", t_ptot );
1146 m_tuple->addItem(
"tanlmd", t_tanlmd );
1147 m_tuple->addItem(
"phi", t_phi );
1148 m_tuple->addItem(
"radius", t_radius );
1149 m_tuple->addItem(
"chi2", t_chi2 );
1150 m_tuple->addItem(
"nHits", t_nHits );
1151 m_tuple->addItem(
"nCores", t_nCores );
1152 m_tuple->addItem(
"nSegs", t_nSegs );
1153 m_tuple->addItem(
"ndf", t_ndf );
1155 m_tuple->addItem(
"dpt", t_dpt );
1156 m_tuple->addItem(
"dptot", t_dptot );
1157 m_tuple->addItem(
"dlmd", t_dlmd );
1158 m_tuple->addItem(
"dphi", t_dphi );
1160 m_tuple->addItem(
"t0", t_t0 );
1161 m_tuple->addItem(
"t0_sta", t0_sta );
1163 m_tuple->addItem(
"evtNo", t_evtNo );
1164 m_tuple->addItem(
"length", t_length );
1165 m_tuple->addItem(
"length2", t_length2 );
1167 m_tuple->addItem(
"gd_theta", t_good_theta );
1168 m_tuple->addItem(
"gd_nLayers", t_gdNLayers );
1169 m_tuple->addItem(
"mc_nLayers", t_mcNLayers );
1170 m_tuple->addItem(
"best_nLayers", t_bestNLayers );
1171 m_tuple->addItem(
"best_mc_nLayers", t_bestMcNLayers );
1173 m_tuple3 =
ntupleSvc()->book(
"FILE101/raw", CLID_ColumnWiseTuple,
"Raw Data" );
1174 m_tuple3->addItem(
"mc_t0", t3_mct0 );
1175 m_tuple3->addItem(
"mc_theta", t3_mctheta );
1176 m_tuple3->addItem(
"mc_phi", t3_mcphi );
1177 m_tuple3->addItem(
"mc_ptot", t3_mcptot );
1178 m_tuple3->addItem(
"mc_pt", t3_mcpt );
1179 m_tuple3->addItem(
"mc_pid", t3_mcpid );
1180 m_tuple3->addItem(
"evtNo", t3_evtNo );
1182 m_tuple31 =
ntupleSvc()->book(
"FILE101/rawEvt", CLID_ColumnWiseTuple,
"Raw Data" );
1183 m_tuple31->addItem(
"nDigi", t3_nDigi );
1184 m_tuple31->addItem(
"goodLength", t3_goodLength );
1185 m_tuple31->addItem(
"length", t3_length );
1186 m_tuple31->addItem(
"t0_rec", t3_t0Rec );
1187 m_tuple31->addItem(
"t0", t3_t0 );
1188 m_tuple31->addItem(
"t0_sta", t3_t0Sta );
1189 m_tuple31->addItem(
"finalLength", t3_finalLength );
1191 m_tuple31->addItem(
"mc_theta", t3_mctheta );
1192 m_tuple31->addItem(
"mc_ptot", t3_mcptot );
1193 m_tuple31->addItem(
"mc_pt", t3_mcpt );
1194 m_tuple31->addItem(
"evtNo", t3_evtNo );
1196 m_tuple2 =
ntupleSvc()->book(
"FILE101/rec2D", CLID_ColumnWiseTuple,
"MdcRecEvent 2D" );
1197 m_tuple2->addItem(
"mc_theta", t2_mctheta );
1198 m_tuple2->addItem(
"mc_pt", t2_mcpt );
1199 m_tuple2->addItem(
"nDigi", t2_nDigi );
1200 m_tuple2->addItem(
"nHits", t2_nHits );
1201 m_tuple2->addItem(
"nSegs", t2_nSegs );
1202 m_tuple2->addItem(
"chi2", t2_chi2 );
1203 m_tuple2->addItem(
"evtNo", t2_evtNo );
1204 m_tuple2->addItem(
"ndf", t2_ndf );
1205 m_tuple2->addItem(
"length", t2_length );
1206 m_tuple2->addItem(
"length2", t2_length2 );
1207 m_tuple2->addItem(
"radius", t2_radius );
1209 m_tuple4 =
ntupleSvc()->book(
"FILE101/hit", CLID_ColumnWiseTuple,
"MdcRecEvent Hits" );
1210 m_tuple4->addItem(
"d_cal", t4_Dist );
1211 m_tuple4->addItem(
"d_meas", t4_drift );
1212 m_tuple4->addItem(
"e_meas", t4_dDrift );
1213 m_tuple4->addItem(
"mc_drift", t4_mcDrift );
1214 m_tuple4->addItem(
"mcLR", t4_mcLR );
1215 m_tuple4->addItem(
"pull", t4_pull );
1216 m_tuple4->addItem(
"lyrId", t4_lyrId );
1217 m_tuple4->addItem(
"localId", t4_localId );
1218 m_tuple4->addItem(
"LR", t4_LR );
1219 m_tuple4->addItem(
"tdc", t4_tdc );
1220 m_tuple4->addItem(
"z", t4_z );
1221 m_tuple4->addItem(
"bz", t4_bz );
1222 m_tuple4->addItem(
"fz", t4_fz );
1223 m_tuple4->addItem(
"fy", t4_fy );
1224 m_tuple4->addItem(
"phi", t4_phi );
1225 m_tuple4->addItem(
"nHits", t4_nHits );
1227 m_tuple5 =
ntupleSvc()->book(
"FILE101/char", CLID_ColumnWiseTuple,
"MdcRecEvent Charge" );
1228 m_tuple5->addItem(
"ptotPos", t5_ptotPos );
1229 m_tuple5->addItem(
"ptotNeg", t5_ptotNeg );
1230 m_tuple5->addItem(
"drPos", t5_drPos );
1231 m_tuple5->addItem(
"drNeg", t5_drNeg );
1232 m_tuple5->addItem(
"dzPos", t5_dzPos );
1233 m_tuple5->addItem(
"dzNeg", t5_dzNeg );
1235 m_tuple6 =
ntupleSvc()->book(
"FILE101/urec", CLID_ColumnWiseTuple,
"MdcRecEvent urec" );
1236 m_tuple6->addItem(
"length2", u_length2 );
1237 m_tuple6->addItem(
"mc_ptot", u_mcptot );
1238 m_tuple6->addItem(
"mc_pt", u_mcpt );
1239 m_tuple6->addItem(
"mc_theta", u_mctheta );
1240 m_tuple6->addItem(
"nDigi", u_nDigi );
1241 m_tuple6->addItem(
"evtNo", u_evtNo );
1242 m_tuple6->addItem(
"mc_t0", u_mct0 );
1243 m_tuple6->addItem(
"t0", ut_t0 );
1244 m_tuple6->addItem(
"t0_sta", ut0_sta );
1248 m_tuple7 =
ntupleSvc()->book(
"FILE101/time", CLID_ColumnWiseTuple,
"MdcRecEvent time" );
1249 m_tuple7->addItem(
"time", ti_eventTime );
1250 m_tuple7->addItem(
"recNum", ti_recTrkNum );
1251 m_tuple7->addItem(
"evtNo", ti_evtNo );
1252 m_tuple7->addItem(
"nHits", ti_nHits );
1253 m_tuple7->addItem(
"nDigi", ti_nDigi );
1256 m_tuple9 =
ntupleSvc()->book(
"FILE101/seg", CLID_ColumnWiseTuple,
"MdcRecEvent segments" );
1257 m_tuple9->addItem(
"times", t9_times );
1258 m_tuple9->addItem(
"nLinks", t9_nLinks );
1259 m_tuple9->addItem(
"nUsed", t9_nUsed );
1260 m_tuple9->addItem(
"nSL", t9_nSL );
1261 m_tuple9->addItem(
"mctheta", t9_mctheta );
1264 ntupleSvc()->book(
"FILE101/rawHit", CLID_ColumnWiseTuple,
"MdcRecEvent mchitCOL" );
1265 m_tuple10->addItem(
"tdc", t10_tdc );
1266 m_tuple10->addItem(
"adc", t10_adc );
1267 m_tuple10->addItem(
"Drift", t10_drift );
1268 m_tuple10->addItem(
"dDrift", t10_dDrift );
1269 m_tuple10->addItem(
"lyrId", t10_lyrId );
1270 m_tuple10->addItem(
"localId", t10_localId );
1273void TrkReco::FillTuple(
void ) {
1274 MsgStream log(
msgSvc(), name() );
1275 log << MSG::INFO <<
"fill Tuple()" << endmsg;
1279 AList<TTrack> tracks2D;
1280 tracks = _trackManager.tracks();
1281 tracks2D = _trackManager.tracks2D();
1284 if (
tracks.length() == 0 )
1285 cout <<
"zslength: 3D length=0, and the 2D length is" << tracks2D.length() << endl;
1291 ti_eventTime = m_timer[1]->elapsed();
1292 ti_nDigi = MC_DIGI_SIZE;
1293 ti_recTrkNum =
tracks.length();
1294 ti_evtNo = _nEvents;
1295 for (
unsigned i = 0; i < ti_recTrkNum; ++i ) ti_nHits +=
tracks[i]->nLinks();
1300 CLHEP::Hep3Vector MC_TRACK_VEC;
1301 CLHEP::HepLorentzVector MC_TRACK_LRZVEC;
1303 double MC_EVENT_TIME;
1310 SmartDataPtr<Event::McParticleCol> mcParticleCol( eventSvc(),
"/Event/MC/McParticleCol" );
1311 if ( mcParticleCol )
1313 Event::McParticleCol::iterator iter_mc = mcParticleCol->begin();
1315 for ( ; iter_mc != mcParticleCol->end(); iter_mc++, digiId++ )
1317 if ( ( *iter_mc )->statusFlags() == 8320 || ( *iter_mc )->statusFlags() == 128 )
1319 MC_EVENT_TIME = ( *iter_mc )->initialFourMomentum().t();
1324 iter_mc = mcParticleCol->begin();
1325 MC_TRACK_LRZVEC = ( *iter_mc )->initialFourMomentum();
1327 MC_TRACK_VEC = ( *iter_mc )->initialFourMomentum().vect();
1328 MC_TRACK_NUM = mcParticleCol->size();
1331 iter_mc = mcParticleCol->begin();
1333 for ( ; iter_mc != mcParticleCol->end(); iter_mc++, digiId++ )
1335 log << MSG::INFO <<
"MDC digit No: " << digiId << endmsg;
1336 log << MSG::INFO <<
" particleId = " << ( *iter_mc )->particleProperty()
1337 <<
" theta = " << ( *iter_mc )->initialFourMomentum().theta()
1338 <<
" phi= " << ( *iter_mc )->initialFourMomentum().phi()
1339 <<
" px= " << ( *iter_mc )->initialFourMomentum().px()
1340 <<
" py= " << ( *iter_mc )->initialFourMomentum().py()
1341 <<
" pz= " << ( *iter_mc )->initialFourMomentum().pz() << endmsg;
1345 iter_mc = mcParticleCol->begin();
1346 for ( ; iter_mc != mcParticleCol->end(); iter_mc++, digiId++ )
1348 CLHEP::HepLorentzVector LRZVEC = ( *iter_mc )->initialFourMomentum();
1349 CLHEP::Hep3Vector
VEC = ( *iter_mc )->initialFourMomentum().vect();
1352 t3_mctheta = LRZVEC.theta();
1353 t3_mcphi =
VEC.phi();
1354 t3_mcptot =
VEC.mag() / 1000.;
1355 t3_mcpt =
VEC.perp() / 1000.;
1356 t3_mct0 = ( *iter_mc )->initialFourMomentum().t();
1357 t3_mcpid = ( *iter_mc )->particleProperty();
1358 t3_evtNo = _nEvents;
1359 if ( ( t3_mcpid == 211 || t3_mcpid == -211 || t3_mcpid == 321 ) &&
1360 fabs(
cos( t3_mctheta ) ) < 0.93 )
1368 if (
tracks.length() == 0 )
1370 u_length2 = tracks2D.length();
1371 u_mct0 = MC_EVENT_TIME;
1372 u_mcptot = MC_TRACK_VEC.mag() / 1000.;
1373 u_mcpt = MC_TRACK_VEC.perp() / 1000.;
1374 u_mctheta = MC_TRACK_LRZVEC.theta();
1375 u_nDigi = MC_DIGI_SIZE;
1385 int flagi = -1, flagj = -1;
1388 for (
unsigned i = 0; i <
tracks.length(); i++ )
1390 if (
tracks.length() < 2 )
break;
1391 if (
tracks[i]->charge() > 0 )
1393 ppp1 =
tracks[i]->p().unit();
1394 for (
unsigned j = 0; j <
tracks.length(); j++ )
1396 if (
tracks[j]->charge() < 0 )
1398 ppp2 =
tracks[j]->p().unit();
1399 pppdDot = ppp1.dot( ppp2 );
1400 if ( pppdDot < dDot )
1410 if ( flagi != -1 && flagj != -1 && dDot < 0 )
1412 t5_ptotPos =
tracks[flagi]->ptot();
1413 t5_ptotNeg =
tracks[flagj]->ptot();
1414 t5_drPos =
tracks[flagi]->helix().dr();
1415 t5_drNeg =
tracks[flagj]->helix().dr();
1416 t5_dzPos =
tracks[flagi]->helix().dz();
1417 t5_dzNeg =
tracks[flagj]->helix().dz();
1422 for (
unsigned i = 0; i <
tracks.length(); i++ )
1424 for (
unsigned k = 0; k <
tracks[i]->links().length(); k++ )
1426 t4_Dist =
tracks[i]->links()[k]->distance();
1427 t4_drift =
tracks[i]->links()[k]->drift();
1428 t4_dDrift =
tracks[i]->links()[k]->dDrift();
1429 t4_pull =
tracks[i]->links()[k]->pull();
1431 t4_LR =
tracks[i]->links()[k]->leftRight();
1432 if ( t4_LR == 0 ) t4_LR = -1;
1433 t4_lyrId =
tracks[i]->links()[k]->wire()->layerId();
1434 t4_localId =
tracks[i]->links()[k]->wire()->localId();
1435 t4_tdc =
tracks[i]->links()[k]->hit()->reccdc()->tdc;
1436 t4_z =
tracks[i]->links()[k]->positionOnTrack().z();
1437 t4_bz =
tracks[i]->links()[k]->wire()->backwardPosition().z();
1438 t4_fz =
tracks[i]->links()[k]->wire()->forwardPosition().z();
1439 t4_fy =
tracks[i]->links()[k]->wire()->forwardPosition().y();
1440 t4_nHits =
tracks[i]->links().length();
1441 unsigned lyrID =
tracks[i]->links()[k]->wire()->layerId();
1442 float phi0 = _cdc->layer( lyrID )->offset();
1443 int nWir = (int)_cdc->layer( lyrID )->nWires();
1444 t4_phi = phi0 + t4_localId * 2 *
pi / nWir;
1445 if ( t4_phi < 0 ) t4_phi += 2 *
pi;
1449 SmartDataPtr<Event::MdcMcHitCol> mcMdcMcHitCol( eventSvc(),
"/Event/MC/MdcMcHitCol" );
1450 if ( mcMdcMcHitCol )
1452 Event::MdcMcHitCol::iterator iter_mchit1 = mcMdcMcHitCol->begin();
1454 for ( ; iter_mchit1 != mcMdcMcHitCol->end(); iter_mchit1++, digiId++ )
1456 const Identifier ident = ( *iter_mchit1 )->identify();
1460 t4_mcDrift = ( *iter_mchit1 )->getDriftDistance();
1461 t4_mcLR = ( *iter_mchit1 )->getPositionFlag();
1462 if ( t4_mcLR == 0 ) t4_mcLR = -1;
1474 unsigned segSize =
tracks[i]->segments().length();
1475 for (
unsigned kk = 0; kk < segSize; ++kk )
1477 unsigned segLength =
tracks[i]->segments()[kk]->links().length();
1478 AList<TMLink> ll =
tracks[i]->segments()[kk]->links();
1480 for (
unsigned nn = 0; nn < segLength; ++nn )
1482 double tmpX = ll[nn]->positionD().x();
1483 double tmpY = ll[nn]->positionD().y();
1484 double tmpA =
tracks[i]->segments()[kk]->lineTsf().x();
1485 double tmpB =
tracks[i]->segments()[kk]->lineTsf().y();
1486 double tmpC =
tracks[i]->segments()[kk]->lineTsf().z();
1488 fabs( tmpA * tmpX + tmpB * tmpY + tmpC ) / sqrt( tmpA * tmpA + tmpB * tmpB );
1489 double idealDis = maxdDistance( ll[nn] );
1490 if ( fabs( dis - ll[nn]->cDrift() ) / idealDis < 0.001 && nSmall < 2 )
1495 t9_times += fabs( dis - ll[nn]->cDrift() ) / idealDis;
1497 t9_nSL = ll[0]->wire()->superLayerId();
1498 t9_nLinks = segLength;
1499 t9_mctheta = MC_TRACK_LRZVEC.theta();
1500 t9_times = t9_times / ( t9_nLinks - nSmall );
1504 t_mcphi = MC_TRACK_VEC.phi();
1505 t_mctheta = MC_TRACK_LRZVEC.theta();
1506 t_mcptot = MC_TRACK_VEC.mag() / 1000.;
1507 t_mcpt = MC_TRACK_VEC.perp() / 1000.;
1508 t_mcpz = MC_TRACK_LRZVEC.pz() / 1000.;
1509 t_mct0 = MC_EVENT_TIME;
1510 t_nDigi = MC_DIGI_SIZE;
1512 t_dr =
tracks[i]->helix().dr();
1513 t_dz =
tracks[i]->helix().dz();
1515 t_ptot =
tracks[i]->ptot();
1516 t_tanlmd =
tracks[i]->helix().tanl();
1517 t_phi =
tracks[i]->helix().phi0();
1518 t_chi2 =
tracks[i]->chi2();
1519 t_nHits =
tracks[i]->nLinks();
1520 t_nCores =
tracks[i]->nCores();
1521 t_nSegs =
tracks[i]->segments().length();
1522 t_ndf =
tracks[i]->ndf();
1523 t_radius =
tracks[i]->radius();
1525 t_length =
tracks.length();
1526 t_length2 = tracks2D.length();
1528 t_dpt =
tracks[i]->pt() - t_mcpt;
1529 t_dptot =
tracks[i]->ptot() - t_mcptot;
1530 t_dlmd = atan(
tracks[i]->helix().tanl() ) - (
pi / 2 - t_mctheta );
1531 t_dphi =
tracks[i]->helix().phi0() - t_mcphi;
1540 unsigned mcTrackSize = MC_TRACK_NUM;
1541 unsigned recTrackSize =
tracks.length();
1542 const unsigned matchSize = 20;
1545 int mLayers[matchSize];
1546 for (
int ii = 0; ii < matchSize; ii++ ) mLayers[ii] = 0;
1547 for (
int jj = 0; jj < 43; ++jj )
1550 for (
unsigned kk = 0; kk < matchSize; ++kk ) tmp[kk] = 0;
1551 for (
int kk = 0; kk < 288; ++kk )
1553 if ( havedigi[jj][kk] < 0 )
continue;
1554 tmp[havedigi[jj][kk]] = 1;
1556 for (
int kk = 0; kk < matchSize; ++kk )
1557 if ( tmp[kk] == 1 ) ++mLayers[kk];
1560 unsigned trackSize =
tracks[i]->nLinks();
1562 int nLayers[matchSize];
1563 for (
int j = 0; j < 43; ++j ) trkIndex[j] = -99;
1564 for (
int j = 0; j < matchSize; ++j ) nLayers[j] = 0;
1566 for (
int j = 0; j < trackSize; ++j )
1568 unsigned lId =
tracks[i]->links()[j]->wire()->layerId();
1569 unsigned loId =
tracks[i]->links()[j]->wire()->localId();
1570 if ( havedigi[lId][loId] >= 0 ) trkIndex[lId] = havedigi[lId][loId];
1572 for (
int j = 0; j < 43; ++j )
1573 if ( trkIndex[j] >= 0 ) ++nLayers[trkIndex[j]];
1575 for (
int j = 0; j < matchSize; ++j )
1578 if ( nLayers[j] == 0 )
continue;
1579 if ( (
float)nLayers[j] / (
float)mLayers[j] > 0.51 )
1581 t_gdNLayers = nLayers[j];
1582 t_mcNLayers = mLayers[j];
1583 t_good_theta = MC_TRACK_LRZVEC.theta();
1588 if ( t_good_theta == 0. )
1592 for (
int j = 0; j < matchSize; ++j )
1594 if ( nLayers[j] == 0 )
continue;
1595 if ( nLayers[j] > tmpLayers )
1597 tmpLayers = nLayers[j];
1603 t_bestNLayers = nLayers[tmpi];
1604 t_bestMcNLayers = mLayers[tmpi];
1609 t_bestMcNLayers = -1;
1615 t_bestMcNLayers = -2;
1622 t3_mctheta = MC_TRACK_LRZVEC.theta();
1623 t3_mcptot = MC_TRACK_VEC.mag() / 1000.;
1624 t3_mcpt = MC_TRACK_VEC.perp() / 1000.;
1626 t3_nDigi = MC_DIGI_SIZE;
1629 t3_goodLength = nGood;
1630 t3_length =
tracks.length();
1631 t3_finalLength = num_par;
1634 for (
unsigned i = 0; i < tracks2D.length(); i++ )
1636 t2_mctheta = MC_TRACK_LRZVEC.theta();
1637 t2_mcpt = MC_TRACK_VEC.perp() / 1000.;
1639 t2_nDigi = MC_DIGI_SIZE;
1640 t2_nHits = tracks2D[i]->nLinks();
1641 t2_nSegs = tracks2D[i]->segments().length();
1642 t2_chi2 = tracks2D[i]->chi2();
1643 t2_ndf = tracks2D[i]->ndf();
1644 t2_radius = tracks2D[i]->radius();
1645 t2_evtNo = _nEvents;
1646 t2_length =
tracks.length();
1647 t2_length2 = tracks2D.length();
1652double TrkReco::maxdDistance(
TMLink* l )
const {
1655 double _averR[11] = { 9.7, 14.5, 22.14, 28.62, 35.1, 42.39,
1656 48.87, 55.35, 61.83, 69.12, 74.79 };
1657 double _averR2[43] = {
1658 7.885, 9.07, 10.29, 11.525, 12.72, 13.875, 15.01, 16.16, 19.7, 21.3, 22.955,
1659 24.555, 26.215, 27.82, 29.465, 31.06, 32.69, 34.265, 35.875, 37.455, 39.975, 41.52,
1660 43.12, 44.76, 46.415, 48.02, 49.685, 51.37, 53.035, 54.595, 56.215, 57.855, 59.475,
1661 60.995, 62.565, 64.165, 66.68, 68.285, 69.915, 71.57, 73.21, 74.76, 76.345 };
1662 double radius = _averR2[lId];
1663 const double singleSigma = l->
dDrift();
1664 return 2 * singleSigma / ( radius * radius );
HepGeom::Vector3D< double > HepVector3D
DECLARE_COMPONENT(BesBdkRc)
std::vector< MdcDigi * > MdcDigiVec
double cos(const BesAngle a)
ObjectVector< RecMdcHit > RecMdcHitCol
ObjectVector< RecMdcTrack > RecMdcTrackCol
SmartRefVector< RecMdcHit > HitRefVec
std::vector< double > VEC
const HepPoint3D ORIGIN
Constants.
#define WireHitFindingValid
float TrkRecoHelixFitterChisqMax
float TrkRecoHelixFitterChisqMax
void clear()
Reset to invalid state.
double Radius(void) const
MdcGeoLayer * Lyr(void) const
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
static int wire(const Identifier &id)
static vector< MdcRec_wirhit > * getMdcRecWirhitCol(void)
static double MdcTime(int timeChannel)
unsigned layerId(void) const
returns layer id.
unsigned superLayerId(void) const
returns super layer id.
void fastClear(void)
clears TMDC information.
float fudgeFactor(void) const
returns fudge factor for drift time error.
static TMDC * getTMDC(void)
int debugLevel(void) const
returns debug level.
A class to relate TMDCWireHit and TTrack objects.
float dDrift(void) const
returns/sets drift distance error.
const TMDCWire *const wire(void) const
returns a pointer to a wire.
A class to represent a track in tracking.
virtual void removeLinks(void)
void append(TMLink &)
appends a TMLink.
const AList< TMLink > & links(unsigned mask=0) const
static const AList< TTrackHEP > & list(void)
returns a list of TTrackHEP's.
A class to have MC information of TTrack.
int hepId(void) const
returns HEP ID.
void update(void)
updates information.
bool charge(void) const
returns charge matching.
const AList< TTrack > & tracksFinal(void) const
returns a list of tracks writen to MdcRec_trk.
A class to represent a track in tracking.
int b_conformalSalvageLoadWidth
float b_conformalStereoZ3
double selector_replace_dz
double good_distance_for_salvage
int b_doConformalFastFinder
double range_for_stereo_last2d_search
int b_conformalFittingFlag
int b_doConformalFinderStereo
double MIN_RADIUS_OF_STRANGE_TRACK
int superlayer_for_stereo_search
double z_diff_for_last_attend
float b_conformalStereoSzLinkDistance
int b_conformalFittingCorrections
float b_helixFitterChisqMax
double bad_distance_for_salvage
int b_conformalMinNLinksForSegment
double range_for_stereo_search
float b_conformalStereoZ4
double selector_max_sigma
double minimum_2DTrackLength
float b_conformalMaxSigma
double minimum_closeHitsLength
float b_conformalStereoChisq3
double ULTIMATE_MIN_RADIUS_OF_STRANGE_TRACK
double minimum_seedLength
void fastClear(void)
clears TMDC information.
int b_conformalStereoMode
double selector_strange_pz
TrkReco(const std::string &name, ISvcLocator *pSvcLocator)
returns TrkReco.
int b_conformalMinNSegments
const AList< TTrack > & tracks(void) const
returns a list of reconstructed tracks.
void clear(void)
clears all TMDC information.
double trace2d_first_distance
int b_conformalStereoLoadWidth
float b_conformalStereoSzSegmentDistance
double minimum_3DTrackLength
int b_doConformalSlowFinder
float b_conformalFraction
int b_RungeKuttaCorrection
double range_for_axial_last2d_search
float b_conformalStereoMaxSigma
int b_conformalPerfectSegmentFinding
double range_for_axial_search
float b_conformalStereoChisq4
void disp_stat(const char *)
initializes TrkReco.
double selector_max_impact
int b_doConformalFinderCosmic
_EXTERN_ std::string RecMdcTrackCol
_EXTERN_ std::string RecMdcHitCol