15# if defined( __EXTENSIONS__ )
18# define __EXTENSIONS__
22#elif defined( __GNUC__ )
23# if defined( _XOPEN_SOURCE )
32#define TTRACKMANAGER_INLINE_DEFINE_HERE
40#include "MdcTables/MdcTables.h"
41#include "MdcTables/TrkTables.h"
42#include "TrkReco/TMDCWireHit.h"
43#include "TrkReco/TMDCWireHitMC.h"
44#include "TrkReco/TTrack.h"
45#include "TrkReco/TTrackHEP.h"
46#include "TrkReco/TTrackMC.h"
47#include "TrkReco/TTrackManager.h"
50#include "GaudiKernel/Bootstrap.h"
51#include "GaudiKernel/IDataManagerSvc.h"
52#include "GaudiKernel/IDataProviderSvc.h"
53#include "GaudiKernel/IMessageSvc.h"
54#include "GaudiKernel/ISvcLocator.h"
55#include "GaudiKernel/MsgStream.h"
56#include "GaudiKernel/PropertyMgr.h"
57#include "GaudiKernel/SmartDataPtr.h"
58#include "GaudiKernel/StatusCode.h"
60#include "EventModel/EventModel.h"
61#include "GaudiKernel/ContainedObject.h"
62#include "GaudiKernel/ObjectVector.h"
63#include "GaudiKernel/SmartRef.h"
64#include "GaudiKernel/SmartRefVector.h"
66#include "EvTimeEvent/RecEsTime.h"
68#include "Identifier/Identifier.h"
69#include "Identifier/MdcID.h"
77 , _sigmaCurlerMergeTest( sqrt( 100. ) )
78 , _nCurlerMergeTest( 4 )
80 , _fitter(
"TTrackManager Fitter" )
81 , _cFitter(
"TTrackManager 2D Fitter" )
83 , m_pmgnIMF( nullptr )
84 , m_rawDataProviderSvc( nullptr ) {}
91 bool def = ( msg ==
"" ) ?
true :
false;
130 if ( def || msg.find(
"eventSummary" ) != std::string::npos ||
131 msg.find(
"detail" ) != std::string::npos )
133 std::cout << pre <<
"tracks reconstructed : " << _tracksAll.length() << std::endl;
134 std::cout << pre <<
"good tracks : " << _tracks.length() << std::endl;
135 std::cout << pre <<
"2D tracks : " << _tracks2D.length() << std::endl;
136 std::cout << pre <<
"Track list:" << std::endl;
138 std::string tab = pre;
139 std::string spc =
" ";
140 for (
unsigned i = 0; i < _tracksAll.length(); i++ )
142 std::cout << tab <<
TrackDump( *_tracksAll[i] ) << std::endl;
143 if ( msg.find(
"hits" ) != std::string::npos ||
144 msg.find(
"detail" ) != std::string::npos )
145 Dump( _tracksAll[i]->links(),
"hits sort flag" );
161 double x =
t->helix().center().x() - a->xyPosition().x();
162 double y =
t->helix().center().y() - a->xyPosition().y();
163 double r = sqrt( x * x + y * y );
164 double R = fabs(
t->helix().radius() );
165 double q =
t->helix().center().x() * a->xyPosition().y() -
166 t->helix().center().y() * a->xyPosition().x();
167 double qq =
q *
t->charge();
168 if ( R - 2. < r && r < R + 2. && qq > 0. ) { a->state( a->state() |
WireHitUsed ); }
173 double x =
t->helix().center().x() -
s->xyPosition().x();
174 double y =
t->helix().center().y() -
s->xyPosition().y();
175 double r = sqrt( x * x + y * y );
176 double R = fabs(
t->helix().radius() );
177 double q =
t->helix().center().x() *
s->xyPosition().y() -
178 t->helix().center().y() *
s->xyPosition().x();
179 double qq =
q *
t->charge();
180 if ( R - 2.5 < r && r < R + 2.5 && qq > 0. ) {
s->state(
s->state() |
WireHitUsed ); }
187#ifdef TRKRECO_DEBUG_DETAIL
188 std::cout <<
name() <<
" ... salvaging" << std::endl;
189 std::cout <<
" # of given hits=" << hits.length() << std::endl;
193 unsigned nTracks = _tracks.length();
194 if ( nTracks == 0 )
return;
195 unsigned nHits = hits.length();
196 if ( nHits == 0 )
return;
199 for (
unsigned i = 0; i < nHits; i++ )
205#ifdef TRKRECO_DEBUG_DETAIL
206 std::cout <<
" checking " << h.
wire()->
name() << std::endl;
211#ifdef TRKRECO_DEBUG_DETAIL
214 std::cout <<
" no track candidate returned";
215 std::cout <<
"by TTrackManager::closest" << std::endl;
218 if ( !best )
continue;
222 link.append(
new TMLink( 0, &h ) );
234 double minDistance = MAXDOUBLE;
238 for (
unsigned i = 0; i <
n; i++ )
242 if ( err < 0 )
continue;
243 if ( minDistance >
t.distance() )
245 minDistance =
t.distance();
258 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc );
260 MsgStream log(
msgSvc,
"TrkReco" );
262 IDataProviderSvc* eventSvc = NULL;
263 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc );
266 if ( eventSvc ) { log << MSG::INFO <<
"makeTds:event Svc has been found" << endmsg; }
269 log << MSG::FATAL <<
"makeTds:Could not find eventSvc" << endmsg;
270 return StatusCode::FAILURE;
306 unsigned n = _tracks.length();
307 int nTdsTk = trkcol->size();
308 for (
int i = 0; i <
n; i++ )
312 int trackindex = i + nTdsTk;
320 HepVector m_a( 5, 0 );
321 m_a =
t->helix().a();
322 int statfinder =
t->getFinderType();
323 if (
abs( statfinder ) > 1000 && brunge ) statfinder = 103;
324 if (
abs( statfinder ) > 1000 && !brunge ) statfinder = 3;
326 if ( !brunge ) m_a[2] = -m_a[2];
327 if (
abs( m_a[1] ) > 999 ) m_a[1] = 0;
328 while ( m_a[1] < 0 ) { m_a[1] += 2 *
pi; }
329 while ( m_a[1] > 2 *
pi ) { m_a[1] -= 2 *
pi; }
331 const double x0 =
t->helix().pivot().x();
332 const double y0 =
t->helix().pivot().y();
334 const double dr = m_a[0];
335 const double phi0 = m_a[1];
336 const double kappa = m_a[2];
337 const double dz = m_a[3];
338 const double tanl = m_a[4];
340 const double Bz = -1000 * ( getPmgnIMF()->getReferField() );
341 const double alpha = 333.564095 / Bz;
343 const double cox = x0 + dr *
cos( phi0 ) -
alpha *
cos( phi0 ) / kappa;
344 const double coy = y0 + dr *
sin( phi0 ) -
alpha *
sin( phi0 ) / kappa;
346 unsigned nHits =
t->links().length();
347 unsigned nStereos = 0;
348 unsigned firstLyr = 44;
349 unsigned lastLyr = 0;
350 for (
unsigned j = 0; j < nHits; j++ )
357 HepPoint3D dir( ontrack.y() - coy, cox - ontrack.x(), 0 );
358 double pos_phi = onwire.phi();
359 double dir_phi = dir.phi();
360 while ( pos_phi >
pi ) { pos_phi -=
pi; }
361 while ( pos_phi < 0 ) { pos_phi +=
pi; }
362 while ( dir_phi >
pi ) { dir_phi -=
pi; }
363 while ( dir_phi < 0 ) { dir_phi +=
pi; }
364 double entrangle = dir_phi - pos_phi;
365 while ( entrangle >
pi / 2 ) entrangle -=
pi;
366 while ( entrangle < ( -1 ) *
pi / 2 ) entrangle +=
pi;
370 float tl =
t->helix().a()[4];
371 float f = sqrt( 1. + tl * tl );
372 float s = fabs(
t->helix().curv() ) * fabs( l->
dPhi() ) *
f;
373 float p =
f / fabs(
t->helix().a()[2] );
374 float Mass[5] = { 0.000511, 0.105, 0.140, 0.493677, 0.98327 };
375 double tof =
s / 29.98 * sqrt( 1.0 + ( Mass[imass - 1] / p ) * ( Mass[imass - 1] / p ) );
405 hitcol->push_back( hit );
407 SmartRef<RecMdcHit> refhit( hit );
408 hitrefvec.push_back( refhit );
412 if ( lastLyr < l->wire()->layerId() ) lastLyr = l->
wire()->
layerId();
415 HepSymMatrix m_ea =
t->helix().Ea();
418 for (
int ie = 0; ie < 5; ie++ )
420 for (
int je = ie; je < 5; je++ )
422 errorMat[k] = m_ea[ie][je];
430 trk->
setPx(
t->pt() * ( -
sin(
t->helix().phi0() ) ) );
431 trk->
setPy(
t->pt() *
cos(
t->helix().phi0() ) );
433 trk->
setP(
t->ptot() );
436 double theta = acos( (
t->pz() ) /
t->ptot() );
439 double poca_dr =
t->helix().dr();
440 double poca_phi0 =
t->helix().phi0();
443 pos.y() + poca_dr *
sin( poca_phi0 ), pos.z() +
t->helix().dz() );
445 trk->
setX( poca.x() );
446 trk->
setY( poca.y() );
447 trk->
setZ( poca.z() );
448 trk->
setR( sqrt( poca.x() * poca.x() + poca.y() * poca.y() ) );
471 t->approach( *last );
479 if ( !brunge ) trk->
setCharge(
int(
t->charge() ) * ( -1 ) );
485 trkcol->push_back( trk );
504 SmartDataPtr<RecMdcTrackCol> newtrkCol( eventSvc,
"/Event/Recon/RecMdcTrackCol" );
507 log << MSG::FATAL <<
"Could not find RecMdcTrackCol" << endmsg;
508 return ( StatusCode::FAILURE );
510 log << MSG::INFO <<
"Begin to check RecMdcTrackCol" << endmsg;
511 std::cout << std::fixed << std::setprecision( 6 );
512 RecMdcTrackCol::iterator iter_trk = newtrkCol->begin();
513 for ( ; iter_trk != newtrkCol->end(); iter_trk++ )
516 std::cout <<
"//==== " <<
name() <<
" print RecMdcTrack No." << tk->
trackId() <<
" :"
518 cout <<
" dr " << tk->
helix( 0 ) <<
" phi0 " << tk->
helix( 1 ) <<
" cpa " << tk->
helix( 2 )
519 <<
" z0 " << tk->
helix( 3 ) <<
" tanl " << tk->
helix( 4 ) << endl;
520 bool printTrackDetail =
true;
521 if ( printTrackDetail )
523 std::cout <<
" q " << tk->
charge() <<
" theta " << tk->
theta() <<
" phi " << tk->
phi()
524 <<
" x0 " << tk->
x() <<
" y0 " << tk->
y() <<
" z0 " << tk->
z() <<
" r0 "
526 std::cout <<
" p " << tk->
p() <<
" pt " << tk->
pxy() <<
" pxyz(" << tk->
px() <<
","
527 << tk->
py() <<
"," << tk->
pz() <<
")" << endl;
528 std::cout <<
" tkStat " << tk->
stat() <<
" chi2 " << tk->
chi2() <<
" ndof " << tk->
ndof()
529 <<
" nhit " << tk->
getNhits() <<
" nst " << tk->
nster() << endl;
530 bool printErrMat =
true;
533 std::cout <<
"errmat " << std::endl;
534 for (
int i = 0; i < 15; i++ ) { std::cout <<
" " << tk->
err( i ); }
535 std::cout <<
" " << std::endl;
539 bool printHit =
true;
542 int haveDigi[43][288];
543 bool printMcTk =
true;
546 for (
int ii = 0; ii < 43; ii++ )
548 for (
int jj = 0; jj < 43; jj++ ) { haveDigi[ii][jj] = -9999; }
550 MdcDigiVec mdcDigiVec = getRawDataProviderSvc()->getMdcDigiVec();
551 MdcDigiCol::iterator
iter = mdcDigiVec.begin();
552 std::cout <<
name() <<
"//==== " <<
name()
553 <<
" print MdcDigiVec, nDigi=" << mdcDigiVec.size() <<
" :" << std::endl;
554 for (
int iDigi = 0;
iter != mdcDigiVec.end();
iter++, iDigi++ )
558 haveDigi[l][
w] = ( *iter )->getTrackIndex();
563 std::cout <<
"nHits=" << nhits << std::endl;
565 if ( printMcTk ) cout <<
"mcTkId ";
566 cout <<
"(layer,wire,lr) stat z" << endl;
567 for (
int ii = 0; ii < nhits; ii++ )
573 if ( printMcTk ) { cout << haveDigi[layer][wire]; }
574 cout <<
" (" << layer <<
"," << wire <<
"," << tk->
getVecHits()[ii]->getFlagLR()
575 <<
") " << tk->
getVecHits()[ii]->getStat() <<
" "
576 << tk->
getVecHits()[ii]->getZhit() <<
" " << std::endl;
578 std::cout <<
" " << std::endl;
612 std::cout << std::defaultfloat;
614 return StatusCode::SUCCESS;
619 std::cout <<
"TTrackManager::saveTables ... # 3D tracks=" << _tracks.length()
620 <<
", # 2D tracks=" << _tracks2D.length() <<
", all tracks=" << _tracksAll.length()
626 unsigned n = _tracks.length();
627 unsigned*
id = (
unsigned*)malloc(
n *
sizeof(
unsigned ) );
629 memset( (
char*)
id, 0,
n *
sizeof(
unsigned ) );
630 for (
unsigned i = 0; i <
n; i++ )
635 badTracks.append( (
TTrack&)
t );
642 int err = copyTrack(
t, &r, &a );
645 badTracks.append(
t );
648 _tracksFinal.append(
t );
655 a->
stat =
t.fitting();
664 for (
unsigned i = 0; i <
n; i++ )
667#ifdef TRKRECO_DEBUG_DETAIL
668 std::cout <<
"id[" << i <<
"]=" <<
id[i] << std::endl;
670 if ( !(
id[i] ) )
continue;
671 if ( !( _tracks[i]->daughter() ) )
continue;
673 int dId = _tracks.index( _tracks[i]->daughter() );
675#ifdef TRKRECO_DEBUG_DETAIL
676 std::cout <<
" dId=" << dId;
677 if ( dId >= 0 ) std::cout <<
", id[dId]=" <<
id[dId];
678 std::cout << std::endl;
695 _tracks.remove( badTracks );
696 badTracks.removeAll();
699 n = _tracks2D.length();
700 for (
unsigned i = 0; i <
n; i++ )
707 int err = copyTrack(
t, &r, &a );
711 std::cout <<
"TTrackManager::saveTables !!! bad 2D tracks found"
712 <<
" : err=" << err << std::endl
715 badTracks.append(
t );
718 _tracksFinal.append(
t );
732 a->
stat =
t.fitting();
735 if ( ( r->
ndf == 0 ) && ( r->
chiSq > 0. ) )
737 std::cout <<
"TTrackManager::saveTables !!! chisq>0 with ndf=0." << std::endl
738 <<
" Here is a track dump"
742 if ( ( r->
ndf > 0 ) && ( r->
chiSq == 0. ) )
744 std::cout <<
"TTrackManager::saveTables !!! chisq=0 with ndf>0." << std::endl
745 <<
" Here is a track dump"
751 std::cout <<
"TTrackManager::saveTables ... ndf = 0" << std::endl
753 if ( r->
chiSq == 0. )
754 std::cout <<
"TTrackManager::saveTables ... chisq = 0" << std::endl
758 _tracks2D.remove( badTracks );
762 _s->_nTracks += _tracks.length();
763 _s->_nTracksAll += _tracksAll.length();
764 _s->_nTracks2D += _tracks2D.length();
765 _s->_nTracksFinal += _tracksFinal.length();
769 unsigned n = _tracksFinal.length();
770 for (
unsigned i = 0; i <
n; i++ )
772 const TTrack&
t = *_tracksFinal[i];
782 unsigned nHits = hits.length();
783 for (
unsigned j = 0; j < nHits; j++ )
816 unsigned n = _tracksAll.length();
818 for (
unsigned i = 0; i <
n; i++ )
820 if ( _tracksAll[i]->nLinks() ) _tracksAll[i]->movePivot();
827 HepAListDeleteAll( _tracksAll );
829 _tracks2D.removeAll();
830 _tracksFinal.removeAll();
831 HepAListDeleteAll( _associateHits );
832 static bool first =
true;
847 if ( _debugLevel > 1 )
849 std::cout <<
name() <<
" ... finishing" << std::endl;
851 unsigned n = _tracks.length();
852 for (
unsigned i = 0; i <
n; i++ )
856 std::cout <<
" " <<
t.name() << std::endl;
857 t.dump(
"hits mc track flag sort",
" " );
863 _tracksAll.append( list );
864 _tracks.append( selectGoodTracks( list ) );
869 _tracksAll.append( list );
870 _tracks2D.append( selectGoodTracks( list,
true ) );
876#ifdef TRKRECO_DEBUG_DETAIL
877 std::cout <<
name() <<
" ... refitting" << std::endl;
879 unsigned n = _tracks.length();
881 for (
unsigned i = 0; i <
n; i++ )
885 err = _fitter.fit(
t );
889#ifdef TRKRECO_DEBUG_DETAIL
890 std::cout <<
" " <<
t.name();
891 std::cout <<
" rejected because of fitting failure" << std::endl;
895 t.refine( 30. * 10. );
896 err = _fitter.fit(
t );
900#ifdef TRKRECO_DEBUG_DETAIL
901 std::cout <<
" " <<
t.name();
902 std::cout <<
" rejected because of fitting failure" << std::endl;
906 t.refine( 30. * 1. );
907 err = _fitter.fit(
t );
911#ifdef TRKRECO_DEBUG_DETAIL
912 std::cout <<
" " <<
t.name();
913 std::cout <<
" rejected because of fitting failure" << std::endl;
918 _tracks.remove( bads );
922#ifdef TRKRECO_DEBUG_DETAIL
923 std::cout <<
name() <<
" ... masking" << std::endl;
926 unsigned n = _tracks.length();
927 for (
unsigned i = 0; i <
n; i++ )
933 if ( !
t.cores().length() )
continue;
937 NHits(
t.cores(), nHits );
940 bool needMask =
false;
941 for (
unsigned j = 0; j < 43; j++ )
946 if (
Width( linksInLayer ) > 2 )
950#ifdef TRKRECO_DEBUG_DETAIL
951 Dump( linksInLayer,
"sort",
" -->" );
957 if ( !needMask )
continue;
959#ifdef TRKRECO_DEBUG_DETAIL
960 std::cout <<
" trk" << i <<
"(id is tmp) needs mask" << std::endl;
961 std::cout <<
" type = " <<
t.type() << std::endl;
982#ifdef TRKRECO_DEBUG_DETAIL
983 std::cout <<
" masking result : ";
984 t.dump(
"detail sort",
" " );
989void TTrackManager::nameTracks(
void ) {
990 unsigned n = _tracks.length();
991 for (
unsigned i = 0; i <
n; i++ )
994 t._name =
"trk" + std::to_string( i ) +
"(" +
t._name +
")";
996 AList<TTrack> tmp = _tracksAll;
997 tmp.remove( _tracks );
998 unsigned n1 = tmp.length();
999 for (
unsigned i = 0; i <
n1; i++ )
1001 TTrack&
t = *tmp[i];
1002 t._name =
"trk" + std::to_string( i +
n ) +
"(" +
t._name +
")";
1010 for (
unsigned j = 0; j <
t.nLinks(); j++ )
1012 if (
t[j] == &start )
continue;
1015 if ( a.cross( b ).z() >= 0. ) l[0].append( k );
1016 else l[1].append( k );
1019#ifdef TRKRECO_DEBUG_DETAIL
1020 std::cout <<
" outer link = " << start.
hit()->
wire()->
name() << std::endl;
1021 std::cout <<
" nLinks of 0 = " << l[0].length() << std::endl;
1022 std::cout <<
" nLinks of 1 = " << l[1].length() << std::endl;
1025 if ( l[0].length() == 0 || l[1].length() == 0 )
return divideByIp(
t, l );
1036 for (
unsigned j = 0; j <
t.nLinks(); j++ )
1040 if ( a.cross( b ).z() >= 0. ) l[0].append( k );
1041 else l[1].append( k );
1052 unsigned n = l.length();
1054 for (
unsigned i = 0; i <
n; i++ )
1056 const TMDCWire&
w = *l[i]->hit()->wire();
1057 unsigned j =
w.localId();
1058 unsigned nWire =
w.layer()->nWires();
1060 float phi = (float)j / (
float)nWire;
1063 float average = phiSum / (float)
n;
1066 for (
unsigned i = 0; i <
n; i++ )
1068 const TMDCWire&
w = *l[i]->hit()->wire();
1069 unsigned j =
w.localId();
1070 unsigned nWire =
w.layer()->nWires();
1072 float phi = (float)j / (
float)nWire;
1073 float dif = fabs( phi - average );
1074 if ( dif > 0.5 ) dif = 1. - dif;
1076 if ( dif > 0.3 )
cross.append( l[i] );
1080#ifdef TRKRECO_DEBUG_DETAIL
1081 std::cout <<
" Cross over IP reduction : ";
1082 for (
unsigned i = 0; i <
cross.length(); i++ )
1083 { std::cout <<
cross[i]->wire()->name() <<
","; }
1084 std::cout << std::endl;
1089 unsigned n = links.length();
1091 for (
unsigned i = 0; i <
n; i++ )
1098#ifdef TRKRECO_DEBUG_DETAIL
1099 Dump( links,
"detail",
" TTrackManager::maskOut ... masking " );
1104#ifdef TRKRECO_DEBUG_DETAIL
1105 std::cout <<
"... masking multi-hits" << std::endl;
1108 if ( !
t.cores().length() )
return;
1110 unsigned n = cores.length();
1111 bool layerLimited =
false;
1115 for (
unsigned i = 0; i <
n; i++ )
1119 bads.append( cores[i] );
1123 if ( linksInLayer.length() > 3 )
1125 bads.append( cores[i] );
1126 layerLimited =
true;
1138#ifdef TRKRECO_DEBUG_DETAIL
1139 std::cout <<
" normal : divided by IP" << std::endl;
1141 for (
unsigned j = 0; j < l[0].length(); j++ )
1142 { std::cout <<
"," << l[0][j]->wire()->name(); }
1143 std::cout << std::endl;
1145 for (
unsigned j = 0; j < l[1].length(); j++ )
1146 { std::cout <<
"," << l[1][j]->wire()->name(); }
1147 std::cout << std::endl;
1151 unsigned maskSide = 2;
1156#ifdef TRKRECO_DEBUG_DETAIL
1157 std::cout <<
" NSuperLayers 0, 1 = " <<
NSuperLayers( l[0] ) <<
", ";
1160 if ( maskSide != 2 )
1169 if ( i0 < i1 ) maskSide = 1;
1170 else if ( i0 > i1 ) maskSide = 0;
1171#ifdef TRKRECO_DEBUG_DETAIL
1172 std::cout <<
" i0, i1 = " << i0 <<
", " << i1 << std::endl;
1174 if ( maskSide != 2 )
1183#ifdef TRKRECO_DEBUG_DETAIL
1184 std::cout <<
" NLayers 0, 1 = " <<
NLayers( l[0] ) <<
", ";
1185 std::cout <<
NLayers( l[1] ) << std::endl;
1187 if ( maskSide != 2 )
1194 if ( maskSide == 2 )
1197 for (
unsigned j = 0; j < 2; j++ )
1201 _fitter.fit( *tt[j] );
1203 if ( tt[1]->pt() > tt[0]->pt() ) maskSide = 1;
1205#ifdef TRKRECO_DEBUG_DETAIL
1206 std::cout <<
" pt 0 = " << tt[1]->
pt() << std::endl;
1207 std::cout <<
" pt 1 = " << tt[0]->
pt() << std::endl;
1221 if ( l[0].length() == 0 )
return;
1222 if ( l[1].length() == 0 )
return;
1224#ifdef TRKRECO_DEBUG_DETAIL
1225 std::cout <<
" curl : divided by IP" << std::endl;
1227 Dump( l[0],
"flag sort" );
1229 Dump( l[1],
"flag sort" );
1230 std::cout << std::endl;
1234 unsigned maskSide = 2;
1239#ifdef TRKRECO_DEBUG_DETAIL
1240 std::cout <<
" NSuperLayers 0, 1 = " <<
NSuperLayers( l[0] ) <<
", ";
1243 if ( maskSide != 2 )
1255 _fitter.fit( *tt[0] );
1256 _fitter.fit( *tt[1] );
1263 if ( fabs( h0.
dz() ) < fabs( h1.
dz() ) ) maskSide = 1;
1273#ifdef TRKRECO_DEBUG_DETAIL
1276 std::cout <<
"TTrackManager::determineT0 !!! called with level = 0";
1277 std::cout << std::endl;
1282 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc );
1283 MsgStream log(
msgSvc,
"TTrackManager" );
1285 IDataProviderSvc* eventSvc = NULL;
1286 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc );
1288 static bool first =
true;
1289 static unsigned methode = 0;
1294 if ( level == 1 ) { _cFitter.fit2D(
true ); }
1295 else if ( level == 2 )
1299 else if ( level == 3 )
1303 else if ( level == 4 )
1306 _cFitter.propagation(
true );
1308 else if ( level == 5 )
1311 _cFitter.propagation(
true );
1312 _cFitter.tof(
true );
1314 else if ( level == 6 )
1318 _cFitter.propagation(
true );
1319 _cFitter.tof(
true );
1321 else if ( level == 7 )
1325 _cFitter.propagation(
true );
1326 _cFitter.tof(
true );
1330 unsigned n = _tracks.length();
1331 if ( !
n )
return StatusCode::SUCCESS;
1333 if ( nMax == 0 ) nMax =
n;
1334 if (
n > nMax )
n = nMax;
1342 SmartDataPtr<RecEsTimeCol> aevtimeCol( eventSvc,
"/Event/Recon/RecEsTimeCol" );
1345 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
1346 t0_sta = ( *iter_evt )->getStat();
1347 tev = ( *iter_evt )->getTest();
1350 else { log << MSG::WARNING <<
"Could not find RecEsTimeCol" << endmsg; }
1352 if ( methode == 0 ) _t0 = T0(
n );
1354 else if ( methode == 1 ) _t0 = T0Fit(
n );
1356 else if ( methode == 2 )
1385 std::cout <<
"TTrackManager::determineT0 ... methode=" << methode;
1386 std::cout <<
", T0 offset=" << -_t0;
1387 std::cout <<
", # of tracks used=" <<
n << std::endl;
1391 float t0_rec = 999.;
1393 if ( fabs( _t0 + tev ) < 4 ) t0_rec = 0;
1394 if ( fabs( _t0 + tev - 8 ) < 4 ) t0_rec = 8;
1395 if ( fabs( _t0 + tev - 16 ) < 4 ) t0_rec = 16;
1396 log << MSG::INFO <<
"beginning to make RecEsTimeCol" << endmsg;
1397 IDataManagerSvc* dataManSvc =
dynamic_cast<IDataManagerSvc*
>( eventSvc );
1398 DataObject* aEvTime;
1399 eventSvc->findObject(
"/Event/Recon/RecEsTimeCol", aEvTime );
1400 if ( aEvTime != NULL && t0_rec < 25 )
1402 dataManSvc->clearSubTree(
"/Event/Recon/RecEsTimeCol" );
1403 eventSvc->unregisterObject(
"/Event/Recon/RecEsTimeCol" );
1411 aevtime->
setStat( t0_recSta );
1412 aEvTimeCol->push_back( aevtime );
1416 StatusCode evtime = eventSvc->registerObject(
"/Event/Recon/RecEsTimeCol", aEvTimeCol );
1418 if ( evtime != StatusCode::SUCCESS )
1420 log << MSG::FATAL <<
"Could not register Event Start Time" << endmsg;
1421 return ( StatusCode::FAILURE );
1424 return ( StatusCode::SUCCESS );
1427float TTrackManager::T0(
unsigned n ) {
1436 for (
unsigned i = 0; i <
n; i++ )
1440 for (
unsigned j = 0; j < 3; j++ )
1442 float offset =
X0 + j *
STEP;
1443 _cFitter.
fit(
t, offset );
1446 t0Sum += minimum( y[0], y[1], y[2] );
1448 float t0 = t0Sum / (float)
n;
1449 if ( isnan( t0 ) ) t0 = 0.;
1452 n = _tracks.length();
1453 for (
unsigned i = 0; i <
n; i++ )
1455 TTrack&
t = *_tracks[i];
1456 _cFitter.fit(
t, t0 );
1469float TTrackManager::T0Fit(
unsigned n ) {
1472 float tev_sum0 = 0.;
1474 float tev_sum2 = 0.;
1479 const int cn = _tracks.length();
1480 float* sort =
new float[cn];
1481 float ptmax_pre = 1.e10;
1482 for (
unsigned i = 0; i < cn; i++ )
1484 float ptmax = -999.;
1486 for (
unsigned j = 0; j < cn; j++ )
1488 TTrack& tj = *_tracks[j];
1489 float pt = fabs( 1. / tj.
helix().
a()[2] );
1490 if ( pt < ptmax_pre && pt > ptmax )
1500 for (
unsigned i = 0; i <
n; i++ )
1503 TTrack&
t = *_tracks[sort[i]];
1507 _cFitter.fit(
t, tev, tev_err );
1509 float w = 1. / tev_err / tev_err;
1518 float tev_mean = tev_sum / w_sum;
1524 if ( isnan( tev_mean ) ) tev_mean = 0.;
1536float TTrackManager::minimum(
float y0,
float y1,
float y2 )
const {
1537 float xMin =
X1 + 0.5 *
STEP * ( y0 - y2 ) / ( y0 + y2 - 2. * y1 );
1545 unsigned n = _tracks.length();
1548 unsigned* flagTrk = (
unsigned*)malloc(
n *
sizeof(
unsigned ) );
1549 for (
unsigned i = 0; i <
n; i++ ) flagTrk[i] = 0;
1552 for (
unsigned i0 = 0; i0 <
n; i0++ )
1555 if ( flagTrk[i0] != 0 )
continue;
1556 TTrack& t0 = *_tracks[i0];
1557 if ( !( t0.
pt() < 0.13 ) )
continue;
1559 unsigned Noverlap( 0 ), Nall( 0 );
1560 float OverlapRatioMax( -999. );
1561 unsigned MaxID( 0 );
1563 for (
unsigned i1 = 0; i1 <
n; i1++ )
1566 if ( i0 == i1 || flagTrk[i1] != 0 )
continue;
1567 TTrack& t1 = *_tracks[i1];
1568 if ( !( t1.
pt() < 0.13 ) )
continue;
1569 Nall = t1.
links().length();
1570 if ( !Nall )
continue;
1573 for (
unsigned j = 0; j < Nall; j++ )
1582 double r = sqrt( x * x + y * y );
1585 if ( ( R - load ) < r && r < ( R + load ) ) Noverlap++;
1588 if ( !Noverlap )
continue;
1589 float tmpRatio = float( Noverlap ) / float( Nall );
1591 if ( tmpRatio > OverlapRatioMax )
1593 OverlapRatioMax = tmpRatio;
1598 if ( OverlapRatioMax < 0.7 )
continue;
1601 unsigned MaskID[2] = { MaxID, i0 };
1604 for (
unsigned j0 = 0; j0 < 2; j0++ )
1606 for (
unsigned j1 = 0; j1 < _tracks[MaskID[j0]]->nLinks(); j1++ )
1608 TMLink& k = *_tracks[MaskID[j0]]->links()[j1];
1614 _tracks[i0]->append( _tracks[MaxID]->links() );
1615 _tracks[MaxID]->append( _tracks[i0]->links() );
1617#ifdef TRKRECO_DEBUG_DETAIL
1618 std::cout <<
" mask & merge " << std::endl;
1620 Dump( l[0],
"flag sort" );
1622 Dump( l[1],
"flag sort" );
1623 std::cout << std::endl;
1627 unsigned maskSide = 2;
1634 if( super0 < super1 ) maskSide = 0;
1635 else if ( super0 > super1 ) maskSide = 1;
1637# ifdef TRKRECO_DEBUG_DETAIL
1638 std::cout <<
" NSuperLayers 0, 1 = " <<
NSuperLayers(l[0]) <<
", ";
1642 if (maskSide == 2) {
1648 if ( inner0 < inner1 ) maskSide = 1;
1649 else if ( inner0 > inner1 ) maskSide = 0;
1651 if ( maskSide == 2 )
1658 tt[0] =
new TTrack( *( _tracks[MaskID[0]] ) );
1659 tt[1] =
new TTrack( *( _tracks[MaskID[1]] ) );
1660 _fitter.fit( *tt[0] );
1661 _fitter.fit( *tt[1] );
1668 if ( fabs( h0.
dz() ) < fabs( h1.
dz() ) ) maskSide = 1;
1677 bads.append( _tracks[MaskID[maskSide]] );
1678 flagTrk[MaskID[maskSide]] = 1;
1682 _tracks.remove( bads );
1685 n = _tracks.length();
1687 for (
unsigned i = 0; i <
n; i++ )
1690 for (
unsigned j = 0; j <
t.links().length(); j++ )
1700 double qq =
q *
t.charge();
1713 static const unsigned GoodHitMask =
1718#ifdef TRKRECO_DEBUG_DETAIL
1719 std::cout <<
" checking hits ... " <<
t.name() <<
" quality = " <<
t.quality();
1720 std::cout <<
" : " <<
t.cores().length() <<
", " <<
t.ndf() <<
" : ";
1725 unsigned nStereos = 0;
1726 unsigned nOccupied = 0;
1729 unsigned n =
t.links().length();
1730 for (
unsigned i = 0; i <
n; i++ )
1735#ifdef TRKRECO_DEBUG_DETAIL
1736 if ( h->
trk ) std::cout << l->
wire()->
name() <<
"(n/a),";
1744 if ( ( l->
hit()->
state() & GoodHitMask ) == GoodHitMask )
1757 t.finalHits( hits );
1758#ifdef TRKRECO_DEBUG_DETAIL
1759 std::cout << std::endl;
1765 if ( hits.length() < 3 ) err = 3;
1766 if ( nOccupied > 2 ) err = 4;
1770 if ( hits.length() < 5 ) err = 1;
1771 if ( nStereos < 2 ) err = 2;
1773 if ( err )
return err;
1780 *pr =
new MdcRec_trk;
1781 *pra =
new MdcRec_trk_add;
1782 MdcRec_trk* r = *pr;
1783 MdcRec_trk_add* ra = *pra;
1796 unsigned nHits = hits.length();
1797 for (
unsigned i = 0; i < nHits; i++ )
1799 TMLink* l = hits[i];
1800 MdcRec_wirhit* h = hits[i]->hit()->reccdc();
1809 r->
nster = nStereos;
1814 n = badHits.length();
1815 for (
unsigned i = 0; i <
n; i++ )
1817 MdcRec_wirhit* h = badHits[i]->hit()->reccdc();
1826 const Vector& a =
t.helix().a();
1839 r->
error[0] = ea[0][0];
1840 r->
error[1] = ea[1][0];
1841 r->
error[2] = ea[1][1];
1842 r->
error[3] = ea[2][0];
1843 r->
error[4] = ea[2][1];
1844 r->
error[5] = ea[2][2];
1845 r->
error[6] = ea[3][0];
1846 r->
error[7] = ea[3][1];
1847 r->
error[8] = ea[3][2];
1848 r->
error[9] = ea[3][3];
1849 r->
error[10] = ea[4][0];
1850 r->
error[11] = ea[4][1];
1851 r->
error[12] = ea[4][2];
1852 r->
error[13] = ea[4][3];
1853 r->
error[14] = ea[4][4];
1859 t.approach( *last );
1866 unsigned n = _tracks.length();
1867 if (
n < 2 )
return;
1869 for (
unsigned i = 0; i <
n - 1; i++ )
1871 TTrack& t0 = *_tracks[i];
1872 float bestRChisq = HUGE_VAL;
1873 if ( t0.
ndf() > 0 ) bestRChisq = t0.
chi2() / t0.
ndf();
1874 for (
unsigned j = i + 1; j <
n; j++ )
1876 TTrack& t1 = *_tracks[j];
1877 float rChisq = HUGE_VAL;
1878 if ( t1.
ndf() > 0 ) rChisq = t1.
chi2() / t1.
ndf();
1879 if ( rChisq < bestRChisq )
1881 bestRChisq = rChisq;
1882 _tracks.swap( i, j );
1889#ifdef TRKRECO_DEBUG_DETAIL
1890 std::cout <<
"trkmgr::sortTracksByPt : # of tracks=" << _tracks.length() << std::endl;
1893 unsigned n = _tracks.length();
1894 if (
n < 2 )
return;
1896 for (
unsigned i = 0; i <
n - 1; i++ )
1898 TTrack& t0 = *_tracks[i];
1899 float bestPt = t0.
pt();
1900 for (
unsigned j = i + 1; j <
n; j++ )
1902 TTrack& t1 = *_tracks[j];
1904#ifdef TRKRECO_DEBUG_DETAIL
1905 std::cout <<
"i,j=" << i <<
"," << j <<
" : pt i,j=" << bestPt <<
"," << pt << std::endl;
1910 _tracks.swap( i, j );
1920 if ( trk1.
zero[2] == 0 )
return;
1931 if ( cdc2.
rectrk == 0 )
return;
1935 if ( trk2.
zero[2] == 0 )
return;
1974 float dz1 = fabs( z1.
helix[3] );
1975 float dz2 = fabs( z2.
helix[3] );
1976 if ( fabs( dz1 - dz2 ) < 2. )
flag = 1;
1983 float dr1 = fabs( z1.
helix[0] );
1984 float dr2 = fabs( z2.
helix[0] );
1993 else if (
flag == 2 )
1995 float dz1 = fabs( z1.
helix[3] );
1996 float dz2 = fabs( z2.
helix[3] );
2020#ifdef TRKRECO_DEBUG_DETAIL
2021 std::cout <<
"trkmgr::sortBanksByPt : # of tracks="
2028 if (
n < 2 )
return;
2031 unsigned*
id = (
unsigned*)malloc(
n *
sizeof(
unsigned ) );
2032 for (
unsigned i = 0; i <
n; i++ )
id[i] = i;
2033 for (
unsigned i = 0; i <
n - 1; i++ )
2051 float bestPt = 1. / fabs( cdc0.
helix[2] );
2052 unsigned bestQuality = add0.
quality;
2053 for (
unsigned j = i + 1; j <
n; j++ )
2071 float pt = 1. / fabs( cdc1.
helix[2] );
2072#ifdef TRKRECO_DEBUG_DETAIL
2073 std::cout <<
"i,j=" << i <<
"," << j <<
" : quality i,j=" << bestQuality <<
","
2076 unsigned quality = add1.
quality;
2077 if ( quality > bestQuality )
continue;
2078 else if ( quality < bestQuality )
2080 bestQuality = quality;
2082 swapReccdc( cdc0, add0, mc0, cdc1, add1, mc1 );
2083 unsigned tmp =
id[i];
2086#ifdef TRKRECO_DEBUG_DETAIL
2087 std::cout <<
"swapped" << std::endl;
2091#ifdef TRKRECO_DEBUG_DETAIL
2092 std::cout <<
"i,j=" << i <<
"," << j <<
" : pt i,j=" << bestPt <<
"," << pt << std::endl;
2096#ifdef TRKRECO_DEBUG_DETAIL
2097 std::cout <<
"swapping ... " << &cdc0 <<
"," << &add0 <<
"," << &mc0 <<
" <-> "
2098 << &cdc1 <<
"," << &add1 <<
"," << &mc1 << std::endl;
2100 bestQuality = quality;
2102 swapReccdc( cdc0, add0, mc0, cdc1, add1, mc1 );
2103 unsigned tmp =
id[i];
2106#ifdef TRKRECO_DEBUG_DETAIL
2107 std::cout <<
"swapped" << std::endl;
2112#ifdef TRKRECO_DEBUG_DETAIL
2113 std::cout <<
"trkmgr::sortBanksByPt : first phase finished" << std::endl;
2119#ifdef TRKRECO_DEBUG_DETAIL
2120 std::cout <<
"trkmgr::sortBanksByPt : second phase finished" << std::endl;
2125 n = BsCouTab(RECTRK);
2126 id = (
unsigned *) malloc(
n *
sizeof(
unsigned));
2127 for (
unsigned i = 0; i <
n; i++)
id[i] = i;
2131 rectrk &
t = * (rectrk *) BsGetEnt(RECTRK, i + 1, BBS_No_Index);
2132 if (
t.m_prekal == (i + 1)) {
2137 rectrk &
s = * (rectrk *) BsGetEnt(RECTRK,
2142 unsigned tmp =
id[i];
2143 id[i] =
id[
s.m_ID - 1];
2144 id[
s.m_ID - 1] = tmp;
2148 reccdc_trk_add & a =
2149 * (reccdc_trk_add *) BsGetEnt(RECMDC_TRK_ADD,
2152 reccdc_trk_add & b =
2153 * (reccdc_trk_add *) BsGetEnt(RECMDC_TRK_ADD,
2156 a.m_rectrk =
t.m_ID;
2157 b.m_rectrk =
s.m_ID;
2212#define RECMDC_ACTUAL_SIZE 124
2213#define RECMDCADD_ACTUAL_SIZE 40
2214#define RECMDCMC_ACTUAL_SIZE 28
2216 static bool first =
true;
2217 static void* swapRegion;
2224 void* s0 = &cdc0.
helix[0];
2225 void* s1 = &cdc1.
helix[0];
2236 if ( ( &mc0 ) && ( &mc1 ) )
2246void TTrackManager::swapRectrk(
MdcTrk& rec0,
MdcTrk& rec1 )
const {
2247#define RECTRK_ACTUAL_SIZE 84
2249 static bool first =
true;
2250 static void* swapRegion;
2257 void* s0 = &rec0.
glob[0];
2258 void* s1 = &rec1.
glob[0];
2264void TTrackManager::tagReccdc(
unsigned* id0,
unsigned nTrk )
const {
2345 unsigned n = _tracks.length();
2346 if (
n < 2 )
return;
2348 for (
unsigned i = 0; i <
n - 1; i++ )
2350 TTrack& t0 = *_tracks[i];
2354 for (
unsigned j = i + 1; j <
n; j++ )
2356 TTrack& t1 = *_tracks[j];
2358 if ( c0 * c1 > 0. )
continue;
2361 bool toBeMerged =
false;
2363 if ( n0 > _nCurlerMergeTest ) toBeMerged =
true;
2367 if (
n1 > _nCurlerMergeTest ) toBeMerged =
true;
2373 if ( ( t0.
daughter() ) || ( t1.
daughter() ) ) ++_s->_nToBeMergedMoreThanTwo;
2386 std::cout <<
"... trkmgr::salvaging associate hits" << std::endl;
2387 std::cout <<
" # of given hits=" << hits.length() << std::endl;
2391 unsigned nTracks = _tracks.length();
2392 if ( nTracks == 0 )
return;
2393 unsigned nHits = hits.length();
2394 if ( nHits == 0 )
return;
2399 for (
unsigned i = 0; i < nHits; i++ )
2405#ifdef TRKRECO_DEBUG_DETAIL
2406 std::cout <<
" checking " << h.
wire()->
name();
2412 TTrack* bestTrack = NULL;
2413 for (
unsigned j = 0; j < nTracks; j++ )
2422#ifdef TRKRECO_DEBUG_DETAIL
2423 std::cout <<
" : c= " << co.
cross( x - c ) *
t.charge();
2424 std::cout <<
", d=" << fabs( ( x - c ).mag() - fabs(
t.radius() ) );
2427 if ( co.
cross( x - c ) *
t.charge() > 0. )
continue;
2428 if ( fabs( ( x - c ).mag() - fabs(
t.radius() ) ) > 5. )
continue;
2432 int err =
t.approach( link );
2435#ifdef TRKRECO_DEBUG_DETAIL
2436 std::cout <<
" : " <<
t.name() <<
" approach failure";
2438 toBeDeleted.append( link );
2444 float diff = fabs( distance - link.
hit()->
drift() );
2445 float sigma = diff / link.
hit()->
dDrift();
2446 link.
pull( sigma * sigma );
2448#ifdef TRKRECO_DEBUG_DETAIL
2449 std::cout <<
" : " <<
t.name() <<
" pull = " << link.
pull();
2451 if ( link.
pull() > maxSigma2 )
2453 toBeDeleted.append( link );
2461 toBeDeleted.append( best );
2465 else { toBeDeleted.append( link ); }
2476 bestTrack->
append( *best );
2478 _associateHits.append( best );
2481 std::cout <<
" -> " << bestTrack->
name() << std::endl;
2484 HepAListDeleteAll( toBeDeleted );
2486#ifdef TRKRECO_DEBUG_DETAIL
2487 std::cout << std::endl;
2494 std::cout <<
"... trkmgr::maskBadHits" << std::endl;
2498 for (
unsigned i = 0; i <
n; i++ )
2501 bool toBeUpdated =
false;
2503 unsigned nHits = links.length();
2504 for (
unsigned j = 0; j < nHits; j++ )
2506 if ( links[j]->pull() > maxSigma2 )
2511 std::cout <<
" " <<
t.name() <<
" : ";
2512 std::cout << links[j]->wire()->name() <<
"(pull=";
2513 std::cout << links[j]->pull() <<
") is masked" << std::endl;
2517 if ( toBeUpdated )
t.update();
2536 for (
unsigned i = 0; i <
n; i++ )
2542 for (
unsigned i = 0; i <
n; i++ )
2552 for (
unsigned i = 0; i <
n; i++ )
2563 bool track2D )
const {
2565 unsigned n = list.length();
2566 for (
unsigned i = 0; i <
n; i++ )
2572 if ( _maxMomentum > 0. )
2574 if (
t.ptot() > _maxMomentum )
2581 goodTracks.append( (TTrack&)
t );
2586 if ( list.length() != goodTracks.length() )
2588 std::cout <<
"TTrackManager::selectGoodTracks ... bad tracks found" << std::endl
2589 <<
" # of bad tracks = "
2590 << list.length() - goodTracks.length() <<
" : 2D flag = " << track2D
2594 tmp.remove( goodTracks );
2595 std::cout <<
" Track dump" << std::endl;
2596 for (
unsigned i = 0; i < tmp.length(); i++ )
2597 { std::cout <<
" " <<
TrackDump( *tmp[i] ) << std::endl; }
2604bool TTrackManager::checkNumberOfHits(
const TTrack&
t,
bool track2D ) {
2605 const AList<TMLink>& cores =
t.cores();
2610 if ( axialHits < 3 )
return false;
2614 unsigned allHits = cores.length();
2615 if ( allHits < 5 )
return false;
2617 if ( stereoHits < 2 )
return false;
2618 unsigned axialHits = allHits - stereoHits;
2619 if ( axialHits < 3 )
return false;
2625 static const HepVector3D InitialVertex( 0., 0., 0. );
2631 for (
unsigned i = 0; i <
n; i++ )
2636 if (
t.prekal == 0 )
continue;
2650 if ( !&g )
continue;
2651 if ( g.
nhits[3] < 2 )
continue;
2652 if ( g.
nhits[4] < 2 )
continue;
2660 if ( !&z )
continue;
2664 unsigned nZ = zList.length();
2665 if (
nZ < 2 )
return;
2675void TTrackManager::tagRectrk(
unsigned* id0,
unsigned nTrk )
const {
3028 if ( !checkNumberOfHits(
t, track2D ) )
return false;
3037 if (
nullptr == m_pmgnIMF )
3039 StatusCode sc = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
3040 if ( sc.isFailure() )
3041 { std::cout <<
"Unable to open Magnetic field service" << std::endl; }
3043 if (
nullptr == m_pmgnIMF ) std::cout <<
" Unable to get IBesMagFieldSvc " << std::endl;
3048 if ( !m_rawDataProviderSvc )
3050 StatusCode sc = Gaudi::svcLocator()->service(
"RawDataProviderSvc", m_rawDataProviderSvc );
3051 if ( sc.isFailure() ) { std::cout <<
"Unable to open RawDataProviderSvc" << std::endl; }
3053 return m_rawDataProviderSvc;
HepGeom::Vector3D< double > HepVector3D
HepGeom::Point3D< double > HepPoint3D
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
ObjectVector< RecEsTime > RecEsTimeCol
std::vector< MdcDigi * > MdcDigiVec
EvtVector3R cross(const EvtVector3R &p1, const EvtVector3R &p2)
double sin(const BesAngle a)
double cos(const BesAngle a)
ObjectVector< RecMdcHit > RecMdcHitCol
ObjectVector< RecMdcTrack > RecMdcTrackCol
SmartRefVector< RecMdcHit > HitRefVec
CLHEP::HepSymMatrix SymMatrix
const HepPoint3D ORIGIN
Constants.
#define WireHitChargeValid
#define WireHitFindingValid
#define WireHitFittingValid
#define WireHitInvalidForFit
void Dump(const CAList< TMLink > &links, const std::string &message=std::string(""), const std::string &prefix=std::string(""))
dumps TMLinks.
unsigned NAxialHits(const AList< TMLink > &links)
returns # of axial hits.
unsigned Width(const AList< TMLink > &)
void NHits(const AList< TMLink > &links, unsigned nHits[50])
returns # of hits per layer.
TMLink * OuterMost(const AList< TMLink > &links)
unsigned NLayers(const AList< TMLink > &links)
returns # of layers.
TMLink * InnerMost(const AList< TMLink > &links)
returns the inner(outer)-most link.
unsigned NSuperLayers(const AList< TMLink > &links)
returns # of layers.
unsigned NStereoHits(const AList< TMLink > &links)
returns # of stereo hits.
AList< TMLink > SameLayer(const AList< TMLink > &list, const TMLink &a)
returns links which are in the same layer as 'a' or 'id'.
int SortByWireId(const void *a, const void *b)
Sorter.
bool HelixHasNan(const Helix &)
Helix parameter validity.
std::string TrackDump(const TTrack &)
to dump a track.
#define TrackTrackManager
#define TrackQualityOutsideCurler
int SortByPt(const void *a, const void *b)
Utility functions.
****INTEGER imax DOUBLE PRECISION m_pi *DOUBLE PRECISION m_amfin DOUBLE PRECISION m_Chfin DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_sinw2 DOUBLE PRECISION m_GFermi DOUBLE PRECISION m_MfinMin DOUBLE PRECISION m_ta2 INTEGER m_out INTEGER m_KeyFSR INTEGER m_KeyQCD *COMMON c_Semalib $ !copy of input $ !CMS energy $ !beam mass $ !final mass $ !beam charge $ !final charge $ !smallest final mass $ !Z mass $ !Z width $ !EW mixing angle $ !Gmu Fermi $ alphaQED at q
#define RECMDCADD_ACTUAL_SIZE
#define RECMDCMC_ACTUAL_SIZE
#define RECTRK_ACTUAL_SIZE
#define RECMDC_ACTUAL_SIZE
const double theta() const
void setFirstLayer(const int id)
void setPxy(const double pxy)
void setTrackId(const int trackId)
void setPy(const double py)
const HepSymMatrix err() const
void setZ(const double z)
void setNster(const int ns)
void setX(const double x)
void setError(double err[15])
void setNdof(const int ndof)
const double chi2() const
void setTheta(const double theta)
void setStat(const int stat)
const int trackId() const
void setP(const double p)
void setHelix(double helix[5])
void setPoca(double poca[3])
void setR(const double r)
void setCharge(const int charge)
void setLastLayer(const int id)
const HepVector helix() const
......
void setY(const double y)
void setChi2(const double chi)
void setPhi(const double phi)
void setPz(const double pz)
void setPx(const double px)
const HepPoint3D & center(void) const
returns position of helix center(z = 0.);
double radius(void) const
returns radious of helix.
const HepVector & a(void) const
returns helix parameters.
const HepPoint3D & pivot(void) const
returns pivot position.
static vector< MdcDat_mcwirhit > * getMdcDatMcwirhitCol(void)
static Identifier wire_id(int wireType, int layer, int wire)
For a single wire.
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
static int wire(const Identifier &id)
static vector< MdcRec_mctrk2hep > * getMdcRecMctrk2hepCol(void)
static vector< MdcRec_mctrk > * getMdcRecMctrkCol(void)
static vector< MdcRec_trk_add > * getMdcRecTrkAddCol(void)
static vector< MdcRec_trk > * getMdcRecTrkCol(void)
static vector< MdcRec_wirhit > * getMdcRecWirhitCol(void)
static vector< MdcTrk > * getMdcTrkCol(void)
void setTest(double Test)
void setMdcId(Identifier mdcid)
void setErrDriftDistRight(double erddr)
void setFltLen(double fltLen)
void setErrDriftDistLeft(double erddl)
void setDriftDistLeft(double ddl)
void setDoca(double doca)
void setChisqAdd(double pChisq)
void setZhit(double zhit)
void setDriftT(double driftT)
void setDriftDistRight(double ddr)
void setEntra(double entra)
const HitRefVec getVecHits(void) const
void setPivot(const HepPoint3D &pivot)
const int getNhits() const
void setVecHits(HitRefVec vechits)
void setFiTerm(double fiterm)
int fit(TTrackBase &) const
const TTrackHEP *const hep(void) const
returns a pointer to a GEN_HEPEVT.
MdcDat_mcwirhit * datcdc(void) const
returns a pointer to DATMDC_MCWIRHIT.
struct MdcRec_wirhit * reccdc(void) const
returns a pointer to RECMDC_WIRHIT.
unsigned state(void) const
returns state.
float dDrift(unsigned) const
returns drift distance error.
float drift(unsigned) const
returns drift distance.
const TMDCWire *const wire(void) const
returns a pointer to a TMDCWire.
const TMDCWireHitMC *const mc(void) const
returns a pointer to TMDCWireHitMC.
A class to represent a wire in MDC.
unsigned localId(void) const
returns local id in a wire layer.
unsigned layerId(void) const
returns layer id.
const HepPoint3D & xyPosition(void) const
returns middle position of a wire. z componet is 0.
bool stereo(void) const
returns true if this wire is in a stereo layer.
std::string name(void) const
returns name.
A class to relate TMDCWireHit and TTrack objects.
double distance(void) const
returns distance between point on wire and on track.
const HepPoint3D & positionOnWire(void) const
returns the closest point on wire to a track.
double distancenew(void) const
const HepPoint3D & positionOnTrack(void) const
returns the closest point on track to wire.
double getDriftTime(void)
unsigned leftRight(void) const
returns left-right. 0:left, 1:right, 2:wire
const TMDCWireHit * hit(void) const
returns a pointer to a hit.
float dDrift(void) const
returns/sets drift distance error.
double dPhi(void) const
returns dPhi to the closest point.
double pull(void) const
returns pull.
float drift(void) const
returns/sets drift distance.
const TMDCWire *const wire(void) const
returns a pointer to a wire.
A class to represent a point in 2D.
double cross(const TPoint2D &) const
unsigned testByApproach(const TMLink &list, double sigma) const
returns # of good hits to be appended.
void append(TMLink &)
appends a TMLink.
const AList< TMLink > & links(unsigned mask=0) const
void remove(TMLink &a)
removes a TMLink.
void appendByApproach(AList< TMLink > &list, double maxSigma)
const AList< TMLink > & cores(unsigned mask=0) const
returns a list of masked TMLinks for fit. 'mask' will be applied if mask is not 0.
const Gen_hepevt * gen(void) const
returns a pointer to Gen_hepevt.
A class to have MC information of TTrack.
double wireFractionHEP(void) const
returns wire fraction(F2).
const TTrackHEP *const hep(void) const
returns a pointer to TTrackHEP.
unsigned quality(void) const
returns quality.
bool charge(void) const
returns charge matching.
double ptFraction(void) const
returns pt fraction.
double pzFraction(void) const
returns pz fraction.
double wireFraction(void) const
returns wire fraction(F1).
void movePivot(void)
moves pivot of tracks.
void append2D(AList< TTrack > &list)
void maskOut(TTrack &, const AList< TMLink > &) const
void removeHitsAcrossOverIp(AList< TMLink > &) const
static void maskBadHits(const AList< TTrack > &, float maxSigma2)
masks hits with large chisq as associated hits. Pull in TMLink is used.
void clearTables(void) const
clears tables.
void dump(const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
dumps debug information.
void maskNormal(TTrack &) const
virtual ~TTrackManager()
Destructor.
void finish(void)
finishes tracks.
TTrack * closest(const AList< TTrack > &, const TMDCWireHit &) const
returns a track which is the closest to a hit.
void append(AList< TTrack > &list)
appends (2D) tracks. 'list' will be cleaned up.
void saveTables(void)
stores track info. into Panther table.
std::string version(void) const
returns version.
void salvageAssociateHits(const AList< TMDCWireHit > &, float maxSigma2)
salvages hits for dE/dx(not for track fitting).
void refit(void)
refits tracks.
TMLink & divide(const TTrack &t, AList< TMLink > *l) const
StatusCode makeTds(RecMdcTrackCol *trackList, RecMdcHitCol *hitList, int tkStat=1, int runge=0, int cal=0)
stores track info. into TDS. by Zang Shilei
void setCurlerFlags(void)
tests for curlers.
void maskMultiHits(TTrack &) const
void determineIP(void)
determines IP.
static bool goodTrack(const TTrack &, bool track2D=false)
checks goodness of a track.
const AList< TTrack > & tracks(void) const
returns a list of reconstructed tracks.
std::string name(void) const
returns name.
TTrackManager()
Constructor.
void maskCurl(TTrack &) const
void saveMCTables(void) const
stores MC track info. into Panther table.
void mask(void) const
masks hits out which are in tail of curly tracks.
TMLink & divideByIp(const TTrack &t, AList< TMLink > *l) const
void sortBanksByPt(void) const
sorts RECMDC_TRK tables.
void sortTracksByQuality(void)
sorts tracks.
void treatCurler(MdcTrk &curl, MdcRec_trk_add &cdc, unsigned flag) const
final decision for a curler.
void maskCurlHits(const AList< TMDCWireHit > &axial, const AList< TMDCWireHit > &stereo, const AList< TTrack > &tracks) const
masks hits on found curl tracks.
StatusCode determineT0(unsigned level, unsigned nMaxTracks)
determines T0 and refit all tracks.
void salvage(const AList< TMDCWireHit > &) const
salvages remaining hits.
void clear(void)
clears all internal information.
void sortTracksByPt(void)
A class to represent a track in tracking.
const Helix & helix(void) const
returns helix parameter.
unsigned ndf(void) const
returns NDF.
const std::string & name(void) const
returns/sets name.
TTrack * daughter(void) const
unsigned finder(void) const
sets/returns finder.
unsigned type(void) const
returns type. Definition is depending on an object type.
double pt(void) const
returns Pt.
int approach(TMLink &) const
double chi2(void) const
returns chi2.
double charge(void) const
returns charge.