19#include "TrkReco/TCircle.h"
20#include "TrkReco/TConformalFinder.h"
21#include "TrkReco/TConformalFinder0.h"
22#include "TrkReco/THistogram.h"
23#include "TrkReco/TMDC.h"
24#include "TrkReco/TMDCTsf.h"
25#include "TrkReco/TMDCUtil.h"
26#include "TrkReco/TMDCWireHitMC.h"
27#include "TrkReco/TMLine.h"
28#include "TrkReco/TTrack.h"
29#include "TrkReco/TTrackHEP.h"
30#include "TrkReco/TTrackManager.h"
33unsigned TConformalFinder::_stage = ConformalOutside;
36# include "TrkReco/TWindow.h"
41static const float PI2 = 2. *
M_PI;
42static const float WIDTH[] = {
PI2 / 40,
51 unsigned perfectSegmentFinding,
float maxSigma,
52 float maxSigmaStereo,
float salvageLevel,
53 unsigned minNLinksForSegment,
unsigned minNCoreLinks,
54 unsigned minNSegments,
unsigned salvageLoadWidth,
55 unsigned stereoMode,
unsigned stereoLoadWidth,
56 float szSegmentDistance,
float szLinkDistance,
57 unsigned fittingFlag )
58 : _fastFinder( fastFinder )
59 , _slowFinder( slowFinder )
61 , _perfectSegmentFinding( perfectSegmentFinding )
62 , _segmentSeparation( 4 )
63 , _minNLinksForSegment( minNLinksForSegment )
64 , _minNLinksForSegmentInRefine( 2 )
66 _maxNLinksForSegment( 8 )
67 , _maxWidthForSegment( 4 )
68 , _minNCoreLinks( minNCoreLinks )
69 , _minNSegments( minNSegments )
70 , _minUsedFractionSlow2D( 0.5 )
71 , _salvageLoadWidth( salvageLoadWidth )
72 , _stereoMode( stereoMode )
73 , _stereoLoadWidth( stereoLoadWidth )
75 , _maxSigma2( maxSigma )
76 , _T0ResetDone( false )
77 , _builder(
"conformal builder", maxSigma, maxSigmaStereo, salvageLevel, szSegmentDistance,
78 szLinkDistance, fittingFlag )
80 , m_pmgnIMF( nullptr )
82 , _rphiWindow(
"rphi window" )
85 _linkMaxDistance[0] = 0.02;
86 _linkMaxDistance[1] = 0.025;
87 _linkMaxDistance[2] = 0.025;
88 _linkMinDirAngle[0] = 0.97;
89 _linkMinDirAngle[1] = 0.95;
90 _linkMinDirAngle[2] = 0.95;
97 if ( msg.find(
"state" ) != std::string::npos )
102 std::cout <<
"#axial=" << _hits[0].length();
103 std::cout <<
",#stereo=" << _hits[1].length();
105 if ( msg.find(
"summary" ) != std::string::npos ||
106 msg.find(
"detail" ) != std::string::npos )
149 for (
unsigned i = 0; i < 3; i++ )
151 if ( i == 2 ) HepAListDeleteAll( _allHits[i] );
152 else _allHits[i].removeAll();
153 _hits[i].removeAll();
154 _unused[i].removeAll();
156 for (
unsigned i = 0; i < 2; i++ )
158 for (
unsigned j = 0; j < 6; j++ )
160#ifdef TRKRECO_DEBUG_DETAIL
161 cout <<
"_allSegments length = " << _allSegments[i][j].length()
162 <<
" _allUnused length = " << _allUnused[i][j].length() << endl;
164 HepAListDeleteAll( _allSegments[i][j] );
165 _allUnused[i][j].removeAll();
168 _2DTracks.removeAll();
169 _3DTracks.removeAll();
172void TConformalFinder::selectGoodHits(
void ) {
173 for (
unsigned i = 0; i < 2; i++ )
175 unsigned n = _allHits[i].length();
176 for (
unsigned j = 0; j <
n; j++ )
178 unsigned state = _allHits[i][j]->hit()->state();
182 _hits[i].append( _allHits[i][j] );
184 _unused[i].append( _allHits[i][j] );
187 _hits[2].append( _hits[0] );
188 _hits[2].append( _hits[1] );
189 _unused[2].append( _unused[0] );
190 _unused[2].append( _unused[1] );
194 _rphiWindow.skip(
false );
195 _rphiWindow.skipAllWindow(
false );
196 _rphiWindow.append( _allHits[2] );
197 _rphiWindow.append( _hits[2], leda_pink );
203void TConformalFinder::findSegments(
void ) {
206 AList<TMLink> links[11];
207 unsigned n = _hits[2].length();
208 for (
unsigned i = 0; i <
n; i++ )
210 TMLink& l = *_hits[2][i];
215 THistogram* hist[11];
228 hist[0] =
new THistogram( 56 );
229 hist[1] =
new THistogram( 80 );
230 hist[2] =
new THistogram( 88 );
231 hist[3] =
new THistogram( 112 );
232 hist[4] =
new THistogram( 140 );
233 hist[5] =
new THistogram( 160 );
234 hist[6] =
new THistogram( 176 );
235 hist[7] =
new THistogram( 208 );
236 hist[8] =
new THistogram( 240 );
237 hist[9] =
new THistogram( 256 );
238 hist[10] =
new THistogram( 288 );
240 for (
unsigned i = 0; i < 11; i++ )
244 unsigned superLayerId;
298 AList<TSegment> tmp = hist[i]->
segments();
301 unsigned n = tmp.length();
305 for (
unsigned j = 0; j <
n; j++ )
307 TSegment*
s = tmp[j];
308 if (
s->links().length() < _minNLinksForSegment ) bad.append(
s );
309 else if (
s->links().length() > _maxNLinksForSegment ) bad.append(
s );
314 for (
unsigned j = 0; j < bad.length(); j++ )
316 _unused[id].append( bad[j]->links() );
317 _unused[2].append( bad[j]->links() );
319 HepAListDeleteAll( bad );
342 _allSegments[id][superLayerId].append( tmp );
343 _allUnused[id][superLayerId] = _allSegments[id][superLayerId];
347#ifdef TRKRECO_DEBUG_DETAIL
348 std::cout <<
"... segment finding finished" << std::endl;
352void TConformalFinder::linkSegments(
unsigned level ) {
354 unsigned superLayer = 5;
355 while ( --superLayer )
357 AList<TSegment>& segments = _allUnused[0][superLayer];
358 unsigned n = segments.length();
360 for (
unsigned i = 0; i <
n; i++ )
362 TSegment& base = *segments[i];
364 if ( base.
tracks().length() )
366 std::cout <<
"TConformalFinder::linkSegments !!! segment has ";
367 std::cout <<
"an assignment to track(s)" << std::endl;
377 while ( --superLayer )
379 AList<TSegment>& segments = _allUnused[0][superLayer];
380 AList<TSegment>& targets = _allUnused[0][superLayer - 1];
381 AList<TSegment>& targets2 = _allUnused[0][superLayer - 2];
382 unsigned n = segments.length();
383 for (
unsigned i = 0; i <
n; i++ )
385 TSegment& base = *segments[i];
387 if ( base.
tracks().length() )
389 std::cout <<
"TConformalFinder::linkSegments !!! segment has ";
390 std::cout <<
"an assignment to track(s)" << std::endl;
404 AList<TSegment>& candidates = base.
innerLinks();
405 TSegment* best = link( base, p,
v, targets, candidates, level );
406 if ( ( best == NULL ) && ( level > 0 ) && ( superLayer > 1 ) )
407 { best = link( base, p,
v, targets2, candidates, level ); }
408 if ( best ) candidates.insert( best );
412 unsigned m = candidates.length();
413 for (
unsigned j = 0; j < m; j++ ) candidates[j]->outerLinks().append( base );
455 while ( --superLayer )
457 cout <<
"SuperLayer: " << superLayer << endl;
458 AList<TSegment>& segments = _allUnused[0][superLayer];
459 unsigned n = segments.length();
460 for (
unsigned i = 0; i <
n; i++ )
462 TSegment& base = *segments[i];
463 cout <<
"Layer: " << base.
links()[0]->hit()->wire()->layerId()
464 <<
" Local: " << base.
links()[0]->hit()->wire()->localId()
465 <<
" innerSeg: " << base.
innerLinks().length() << endl;
472 displayStatus(
"Conf::linkSegments ... results" );
477void TConformalFinder::resolveSegments(
AList<TTrack>& trackCandidates )
const {
479 std::cout <<
"... resolving assignments" << std::endl;
483 AList<TSegment> multi;
484 unsigned n = trackCandidates.length();
485 for (
unsigned i = 0; i <
n; i++ )
487 TTrack&
t = *trackCandidates[i];
488 AList<TSegment>& segments =
t.segments();
489 unsigned nS = segments.length();
490 for (
unsigned j = 0; j < nS; j++ )
492 if ( segments[j]->tracks().length() > 1 ) multi.append( segments[j] );
499 for (
unsigned i = 0; i <
n; i++ )
501 TSegment&
s = *multi[i];
502 const AList<TTrack>& tracks =
s.tracks();
503 unsigned nT = tracks.length();
506 AList<TMLink> multiLinks;
507 const AList<TMLink>& links =
s.links();
508 unsigned nL = links.length();
509 for (
unsigned j = 0; j < nL; j++ )
511 TMLink& l = *links[j];
512 bool overlap =
false;
513 for (
unsigned k = 0; k < nT; k++ )
515 TTrack&
t = *tracks[k];
516 if (
t.links().hasMember( l ) ) overlap =
true;
518 multiLinks.append( l );
523 std::cout <<
" segment : ";
524 s.dump(
"hits sort flag" );
525 std::cout <<
" # of assigned tracks = " << nT << std::endl;
526 std::cout <<
" # of overlap TMLinks = " << multiLinks.length();
527 std::cout << std::endl;
530 nL = multiLinks.length();
531 for (
unsigned j = 0; j < nL; j++ )
533 TMLink& l = *multiLinks[j];
540 float bestDiff = 999999999.;
542 for (
unsigned k = 0; k < nT; k++ )
544 TTrack&
t = *tracks[k];
547 float diff = fabs( distance - l.
hit()->
drift() );
548 if ( diff < bestDiff )
555 for (
unsigned k = 0; k < nT; k++ )
557 TTrack&
t = *tracks[k];
558 if ( &
t == best )
continue;
564 std::cout <<
" " << l.
wire()->
name() <<
" -> ";
565 std::cout << best->
name() << std::endl;
574 std::cout <<
"... removing bad segments : # used seg = ";
575 std::cout <<
t.segments().length() << std::endl;
577#ifdef TRKRECO_DEBUG_DETAIL
578 for (
unsigned i = 0; i <
t.segments().length(); i++ )
579 t.segments()[i]->dump(
"hits sort flag",
" " );
582 const AList<TSegment>& segments =
t.segments();
583 AList<TSegment> bads;
586 unsigned n = segments.length();
587 for (
unsigned i = 0; i <
n; i++ )
589 TSegment&
s = *segments[i];
590 AList<TMLink> links =
Links(
s,
t );
591 unsigned nLinks = links.length();
593 unsigned nCores =
Cores( links ).length();
594 unsigned nCoresSegment =
s.nCores();
597 if ( ( nCores < _minNCoreLinks ) && ( nCores < ( ( nCoresSegment + 1 ) / 2 ) ) )
603 unsigned id = segments[i]->superLayerId();
605 if ( !
id ) innerMost = &
s;
614 if ( !bads.length() )
return bads;
617 std::cout <<
" bad segments : # = " << bads.length() << std::endl;
621 for (
unsigned i = 0; i <
n; i++ )
623 TSegment&
s = *bads[i];
626 AList<TMLink> links =
Links(
s,
t );
627 unsigned nLinks = links.length();
628 unsigned nCores =
Cores( links ).length();
629 std::cout <<
" # used links = " << nLinks;
630 std::cout <<
", # used cores = " << nCores << std::endl;
631 s.dump(
"hits sort flag",
" " );
634 s.tracks().remove(
t );
635 t.segments().remove(
s );
636 t.remove(
s.links() );
643 std::cout <<
"... refitting" << std::endl;
644 t.dump(
"detail",
"2nd> " );
653 std::cout << std::fixed << std::setprecision( 6 );
656 std::cout <<
" link : base = " << std::endl;
657 base.
dump(
"vector hits mc sort",
"-> " );
658 std::cout <<
" p=" << p <<
", v=" <<
v.unit() << std::endl;
666 unsigned n = candidates.length();
667 float maxAngle = -999.;
668 float minDistance = _linkMaxDistance[level];
669 float maxDirAngle = _linkMinDirAngle[level];
671 TSegment* best = NULL;
672 for (
unsigned j = 0; j <
n; j++ )
674 TSegment& current = *candidates[j];
676#ifdef TRKRECO_DEBUG_DETAIL
677 current.
dump(
"vector hits mc sort",
" " );
678 std::cout <<
" dist,dirAngle,angle=" << current.
distance( p,
v );
679 std::cout <<
"," << ( ( current.
position() - p ).
unit() ).dot(
v.unit() );
680 std::cout <<
"," <<
v.dot( current.
direction() ) << std::endl;
682 float distance = current.
distance( p,
v );
687 if ( distance > _linkMaxDistance[level] )
continue;
690 if ( dir.x() >
M_PI ) dir.setX( dir.x() -
PI2 );
691 else if ( dir.x() < -
M_PI ) dir.setX(
PI2 + dir.x() );
693 float dirAngle = dir.unit().dot(
v.unit() );
696 if ( dirAngle < _linkMinDirAngle[level] )
continue;
702 if ( dirAngle > maxDirAngle )
704 maxDirAngle = dirAngle;
707 alternatives.append( current );
711 std::cout <<
" # of best + alternatives = " << alternatives.length() << std::endl;
714 std::cout <<
" Best is ";
715 best->
dump(
"hits" );
719 alternatives.remove( best );
720 std::cout << std::defaultfloat;
721 if ( best )
return best;
725void TConformalFinder::deleteTrack(
TTrack&
t )
const {
726 const AList<TSegment>& segments =
t.segments();
727 unsigned n = segments.length();
728 for (
unsigned i = 0; i <
n; i++ )
730 TSegment&
s = *segments[i];
731 s.tracks().remove(
t );
737void TConformalFinder::removeUsedSegments(
const AList<TTrack>& tracks ) {
738 unsigned n = tracks.length();
739 for (
unsigned i = 0; i <
n; i++ )
741 TTrack&
t = *tracks[i];
742 AList<TSegment>& segments =
t.segments();
743 AList<TSegment> toBeRemoved;
744 unsigned nS = segments.length();
745 for (
unsigned j = 0; j < nS; j++ )
747 TSegment&
s = *segments[j];
748 unsigned sId =
s.superLayerId();
803 AList<TMLink> links =
Links(
s,
t );
804 if ( links.length() == 0 )
806 s.tracks().remove(
t );
807 toBeRemoved.append(
s );
809 std::cout <<
"!!! why this happends???" << std::endl;
810 std::cout <<
" no used link" << std::endl;
816 _allUnused[as][id].remove(
s );
819 const AList<TSegment>& outers =
s.outerLinks();
820 unsigned nO = outers.length();
823 for (
unsigned i = 0; i < nO; i++ )
825 outers[i]->innerLinks().remove(
s );
830 AList<TMLink> unused =
s.links();
831 unused.remove( links );
833 unsigned nUnused = unused.length();
859 segments.remove( toBeRemoved );
863void TConformalFinder::updateTLinks(
AList<TTrack>& tracks ) {
864 unsigned n = tracks.length();
865 for (
unsigned i = 0; i <
n; i++ )
867 const AList<TMLink>& links = tracks[i]->links();
868 unsigned nL = links.length();
869 for (
unsigned j = 0; j < nL; j++ )
871 TMLink& l = *links[j];
872 tracks[i]->approach( l );
880 _stage = ConformalInitialization;
883 static bool first =
true;
897 std::cout <<
name() <<
" ... processing"
898 <<
" axial=" << axial.length() <<
",stereo=" << stereo.length()
899 <<
",tracks=" << tracks.length() << std::endl;
908 _allHits[2].append( _allHits[0] );
909 _allHits[2].append( _allHits[1] );
914 cout <<
"axial Hits:" << _allHits[0].length() <<
" good axial hits:" << _hits[0].length()
916 <<
"stereo Hits:" << _allHits[1].length() <<
" good setero hits:" << _hits[1].length()
921 if ( _perfectSegmentFinding ) findSegmentsPerfect();
927 cout <<
"axial Seg: " << _allSegments[0][0].length() <<
", " << _allSegments[0][1].length()
928 <<
", " << _allSegments[0][2].length() <<
", " << _allSegments[0][3].length() <<
", "
929 << _allSegments[0][4].length() <<
", " << _allSegments[0][5].length()
930 <<
" stereo Seg: " << _allSegments[1][0].length() <<
", "
931 << _allSegments[1][1].length() <<
", " << _allSegments[1][2].length() <<
", "
932 << _allSegments[1][3].length() <<
", " << _allSegments[1][4].length() <<
", "
933 << _allSegments[1][5].length() << endl;
935 for (
int i = 0; i < 2; ++i )
937 if ( i == 0 ) cout <<
"Axial......" << endl;
938 else cout <<
"Stereo......" << endl;
939 for (
int j = 0; j < 6; ++j )
941 for (
int k = 0; k < _allSegments[i][j].length(); ++k )
943 cout <<
"SL(a/s): " << j <<
" seeds in Seg" << k <<
": "
944 << _allSegments[i][j][k]->links().length() << endl;
945 for (
int kk = 0; kk < _allSegments[i][j][k]->links().length(); ++kk )
946 cout <<
" layerId: " << _allSegments[i][j][k]->links()[kk]->hit()->wire()->layerId()
948 << _allSegments[i][j][k]->links()[kk]->hit()->wire()->localId() << endl;
956 _T0ResetDone =
false;
959 linkSegments( level );
960 fastFinding2D( level );
961 updateTLinks( _2DTracks );
966 std::cout <<
"TConformalFinder ... T0 reset is done" << std::endl;
972 _rphiWindow.skip(
false );
974 fastFinding3D( level );
975 updateTLinks( _2DTracks );
976 updateTLinks( _3DTracks );
979 _rphiWindow.skip(
false );
980 displayTracks( _2DTracks, _allUnused,
"all 2D after fast level 0" );
981 displayTracks( _3DTracks, _allUnused,
"all 3D after fast level 0" );
986 linkSegments( level );
987 fastFinding2D( level );
988 updateTLinks( _2DTracks );
991 _rphiWindow.skip(
false );
993 fastFinding3D( level );
994 updateTLinks( _2DTracks );
995 updateTLinks( _3DTracks );
998 _rphiWindow.skip(
false );
999 displayTracks( _2DTracks, _allUnused,
"all 2D after fast level 1" );
1000 displayTracks( _3DTracks, _allUnused,
"all 3D after fast level 1" );
1008 linkSegments( level );
1009 slowFinding2D( level );
1010 updateTLinks( _2DTracks );
1011#ifdef TRKRECO_WINDOW
1012 _rphiWindow.skip(
false );
1015 fastFinding3D( level );
1016 updateTLinks( _2DTracks );
1017 updateTLinks( _3DTracks );
1019#ifdef TRKRECO_WINDOW
1020 _rphiWindow.skip(
false );
1022 displayTracks( _2DTracks, _allUnused,
"all 2D after slow level 2" );
1023 displayTracks( _3DTracks, _allUnused,
"all 3D after slow level 2" );
1028 int zsltrk = _2DTracks.length();
1029 std::cout <<
name() <<
" ... # 3D tracks = " << _3DTracks.length()
1030 <<
", # 2D tracks = " << _2DTracks.length() << std::endl;
1031 for (
unsigned i = 0; i < zsltrk; i++ )
1034 cout <<
"pt:" << _2DTracks[i]->pt() <<
" impact:" << _2DTracks[i]->impact() << endl;
1042 tracks2D = _2DTracks;
1044 for (
int i = 0; i < _3DTracks.length(); i++ )
1047 _3DTracks[i]->setFinderType( 2 );
1052 for (
int nn = 0; nn < tracks2D.length(); ++nn )
1054 cout <<
"2D: " << nn <<
" radius: " << tracks2D[nn]->radius() << endl;
1055 for (
int mm = 0; mm < tracks2D[nn]->links().length(); ++mm )
1056 cout <<
"layer: " << tracks2D[nn]->links()[mm]->wire()->layerId()
1057 <<
" local: " << tracks2D[nn]->links()[mm]->wire()->localId() << endl;
1060 cout <<
"unused axial Seg: " << _allUnused[0][0].length() <<
", "
1061 << _allUnused[0][1].length() <<
", " << _allUnused[0][2].length() <<
", "
1062 << _allUnused[0][3].length() <<
", " << _allUnused[0][4].length() <<
", "
1063 << _allUnused[0][5].length()
1064 <<
" unused stereo Seg: " << _allUnused[1][0].length() <<
", "
1065 << _allUnused[1][1].length() <<
", " << _allUnused[1][2].length() <<
", "
1066 << _allUnused[1][3].length() <<
", " << _allUnused[1][4].length() <<
", "
1067 << _allUnused[1][5].length() << endl;
1069 for (
int i = 0; i < 2; ++i )
1071 if ( i == 0 ) cout <<
"unused axial hits: " << endl;
1072 else cout <<
"unused stereo hits: " << endl;
1073 for (
int k = 0; k < _allHits[i].length(); ++k )
1075 if ( _allHits[i][k]->hit()->state() &
WireHitUsed )
continue;
1077 cout <<
" layerId: " << _allHits[i][k]->hit()->wire()->layerId()
1078 <<
" localId: " << _allHits[i][k]->hit()->wire()->localId() << endl;
1080 if ( i == 0 ) cout <<
"unused axial link in segs: " << endl;
1081 else cout <<
"unused stereo link in segs: " << endl;
1082 for (
int j = 0; j < 6; ++j )
1084 for (
int k = 0; k < _allUnused[i][j].length(); ++k )
1086 cout <<
"sl: " << i <<
" " << j <<
" length of seg " << k <<
": "
1087 << _allUnused[i][j][k]->links().length() << endl;
1088 for (
int kk = 0; kk < _allUnused[i][j][k]->links().length(); ++kk )
1089 cout <<
" layerId: "
1090 << _allUnused[i][j][k]->links()[kk]->hit()->wire()->layerId()
1092 << _allUnused[i][j][k]->links()[kk]->hit()->wire()->localId() << endl;
1128void TConformalFinder::fastFinding3D(
unsigned level ) {
1130#ifdef TRKRECO_DEBUG_DETAIL
1131 std::cout <<
"... fast finding (3D) : level = " << level << std::endl;
1134 if ( _stage == ConformalSlow2D ) { _stage = ConformalSlow3D; }
1137 _stage = ConformalFast3DLevel0;
1138 if ( level == 1 ) _stage = ConformalFast3DLevel1;
1142 AList<TTrack> tracks3D;
1143 AList<TTrack> touched;
1144 AList<TSegment> bads;
1145 unsigned n = _2DTracks.length();
1146 for (
unsigned i = 0; i <
n; i++ )
1149 const TTrack&
t = *_2DTracks[i];
1152 cout <<
"links in 2Dtracks: " <<
t.links().length() << endl;
1153 for (
int ii = 0; ii <
t.links().length(); ++ii )
1155 cout <<
"layerId: " <<
t.links()[ii]->wire()->layerId()
1156 <<
" localId: " <<
t.links()[ii]->wire()->localId() << endl;
1158 cout <<
"center: " <<
t.center() <<
" radius = " <<
t.radius() << endl;
1161#ifdef TRKRECO_DEBUG_DETAIL
1162 std::cout <<
"==> fast 3D building : " <<
t.name() << std::endl;
1163 t.dump(
"hits sort flag",
" 2D track hits=" );
1165 AList<TSegment> segments = stereoSegments(
t );
1167 unsigned NS = segments.length();
1168 if (
NS >= 30 )
continue;
1177 AList<TSegment> badSegments;
1178 if ( _stereoMode == 2 ) badSegments = stereoSegmentsFromBadHits(
t );
1186#ifdef TRKRECO_WINDOW
1187 displayStatus(
"Conf::fast3D ... seed" );
1188 _rphiWindow.append( segments, leda_blue );
1189 _rphiWindow.append( badSegments, leda_red );
1190 _rphiWindow.oneShot(
t, leda_green );
1197 if ( _stereoMode )
s = _builder.buildStereoNew(
t, segments, badSegments );
1198 else s = _builder.buildStereo(
t, segments );
1199 HepAListDeleteAll( badSegments );
1203#ifdef TRKRECO_DEBUG_DETAIL
1204 std::cout <<
"... 3D failure" << std::endl;
1206#ifdef TRKRECO_WINDOW
1207 displayStatus(
"Conf::fastd3D ... 3D failed" );
1208 _rphiWindow.append( segments, leda_blue );
1209 _rphiWindow.oneShot(
t, leda_red );
1216#ifdef TRKRECO_DEBUG_DETAIL
1217 std::cout <<
"... 3D failure (bad quality)" << std::endl;
1219#ifdef TRKRECO_WINDOW
1220 displayStatus(
"Conf::fastd3D ... 3D failed (bad quality)" );
1221 _rphiWindow.append( segments, leda_blue );
1222 _rphiWindow.oneShot( *
s, leda_red );
1237 s->name(
t.name() +
"-3D" );
1239#ifdef TRKRECO_WINDOW
1240 displayStatus(
"Conf::fastd3D ... 3D ok" );
1241 _rphiWindow.append( segments, leda_blue );
1242 _rphiWindow.oneShot( *
s, leda_green );
1246 salvage( *
s, 3, bads );
1248 tracks3D.append(
s );
1249 touched.append( _2DTracks[i] );
1255 static AList<TTrack> tmp;
1258 removeUsedSegments( tmp );
1260 if ( tracks3D.length() > 20 )
break;
1261#ifdef TRKRECO_DEBUG_DETAIL
1262 std::cout <<
"... 3D finished : " <<
s->name() << std::endl;
1263 s->dump(
"detail",
" " );
1265#ifdef TRKRECO_WINDOW
1266 displayStatus(
"Conf::fastd3D ... finished" );
1267 _rphiWindow.oneShot( *
s, leda_green );
1272 _3DTracks.append( tracks3D );
1273 _2DTracks.remove( tracks3D );
1274 _2DTracks.remove( touched );
1275 for (
unsigned i = 0; i < touched.length(); i++ )
1277 deleteTrack( *touched[i] );
1282#ifdef TRKRECO_WINDOW
1283void TConformalFinder::displayStatus(
const std::string& m )
const {
1284 _rphiWindow.clear();
1285 _rphiWindow.text( m );
1286 _rphiWindow.append( _allHits[2], leda_pink );
1287 _rphiWindow.append( _hits[2], leda_cyan );
1288 _rphiWindow.append( _unused[2] );
1289 displayAppendSegments( _allSegments, leda_grey1 );
1290 displayAppendSegments( _allUnused, leda_orange );
1293void TConformalFinder::displayAppendSegments(
const AList<TSegment> a[2][6],
1294 leda_color c )
const {
1295 for (
unsigned i = 0; i < 2; i++ )
1297 for (
unsigned j = 0; j < 6; j++ )
1299 const AList<TSegment>& segments = a[i][j];
1300 unsigned n = segments.length();
1301 for (
unsigned k = 0; k <
n; k++ ) { _rphiWindow.append( *segments[k], c ); }
1306void TConformalFinder::displayTracks(
const AList<TTrack>& l,
1308 const std::string& c )
const {
1309 displayStatus(
"Conf::display ... " + c );
1310 for (
unsigned i = 0; i < l.length(); i++ ) _rphiWindow.append( *l[i], leda_green );
1315bool TConformalFinder::quality2D(
TTrack&
t,
unsigned level )
const {
1316#ifdef TRKRECO_WINDOW
1317 std::string
s =
"Conf::quality2D ... level " + std::to_string( level );
1321 if ( fabs(
t.radius() ) < 15. )
return false;
1326 if ( nSuperLayers < _minNSegments )
1329 std::cout <<
"... quality check : level=" << level <<
" : bad" << std::endl;
1330 std::cout <<
" reason : # segments(superlayer) =" << nSuperLayers;
1331 std::cout <<
" < " << _minNSegments << std::endl;
1333#ifdef TRKRECO_WINDOW
1334 s +=
" rejected because of few segments(superlayers)";
1336 _rphiWindow.oneShot(
t, leda_red );
1342#ifdef TRKRECO_WINDOW
1343 s +=
" ok : # of used segments(superlayers) = ";
1344 s += std::to_string( nSuperLayers );
1345 s +=
" > " + std::to_string( _minNSegments );
1347 _rphiWindow.oneShot(
t, leda_green );
1357 if ( n3 != nSuperLayers )
1364 std::cout <<
"... quality check : level = " << level <<
" : bad";
1365 std::cout << std::endl;
1366 std::cout <<
" reason : super layer pattern(n2) = 0 " << std::endl;
1368#ifdef TRKRECO_WINDOW
1369 s +=
" rejected because of bad super-layer pattern(n2=0)";
1371 _rphiWindow.oneShot(
t, leda_red );
1411 std::cout <<
"... quality check : level = " << level;
1412 std::cout <<
" : ok, super layer pattern = " << std::endl;
1415 for (
unsigned j = 0; j < 6; j++ )
1417 unsigned k = ( sl >> ( j * 2 ) ) % 2;
1419 if ( k ) ptn +=
"1";
1422 std::cout << std::endl;
1424#ifdef TRKRECO_WINDOW
1425 s +=
" ok : super layer ptn = " + ptn;
1427 _rphiWindow.oneShot(
t, leda_green );
1433void TConformalFinder::fastFinding2D(
unsigned level ) {
1435#ifdef TRKRECO_DEBUG_DETAIL
1436 std::cout <<
"... fast finding (2D) : level = " << level << std::endl;
1439 _stage = ConformalFast2DLevel0;
1440 if ( level == 1 ) _stage = ConformalFast2DLevel1;
1443 AList<TSegment>* segments = &_allUnused[0][0];
1445 unsigned idBase = _2DTracks.length() + _3DTracks.length();
1446 unsigned nTrial = 0;
1447 unsigned seedLayer = 5;
1458 while ( ( seedLayer-- ) > 1 )
1462 AList<TTrack> trackCandidates;
1463 unsigned n = segments[seedLayer].length();
1465 for (
unsigned i = 0; i <
n; i++ )
1467 TSegment& seed = *segments[seedLayer][i];
1468 std::string
name =
"f" + std::to_string( nTrial + idBase );
1473 std::cout <<
">>> fast 2D : super layer " << seedLayer <<
", ";
1474 std::cout << i <<
" : ";
1475 seed.
dump(
"link" );
1479 AList<TSegment> seeds;
1485 seeds.append( seed );
1488 cout <<
"seeds in fastFinding2D: " << seeds.length() << endl;
1489 for (
int kk = 0; kk < seeds.length(); ++kk )
1490 cout <<
"LayerId: " << seeds[kk]->links()[0]->wire()->layerId()
1491 <<
" LocalId: " << seeds[kk]->links()[0]->wire()->localId() << endl;
1498 for (
int k = 0; k < seeds.length(); ++k )
1499 seeds[k]->solveLR();
1501#ifdef TRKRECO_WINDOW
1502 displayStatus(
"Conf::fast2D ... seed segments" );
1503 _rphiWindow.oneShot( seeds, leda_green );
1508 std::cout <<
"==> fast building 2D : seed layer = " << seedLayer;
1509 std::cout <<
", " <<
name << std::endl;
1512 TTrack*
t = _builder.buildRphi( seeds );
1519 bool ok = quality2D( *
t, 0 );
1530 AList<TSegment> bads = removeBadSegments( *
t );
1535 if ( bads.length() )
1537 ok = quality2D( *
t, 1 );
1540 seeds = refineSegments( *
t );
1541 if ( seeds.length() >= _minNSegments )
1551 salvage( *
t, 1, bads );
1554 refineLinks( *
t, 2 );
1559 ok = quality2D( *
t, 2 );
1573 std::cout <<
"... 2D finished : " <<
t->name() << std::endl;
1574 t->dump(
"hits sort flag pull",
" " );
1576#ifdef TRKRECO_WINDOW
1577 displayStatus(
"Conf::fast2D ... finished" );
1578 _rphiWindow.oneShot( *
t, leda_green );
1583 trackCandidates.append(
t );
1587 resolveSegments( trackCandidates );
1599 removeUsedSegments( trackCandidates );
1609 _2DTracks.append( trackCandidates );
1612 resolveHits( _2DTracks );
1618 std::cout <<
"p = " << p << std::endl;
1619 float r = sqrt( 4. / p.mag2() );
1620 float phi = p.phi();
1621 return cdc.
wire( r, phi );
1625TConformalFinder::pickUpSegmentsInConformal(
float phi[12],
float loadWidth,
1626 unsigned axialStereoSwitch )
const {
1629 center.setPhi( phi[0] );
1632 for (
unsigned sl = 0; sl < 2; sl++ )
1636 if ( !( axialStereoSwitch & 1 ) )
continue;
1640 if ( !( axialStereoSwitch & 2 ) )
continue;
1642 for (
unsigned i = 0; i < 6; i++ )
1644 const AList<TSegment>& list = _allUnused[sl][i];
1645 unsigned n = list.length();
1646 for (
unsigned j = 0; j <
n; j++ )
1648 TSegment&
s = *list[j];
1651 if ( center.dot( p ) < 0. )
continue;
1654 const AList<TMLink>& inners =
s.inners();
1655 unsigned m = inners.length();
1656 for (
unsigned k = 0; k < m; k++ )
1658 float dPhi = phi[i * 2 + sl] - inners[k]->position().phi();
1659 dPhi = fabs( fmod( dPhi,
PI2 ) );
1660 if ( dPhi > (
PI2 - dPhi ) ) dPhi =
PI2 - dPhi;
1661 if ( dPhi < WIDTH[i * 2 + sl] * loadWidth )
1663 outList.append(
s );
1669 if ( found )
continue;
1670 const AList<TMLink>& outers =
s.outers();
1671 m = outers.length();
1672 for (
unsigned k = 0; k < m; k++ )
1674 float dPhi = phi[i * 2 + sl + 1] - outers[k]->position().phi();
1675 dPhi = fabs( fmod( dPhi,
PI2 ) );
1676 if ( dPhi > (
PI2 - dPhi ) ) dPhi =
PI2 - dPhi;
1677 if ( dPhi < WIDTH[i * 2 + sl] * loadWidth )
1679 outList.append(
s );
1690AList<TMLink> TConformalFinder::pickUpLinksInConformal(
float phi[12],
float loadWidth,
1691 unsigned axialStereoSwitch )
const {
1693 center.setPhi( phi[0] );
1695 AList<TMLink> outList;
1696 unsigned nBad = _unused[2].length();
1697 for (
unsigned i = 0; i < nBad; i++ )
1699 unsigned sl = _unused[2][i]->wire()->superLayerId();
1700 unsigned as = sl % 2;
1703 if ( !( axialStereoSwitch & 1 ) )
continue;
1707 if ( !( axialStereoSwitch & 2 ) )
continue;
1710 const HepPoint3D& p = _unused[2][i]->position();
1711 if ( center.dot( p ) < 0. )
continue;
1713 float dPhi = phi[sl] - _unused[2][i]->position().phi();
1714 dPhi = fabs( fmod( dPhi,
PI2 ) );
1715 if ( dPhi > (
PI2 - dPhi ) ) dPhi =
PI2 - dPhi;
1716 if ( dPhi < WIDTH[sl] * loadWidth )
1718 outList.append( _unused[2][i] );
1721 dPhi = phi[sl + 1] - _unused[2][i]->position().phi();
1722 dPhi = fabs( fmod( dPhi,
PI2 ) );
1723 if ( dPhi > (
PI2 - dPhi ) ) dPhi =
PI2 - dPhi;
1724 if ( dPhi < WIDTH[sl] * loadWidth ) outList.append( _unused[2][i] );
1729int TConformalFinder::crossPointsInConformal(
const AList<TSegment>& inList,
1732 static const float confRadius2[] = {
1733 4. / ( 8.3 * 8.3 ), 4. / ( 16.9 * 16.9 ), 4. / ( 21.7 * 21.7 ), 4. / ( 31.3 * 31.3 ),
1734 4. / ( 36.1 * 36.1 ), 4. / ( 44.1 * 44.1 ), 4. / ( 50.5 * 50.5 ), 4. / ( 58.5 * 58.5 ),
1735 4. / ( 64.9 * 64.9 ), 4. / ( 72.9 * 72.9 ), 4. / ( 79.3 * 79.3 ), 4. / ( 87.4 * 87.4 ) };
1738 AList<TMLink> forLine;
1740 unsigned n = inList.length();
1741 for (
unsigned i = 0; i <
n; i++ )
1744 forLine.append(
new TMLink( NULL, NULL, p ) );
1747 center *= 1. / float(
n );
1750 TMLine line( forLine );
1751 int err = line.fit();
1755 std::cout <<
"crossPoints ... failed due to line fit failure" << std::endl;
1757 HepAListDeleteAll( forLine );
1762 for (
unsigned i = 0; i < 12; i++ )
1765 float c = -line.a() * line.b();
1766 float d = 1. + line.a() * line.a();
1767 float e = sqrt( confRadius2[i] * d - line.b() * line.b() );
1768 p[0].setX( ( c + e ) / d );
1769 p[0].setY( line.a() * p[0].x() + line.b() );
1770 p[1].setX( ( c - e ) / d );
1771 p[1].setY( line.a() * p[1].x() + line.b() );
1773 float mag0 = ( center - p[0] ).mag();
1774 float mag1 = ( center - p[1] ).mag();
1776 if ( mag0 < mag1 ) points[i] = p[0];
1777 else points[i] = p[1];
1778#ifdef TRKRECO_DEBUG_DETAIL
1779 std::cout <<
"0,1 = " << p[0] <<
", " << p[1] << std::endl;
1783#ifdef TRKRECO_DEBUG_DETAIL
1784 std::cout <<
"... center is : " << center << std::endl;
1785 std::cout <<
"... cross points are : " << std::endl;
1786 for (
unsigned i = 0; i < 12; i++ )
1787 { std::cout <<
" " << i <<
" : " << points[i] << std::endl; }
1789#ifdef TRKRECO_WINDOW
1790 displayStatus(
"Conf::crossPoints ... line to salvage for conf plane" );
1791 _rphiWindow.append( inList, leda_green );
1792 _rphiWindow.oneShot( line, leda_blue );
1795 HepAListDeleteAll( forLine );
1801 std::cout <<
"... finding stereo segments" << std::endl;
1804 const AList<TSegment>& bases = (
const AList<TSegment>&)
t.segments();
1805 AList<TSegment> seeds;
1806 unsigned n = bases.length();
1807 if (
n == 0 )
return seeds;
1810 TPoint2D points[12];
1811 int err = crossPoints(
t, points );
1818 std::cout <<
"... stereo segment finding failed" << std::endl;
1825 AList<TSegment> list = pickUpSegments( points,
float( _stereoLoadWidth ), 2 );
1831 for (
unsigned i = 0; i <
n; i++ )
1833 const TSegment&
s = *bases[i];
1834 AList<TMLink> ll =
s.links();
1835 unsigned sl = ll[0]->wire()->axialStereoLayerId() / 4;
1836 dir[sl] = TPoint2D(
s.direction() );
1841 for (
unsigned i = 0; i < 5; i++ )
1843 if ( dir[i].mag() < .5 )
1846 while ( ( j < 5 ) && ( dir[j].mag() < .5 ) ) ++j;
1848 if ( dir[j].mag() < .5 )
1851 while ( ( j > 0 ) && ( dir[j].mag() < .5 ) ) --j;
1857#ifdef TRKRECO_DEBUG_DETAIL
1858 std::cout <<
" ... direction :" << std::endl;
1859 for (
unsigned i = 0; i < 6; i++ )
1860 std::cout <<
" " << i <<
" : " << dir[i] << std::endl;
1861 std::cout <<
" ... direction cos :" << std::endl;
1863 AList<TSegment> badList;
1864 AList<TSegment> toBeChecked[6];
1865 unsigned nL = list.length();
1866 for (
unsigned i = 0; i < 6; ++i ) toBeChecked[i].removeAll();
1868 for (
unsigned j = 0; j < nL; ++j )
1870 TSegment&
s = *list[j];
1871 AList<TMLink> ll =
s.links();
1872 unsigned sl = ll[0]->wire()->axialStereoLayerId() / 4;
1873 toBeChecked[sl].append(
s );
1876 for (
unsigned i = 0; i < 6; ++i )
1878 unsigned nToBeChecked = toBeChecked[i].length();
1879 if ( nToBeChecked < 4 )
continue;
1880 unsigned nBadList = badList.length();
1881 for (
unsigned j = 0; j < nToBeChecked; ++j )
1883 if ( ( badList.length() - nBadList ) >= nToBeChecked - 4 )
break;
1884 TSegment&
s = *toBeChecked[i][j];
1885 TPoint2D sDir =
s.direction();
1889 if ( sl < 2 ) aSl = 0;
1890 else if ( sl < 4 ) aSl = 2;
1892 if ( dir[aSl].dot( sDir ) < 0.7 ) badList.append(
s );
1893 if ( sl == 2 || sl == 3 || sl == 4 )
1895 if ( dir[aSl - 1].dot( sDir ) < 0.6 ) badList.append(
s );
1899 if ( dir[aSl + 1].dot( sDir ) < 0.6 ) badList.append(
s );
1902 toBeChecked[i].remove( badList );
1903 if ( toBeChecked[i].length() > 4 )
1905 AList<TSegment> tmp;
1906 unsigned nSegs = toBeChecked[i].length();
1907 for (
unsigned j = 0; j < nSegs; ++j )
1909 TSegment&
s = *toBeChecked[i][j];
1910 if (
s.links().length() > 3 ) tmp.append(
s );
1912 toBeChecked[i].remove( tmp );
1913 for (
unsigned j = 0; j < tmp.length(); ++j )
1915 AList<TMLink> tmpLinks = tmp[j]->links();
1916 for (
unsigned k = 0; k < toBeChecked[i].length(); ++k )
1918 TSegment& ss = *toBeChecked[i][k];
1919 AList<TMLink> threeLinks = ss.
links();
1920 for (
unsigned kk = 0; kk < threeLinks.length(); ++kk )
1922 TMLink& ll = *threeLinks[kk];
1923 if ( tmpLinks.hasMember( ll ) )
1925 badList.append( ss );
1933 toBeChecked[i].remove( badList );
1934 if ( toBeChecked[i].length() > 4 )
1936 AList<TSegment> temp;
1937 unsigned nSegs = toBeChecked[i].length();
1938 for (
unsigned k = 0; k < nSegs; ++k )
1940 TSegment&
s = *toBeChecked[i][k];
1944 for (
unsigned y = 0; y < nSegs; y++ )
1946 for (
unsigned x = 1;
x < nSegs - y;
x++ )
1948 TSegment& s1 = *temp[
x];
1949 TSegment& s2 = *temp[
x - 1];
1950 if ( s1.
links().length() < s2.
links().length() )
1952 TSegment& s0 = *temp[
x - 1];
1953 *temp[
x - 1] = *temp[
x];
1958 for (
unsigned j = 4; j < nSegs; ++j )
1960 TSegment& s4 = *temp[j];
1961 badList.append( s4 );
1965 toBeChecked[i].remove( badList );
1969 for (
unsigned j = 0; j < toBeChecked[i].length(); ++j )
1971 TSegment& s5 = *toBeChecked[i][j];
2008 list.remove( badList );
2012 std::cout <<
" ... bad segments :" << std::endl;
2013 for (
unsigned i = 0; i < badList.length(); i++ )
2014 badList[i]->
dump(
"hits sort",
" " );
2021 AList<TMLink> forLine;
2022 const TSegment*
s = &segment;
2025 if (
s->outerLinks().length() != 1 )
break;
2026 const TSegment* o =
s->outerLinks()[0];
2028 forLine.append(
new TMLink( NULL, NULL, p ) );
2032 if ( forLine.length() == 0 )
return segment.
direction();
2033 else if ( forLine.length() < 2 )
2035 HepAListDeleteAll( forLine );
2040 TMLine line( forLine );
2041 int err = line.fit();
2045 std::cout <<
"direction ... failed due to line fit failure" << std::endl;
2047 HepAListDeleteAll( forLine );
2051 HepAListDeleteAll( forLine );
2052 Vector3 tmp( -1., -( line.a() + line.b() ) );
2057void TConformalFinder::salvage(
TTrack& track,
unsigned asSwitch,
2059#ifdef TRKRECO_DEBUG_DETAIL
2060 std::cout <<
"... salvaging in real plane" << std::endl;
2064 TPoint2D points[12];
2065 int err = crossPoints( track, points );
2068#ifdef TRKRECO_DEBUG_DETAIL
2069 std::cout <<
"... salvaging failed in calculation of intersection" << std::endl;
2075 AList<TSegment> toBeChecked = pickUpSegments( points,
float( _salvageLoadWidth ), asSwitch );
2076 toBeChecked.remove( bads );
2077 toBeChecked.remove( track.
segments() );
2078 toBeChecked = trackSide( track, toBeChecked );
2081 AList<TMLink> links;
2082 unsigned nB = toBeChecked.length();
2083 for (
unsigned i = 0; i < nB; i++ )
2085 const AList<TMLink>& tmp = toBeChecked[i]->links();
2086 unsigned nL = tmp.length();
2087 for (
unsigned j = 0; j < nL; j++ )
2089 if ( tmp[j]->hit()->track() )
continue;
2090 links.append( tmp[j] );
2095 AList<TMLink> all = pickUpLinks( points,
float( _salvageLoadWidth ), asSwitch );
2097 std::cout <<
" pickUpLinks length = " << all.length() << std::endl;
2100 all = trackSide( track, all );
2101 all.remove( track.
links() );
2103 std::cout <<
" after reomove pickUpLinks length = " << all.length() << std::endl;
2105 links.append( all );
2107#ifdef TRKRECO_WINDOW
2108 AList<TMLink> tmp = links;
2112 _builder.salvage( track, links );
2115 const AList<TMLink>& usedLinks = track.
links();
2116 for (
unsigned i = 0; i < nB; i++ )
2118 TSegment& segment = *toBeChecked[i];
2119 AList<TMLink> used =
Links( segment, track );
2120 if ( used.length() == 0 )
continue;
2122 track.
segments().append( segment );
2123 segment.
tracks().append( track );
2126#ifdef TRKRECO_WINDOW
2127 displayStatus(
"Conf::salvage ... results" );
2128 TTrackBase y( tmp );
2129 _rphiWindow.append( y, leda_red );
2130 _rphiWindow.append( toBeChecked, leda_red );
2131 _rphiWindow.oneShot( track, leda_green );
2138int TConformalFinder::crossPoints(
const TTrack& track,
TPoint2D points[12] )
const {
2140#ifdef TRKRECO_DEBUG_DETAIL
2141 std::cout <<
" cross points are :" << std::endl;
2171 static const float R[] = { 7.3, 12.21, 18.9, 25.375, 31.86, 39.16,
2172 45.685, 52.215, 58.665, 65.91, 72.37, 80. };
2173 static const float R2[] = {
R[0] *
R[0],
R[1] *
R[1],
R[2] *
R[2],
R[3] *
R[3],
2174 R[4] *
R[4],
R[5] *
R[5],
R[6] *
R[6],
R[7] *
R[7],
2175 R[8] *
R[8],
R[9] *
R[9],
R[10] *
R[10],
R[11] *
R[11] };
2177 static const TPoint2D o( 0., 0. );
2178 TPoint2D c = track.
center();
2180 double r = fabs( track.
radius() );
2182 double d2 = c.
mag2();
2183 double d = sqrt( d2 );
2184 double sl = -c.
x() / c.
y();
2187 for (
unsigned i = 0; i < 12; i++ )
2189 double minR = r <
R[i] ? r :
R[i];
2190 double maxR = r <
R[i] ?
R[i] : r;
2192#ifdef TRKRECO_DEBUG_DETAIL
2193 std::cout <<
" r,R ... " << minR <<
", " << maxR <<
", " << d << std::endl;
2196 if ( ( r + R[i] < d ) || ( minR + d < maxR ) )
2202 double a = R2[i] + d2 - r2;
2203 double s = sqrt( 4. * R2[i] * d2 - a * a );
2204 double q = 0.5 * a / c.
y();
2205 points[i].
x( 0.5 * ( c.
x() * a + c.
y() *
s ) / d2 );
2206 points[i].
y(
q + sl * points[i].
x() );
2207 const double Bz = -1000 * ( getPmgnIMF()->getReferField() );
2208 if ( co.
cross( points[i] - c ) * track.
charge() * Bz > 0. )
2210 points[i].
x( 0.5 * ( c.
x() * a - c.
y() *
s ) / d2 );
2211 points[i].
y(
q + sl * points[i].
x() );
2213#ifdef TRKRECO_DEBUG_DETAIL
2214 std::cout <<
" " << i <<
" : " << points[i] << std::endl;
2215 std::cout <<
" chg=" << track.
charge() << std::endl;
2216 std::cout <<
", c=" << c <<
", co=" << std::endl;
2217 std::cout <<
", " << co.
cross( points[i] - c ) * track.
charge() << std::endl;
2218 std::cout <<
" " << 0.5 * ( c.
x() * a + c.
y() *
s ) / d2;
2219 std::cout <<
", " <<
q + sl * ( 0.5 * ( c.
x() * a + c.
y() *
s ) / d2 );
2220 std::cout <<
" " << 0.5 * ( c.
x() * a - c.
y() *
s ) / d2;
2221 std::cout <<
", " <<
q + sl * ( 0.5 * ( c.
x() * a - c.
y() *
s ) / d2 );
2222 std::cout << std::endl;
2225 if ( nOk )
return 0;
2230 unsigned axialStereoSwitch )
const {
2231 static const TPoint2D O( 0., 0. );
2232 AList<TSegment> outList;
2236 for (
unsigned sl = 0; sl < 2; sl++ )
2241 if ( !( axialStereoSwitch & 1 ) )
continue;
2246 if ( !( axialStereoSwitch & 2 ) )
continue;
2248 for (
unsigned i = 0; i < nMax; i++ )
2257 case 0: layerId = 2;
break;
2258 case 1: layerId = 3;
break;
2259 case 2: layerId = 4;
break;
2260 case 3: layerId = 9;
break;
2261 case 4: layerId = 10;
break;
2266 case 0: layerId = 0;
break;
2267 case 1: layerId = 1;
break;
2268 case 2: layerId = 5;
break;
2269 case 3: layerId = 6;
break;
2270 case 4: layerId = 7;
break;
2271 case 5: layerId = 8;
break;
2276 if (
x[layerId] == O )
continue;
2277 float a = WIDTH[layerId] * loadWidth;
2278 float phi0 =
x[layerId].phi();
2279 float phi1 =
x[layerId + 1].phi();
2280 float phiC = ( phi0 +
phi1 ) / 2.;
2281 float phiD = fabs( phi0 - phiC );
2282 if ( phiD > M_PI_2 )
2289 const AList<TSegment>& list = _allUnused[sl][i];
2290 unsigned n = list.length();
2291#ifdef TRKRECO_DEBUG_DETAIL
2292 std::cout <<
" pickUpSegments ... phi0,1,C,D=" << phi0 <<
",";
2293 std::cout <<
phi1 <<
"," << phiC <<
"," << phiD <<
" nhits " <<
n << std::endl;
2295 for (
unsigned j = 0; j <
n; j++ )
2297 TSegment&
s = *list[j];
2299#ifdef TRKRECO_DEBUG_DETAIL
2300 s.dump(
"hits sort",
" " );
2304 const AList<TMLink>& inners =
s.inners();
2305 unsigned m = inners.length();
2306 for (
unsigned k = 0; k < m; k++ )
2308 float phi = inners[k]->position().phi();
2309 if ( phi < 0. ) phi +=
PI2;
2310 float dPhi = fabs( phi - phiC );
2311 if ( dPhi >
M_PI ) dPhi =
PI2 - dPhi;
2312#ifdef TRKRECO_DEBUG_DETAIL
2313 std::cout <<
" " << inners[k]->wire()->name();
2314 std::cout <<
", phi,dPhi=" << phi <<
"," << dPhi << std::endl;
2318 outList.append(
s );
2324 if ( found )
continue;
2325 const AList<TMLink>& outers =
s.outers();
2326 m = outers.length();
2327 for (
unsigned k = 0; k < m; k++ )
2329 float phi = outers[k]->position().phi();
2330 if ( phi < 0. ) phi +=
PI2;
2331 float dPhi = fabs( phi - phiC );
2332 if ( dPhi >
M_PI ) dPhi =
PI2 - dPhi;
2333#ifdef TRKRECO_DEBUG_DETAIL
2334 std::cout <<
" " << outers[k]->wire()->name();
2335 std::cout <<
", phi,dPhi=" << phi <<
"," << dPhi << std::endl;
2339 outList.append(
s );
2351 unsigned axialStereoSwitch )
const {
2353 static const TPoint2D O( 0., 0. );
2354 AList<TMLink> outList;
2356 unsigned nBad = _unused[2].length();
2357 for (
unsigned i = 0; i < nBad; i++ )
2359 unsigned sl = _unused[2][i]->wire()->superLayerId();
2361 if ( _unused[2][i]->wire()->axial() ) as = 0;
2364 if ( !( axialStereoSwitch & 1 ) )
continue;
2368 if ( !( axialStereoSwitch & 2 ) )
continue;
2371 float a = WIDTH[sl] * loadWidth;
2372 float phi0 =
x[sl].phi();
2373 float phi1 =
x[sl + 1].phi();
2374 float phi = _unused[2][i]->position().phi();
2376 if ( phi < 0. ) phi +=
PI2;
2380 phi0 =
x[sl + 1].phi();
2382 float dPhi =
phi1 - phi0;
2387 if ( phi > phi0 && phi <
phi1 ) outList.append( _unused[2][i] );
2393 if ( phi < phi0 || phi >
phi1 ) outList.append( _unused[2][i] );
2395#ifdef TRKRECO_DEBUG_DETAIL
2396 std::cout <<
"TConformalFinder:: pickUpLinks " << std::endl;
2397 std::cout <<
"a " << a <<
" phi0 " << phi0 <<
" phi1 " <<
phi1 <<
" phi " << phi
2398 <<
" dPhi " << dPhi << std::endl;
2404void TConformalFinder::slowFinding2D(
unsigned level ) {
2406#ifdef TRKRECO_DEBUG_DETAIL
2407 std::cout <<
"... slow finding (2D) : level = " << level << std::endl;
2410 _stage = ConformalSlow2D;
2413 AList<TSegment>* segments = &_allUnused[0][0];
2415 unsigned id = _2DTracks.length() + _3DTracks.length();
2416 unsigned seedLayer = 5;
2417 while ( seedLayer-- )
2421 AList<TSegment> tmp = segments[seedLayer];
2422 unsigned n = tmp.length();
2423 for (
unsigned i = 0; i <
n; i++ )
2425 AList<TTrack> trackCandidates;
2426 TSegment& current = *tmp[i];
2427 if ( current.
links().length() < 3 )
continue;
2428 if ( current.
innerLinks().length() != 1 )
continue;
2429 if ( current.
innerLinks()[0]->links().length() < 3 )
continue;
2430 AList<TSegment> seeds;
2431 seeds.append( current );
2434 std::string
name =
"s" + std::to_string(
id );
2437 std::cout <<
"==> slow building : " <<
name << std::endl;
2441 for (
int k = 0; k < seeds.length(); ++k )
2442 seeds[k]->solveLR();
2444 TTrack*
t = expand( seeds );
2447 AList<TSegment> bads;
2449 salvage( *
t, 1, bads );
2450 if ( !trackQuality( *
t ) )
2458 trackCandidates.append(
t );
2461 std::cout <<
"... 2D finished : " <<
t->name() << std::endl;
2462 t->dump(
"hits sort flag pull",
" " );
2464#ifdef TRKRECO_WINDOW
2465 displayStatus(
"Conf::expand ... finished" );
2466 _rphiWindow.oneShot( *
t, leda_green );
2468 removeUsedSegments( trackCandidates );
2469 _2DTracks.append( trackCandidates );
2470 id = _2DTracks.length() + _3DTracks.length();
2482#ifdef TRKRECO_WINDOW
2483 displayStatus(
"Conf::expand ... seeds" );
2484 _rphiWindow.oneShot( seeds, leda_green );
2487 std::cout <<
"... expand : # of seeds = " << seeds.length() << std::endl;
2490 if ( seeds.length() > 2 )
2492 TTrack*
t = _builder.buildRphi( seeds );
2495 if ( !trackQuality( *
t ) )
2504 AList<TMLink> links =
Links( seeds );
2507 t =
new TTrack( c );
2509 t->segments().append( seeds );
2511 return expand( *
t );
2515#ifdef TRKRECO_WINDOW
2516 displayStatus(
"Conf::expand ... seed track" );
2517 _rphiWindow.oneShot( ti, leda_green );
2520 std::cout <<
"... expand : by a track" << std::endl;
2524 AList<TSegment> seeds =
t->segments();
2525 unsigned nSegments = seeds.length();
2526 unsigned nCores =
t->nCores();
2527 unsigned nTrial = 0;
2535 targetSuperLayer( sl, inner, outer );
2537 unsigned target = inner;
2538 if ( target == 11 ) target = outer;
2539 if ( target == 11 )
break;
2542 AList<TSegment> segments = targetSegments( *
t, target );
2543 if ( segments.length() == 0 )
2545 unsigned fl[5] = { 2, 3, 4, 9, 10 };
2546 unsigned inner2 = 0;
2547 unsigned outer2 = 5;
2548 for (
int i = 0; i < 5; i++ )
2550 if ( fl[i] == inner ) inner2 = i;
2551 if ( fl[i] == outer ) outer2 = i;
2553 if ( inner > 2 && inner2 > 0 ) target = fl[inner2 - 1];
2554 if ( target == 9 ) { target = fl[outer2 + 1]; }
2555 if ( target == 13 )
break;
2556 segments = targetSegments( *
t, target );
2559 std::cout <<
"... expand : segments to be checked = ";
2560 std::cout << segments.length() << std::endl;
2562#ifdef TRKRECO_WINDOW
2563 displayStatus(
"Conf::expand ... candidate segments" );
2564 _rphiWindow.append( segments, leda_blue );
2565 _rphiWindow.oneShot( *
t, leda_green );
2569 unsigned n = segments.length();
2570 AList<TTrack> tracks;
2571 for (
unsigned i = 0; i <
n; i++ )
2573 segments[i]->solveLR();
2574 AList<TSegment> seed0 = seeds;
2575 seed0.append( segments[i] );
2576 TTrack* t0 = _builder.buildRphi( seed0 );
2577 if ( !t0 )
continue;
2578 if ( ( t0->
segments().length() <= nSegments ) || ( t0->
nCores() <= nCores ) ||
2584 std::cout <<
"... expand : candidate deleted" << std::endl;
2587 tracks.append( t0 );
2591 std::cout <<
"... expand : target superlayer = " << target;
2592 std::cout <<
", # of track candidates = " << tracks.length() << std::endl;
2596 if ( tracks.length() == 0 )
2598 AList<TMLink> links = targetLinks( *
t, target );
2599 _builder.salvage( *
t, links );
2601 if ( newSl & ( 1 << ( target ) ) )
2604 std::cout <<
"... expand : links to be appended = ";
2605 std::cout << links.length() << std::endl;
2607#ifdef TRKRECO_WINDOW
2608 displayStatus(
"Conf::expand ... candidate links" );
2609 _rphiWindow.append( links, leda_blue );
2610 _rphiWindow.oneShot( *
t, leda_green );
2612 TTrack* t0 =
new TTrack( *
t );
2619 std::cout <<
"... expand : candidate deleted" << std::endl;
2622 tracks.append( t0 );
2628 std::cout <<
"... expand : # of track candidates = " << tracks.length() << std::endl;
2632 unsigned nTracks = tracks.length();
2633 if ( nTracks == 0 )
break;
2634 TTrack* tNew = tracks[0];
2635 unsigned nBestCores = tNew->
nCores();
2636 for (
unsigned i = 1; i < nTracks; i++ )
2638 if ( tracks[i]->nCores() > nBestCores )
2640 deleteTrack( *tNew );
2642 nBestCores = tNew->
nCores();
2644 else { deleteTrack( *tracks[i] ); }
2646 nSegments = tNew->
segments().length();
2647 nCores = nBestCores;
2651 if ( !trackQuality( *tNew ) )
2653 deleteTrack( *tNew );
2661 if (
t == &ti ) std::cout <<
"... expand : failed" << std::endl;
2662 else std::cout <<
"... expand : track expanded" << std::endl;
2664#ifdef TRKRECO_WINDOW
2665 displayStatus(
"Conf::expand ... finished" );
2666 _rphiWindow.oneShot( *
t, leda_green );
2672void TConformalFinder::targetSuperLayer(
unsigned sl,
unsigned& inner,
2673 unsigned& outer )
const {
2676 bool innerFound =
false;
2677 bool outerFound =
false;
2678 for (
unsigned i = 0; i < 5; i++ )
2680 unsigned fl[5] = { 2, 3, 4, 9, 10 };
2683 if ( sl & ( 1 << ( fl[i] ) ) ) innerFound =
true;
2688 if ( sl & ( 1 << ( fl[4 - i] ) ) ) outerFound =
true;
2689 else outer = fl[4 - i];
2695 AList<TSegment> targets;
2698 TPoint2D points[12];
2699 int err = crossPoints(
t, points );
2703 std::cout <<
" ... no target found" << std::endl;
2709 AList<TSegment> toBeChecked = pickUpSegments( points, 3, 1 );
2710 unsigned n = toBeChecked.length();
2711 for (
unsigned i = 0; i <
n; i++ )
2713 if ( toBeChecked[i]->superLayerId() == sl ) targets.append( toBeChecked[i] );
2720 AList<TMLink> targets;
2723 TPoint2D points[12];
2724 int err = crossPoints(
t, points );
2728 std::cout <<
" ... no target found" << std::endl;
2734 AList<TMLink> toBeChecked = pickUpLinks( points, 3, 1 );
2735 unsigned n = toBeChecked.length();
2736 for (
unsigned i = 0; i <
n; i++ )
2738 if ( toBeChecked[i]->wire()->superLayerId() == sl ) targets.append( toBeChecked[i] );
2745 const AList<TSegment>& original =
t.segments();
2746 AList<TSegment> outList;
2747 unsigned n = original.length();
2748 for (
unsigned i = 0; i <
n; i++ )
2750 AList<TMLink> tmp =
Links( *original[i],
t );
2751 if ( tmp.length() >= _minNLinksForSegmentInRefine ) outList.append( original[i] );
2755 unsigned nStart = 0;
2758 unsigned fl[5] = { 2, 3, 4, 9, 10 };
2759 for (
unsigned i = 0; i < 5; i++ )
2761 if ( sl & ( 1 << fl[i] ) )
2764 if ( nC == 1 ) nS = i;
2776 outList.removeAll();
2777 if ( nCMax >= _minNSegments )
2779 for (
unsigned i = 0; i <
n; i++ )
2781 unsigned id = original[i]->superLayerId();
2782 if ( (
id >= fl[nStart] ) && (
id < fl[nStart + nCMax] ) ) outList.append( original[i] );
2787 std::cout <<
"... refine segments : orignal sl = ";
2789 std::cout <<
", output sl = ";
2791 std::cout << std::endl;
2797bool TConformalFinder::trackQuality(
const TTrack&
t )
const {
2802 if ( fabs(
t.radius() ) < 15. )
return false;
2804#ifdef TRKRECO_WINDOW
2805 std::cout <<
"... trackQuality : n1,n3,nMissing=" <<
n1 <<
"," << n3;
2808#ifdef TRKRECO_WINDOW
2809 displayStatus(
"trackQuality" );
2811 _rphiWindow.oneShot(
t, leda_red );
2812 else _rphiWindow.oneShot(
t, leda_green );
2814 if ( n3 < 2 )
return false;
2820void TConformalFinder::refineLinks(
TTrack&
t,
unsigned minN )
const {
2821 const AList<TMLink>& links =
t.links();
2822 AList<TMLink> sl[11];
2823 unsigned n = links.length();
2824 for (
unsigned i = 0; i <
n; i++ ) sl[links[i]->wire()->superLayerId()].append( links[i] );
2825 AList<TMLink> toBeRemoved;
2826 for (
unsigned i = 0; i < 11; i++ )
2827 if ( sl[i].length() < minN ) toBeRemoved.append( sl[i] );
2828 t.remove( toBeRemoved );
2830 std::cout <<
"... refining links : removed links = " << toBeRemoved.length();
2831 std::cout << std::endl;
2836 static const TPoint2D o( 0., 0. );
2837 TPoint2D c =
t.center();
2841 unsigned n = a.length();
2842 for (
unsigned i = 0; i <
n; i++ )
2844 TPoint2D
x = a[i]->wire()->xyPosition();
2845 const double Bz = -1000 * ( getPmgnIMF()->getReferField() );
2846 if ( co.
cross(
x - c ) *
t.charge() * Bz < 0. ) tmp.append( a[i] );
2853 static const TPoint2D o( 0., 0. );
2854 TPoint2D c =
t.center();
2857 AList<TSegment> tmp;
2858 unsigned n = a.length();
2859 for (
unsigned i = 0; i <
n; i++ )
2861 const AList<TMLink>& b = a[i]->links();
2863 unsigned nB = b.length();
2864 for (
unsigned j = 0; j < nB; j++ )
2866 TPoint2D
x = b[j]->wire()->xyPosition();
2868 const double Bz = -1000 * ( getPmgnIMF()->getReferField() );
2869 if ( co.
cross(
x - c ) *
t.charge() * Bz > 0. )
2875 if ( bad )
continue;
2881void TConformalFinder::resolveHits(
AList<TTrack>& tracks )
const {
2882 unsigned nTracks = tracks.length();
2883 if ( nTracks < 2 )
return;
2885 for (
unsigned i = 0; i < nTracks - 1; i++ )
2887 TTrack& t0 = *tracks[i];
2888 const AList<TMLink>& links0 = t0.
links();
2889 unsigned n0 = links0.length();
2890 AList<TMLink> remove0;
2891 for (
unsigned j = i + 1; j < nTracks; j++ )
2893 TTrack& t1 = *tracks[j];
2894 const AList<TMLink>& links1 = t1.
links();
2895 unsigned n1 = links1.length();
2896 AList<TMLink> remove1;
2899 for (
unsigned k = 0; k < n0; k++ )
2901 TMLink& l = *links0[k];
2904 if ( links1.hasMember( l ) )
2906 TMLink l0( NULL, l.
hit() );
2907 TMLink l1( NULL, l.
hit() );
2910 if ( l0.pull() > l1.pull() ) remove0.append( l );
2911 else remove1.append( l );
2915 if ( remove1.length() )
2922 if ( remove0.length() )
2933 for (
unsigned i = 0; i < 6; i++ )
output.append(
new TSegment() );
2936 TPoint2D points[12];
2937 int err = crossPoints(
t, points );
2940#ifdef TRKRECO_DEBUG_DETAIL
2941 std::cout <<
"... conf::stereoSegBadHits : "
2942 <<
"error in calculation of intersection" << std::endl;
2947 static const TPoint2D O( 0., 0. );
2948 unsigned nBad = _unused[2].length();
2949 for (
unsigned i = 0; i < nBad; i++ )
2951 unsigned sl = _unused[2][i]->wire()->superLayerId();
2952 unsigned asl = _unused[2][i]->wire()->axialStereoLayerId() / 4;
2954 if ( _unused[2][i]->wire()->axial() ) as = 0;
2957 if ( as == 0 )
continue;
2959 float a = WIDTH[sl] * _salvageLoadWidth;
2960 float phi0 = points[sl].
phi();
2961 float phi1 = points[sl + 1].
phi();
2962 float phi = _unused[2][i]->position().phi();
2963 if ( phi < 0. ) phi +=
PI2;
2967 phi0 = points[sl + 1].
phi();
2969 float dPhi =
phi1 - phi0;
2974 if ( phi > phi0 && phi <
phi1 )
2976 output[asl / 4]->append( *_unused[2][i] );
2982 if ( phi < phi0 || phi >
phi1 )
output[asl / 4]->append( *_unused[2][i] );
2989void TConformalFinder::findSegmentsPerfect(
void ) {
2992 AList<TMLink> links[11];
2993 unsigned nHits = _hits[2].length();
2994 for (
unsigned i = 0; i < nHits; i++ )
2996 TMLink& l = *_hits[2][i];
3004 for (
unsigned i = 0; i < 11; i++ )
3006 unsigned superLayerId = i / 2;
3007 unsigned id = i % 2;
3010 AList<TMLink>** seeds = (AList<TMLink>**)malloc( nHep *
sizeof( AList<TMLink>* ) );
3011 for (
unsigned j = 0; j < nHep; j++ ) seeds[j] = NULL;
3014 unsigned n = links[i].length();
3015 for (
unsigned j = 0; j <
n; j++ )
3017 TMLink& l = *links[i][j];
3018 const TMDCWireHitMC* mc = l.
hit()->
mc();
3019 if ( !l.
hit()->
mc() )
3021 std::cout <<
"TConformalFinder::findSegmentsPerfect !!! "
3022 <<
"no MC info. found ... aborted" << std::endl;
3025 const unsigned id = mc->
hep()->
id();
3027 if ( !seeds[
id] ) seeds[id] =
new AList<TMLink>();
3028 seeds[id]->append( l );
3032 AList<TSegment> segments;
3033 for (
unsigned j = 0; j < nHep; j++ )
3035 if ( !seeds[j] )
continue;
3037 const unsigned length = seeds[j]->length();
3038 if ( length < _minNLinksForSegment )
continue;
3039 if ( length > _maxNLinksForSegment )
continue;
3040 if (
Width( *seeds[j] ) > _maxWidthForSegment )
continue;
3042 TSegment&
s = *
new TSegment();
3043 s.append( *seeds[j] );
3044 segments.append(
s );
3046 _allSegments[id][superLayerId].append( segments );
3047 _allUnused[id][superLayerId] = _allSegments[id][superLayerId];
3050 for (
unsigned j = 0; j < nHep; j++ )
3052 if ( seeds[j] )
delete seeds[j];
3057#ifdef TRKRECO_DEBUG_DETAIL
3058 std::cout <<
"... segment finding(perfect) finished" << std::endl;
3062void TConformalFinder::findSegmentsTsf(
void ) {
3064 AList<TMLink> links[11];
3065 unsigned n = _hits[2].length();
3066 for (
unsigned i = 0; i <
n; i++ )
3068 TMLink& l = *_hits[2][i];
3076 for (
unsigned i = 0; i < 11; ++i ) tsf[i] =
new TMDCTsf( i );
3078 for (
unsigned i = 0; i < 11; i++ )
3080 unsigned superLayerId;
3131 AList<TSegment> tmp = tsf[i]->
segments( links[i] );
3134 _allSegments[id][superLayerId].append( tmp );
3135 _allUnused[id][superLayerId] = _allSegments[id][superLayerId];
3150 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
3151 if ( scmgn != StatusCode::SUCCESS )
3152 { std::cout <<
"Unable to open Magnetic field service" << std::endl; }
HepGeom::Vector3D< double > HepVector3D
HepGeom::Point3D< double > HepPoint3D
*******INTEGER m_nBinMax INTEGER m_NdiMax !No of bins in histogram for cell exploration division $ !Last vertex $ !Last active cell $ !Last cell in buffer $ !No of sampling when dividing cell $ !No of function total $ !Flag for random ceel for $ !Flag for type of for WtMax $ !Flag which decides whether vertices are included in the sampling $ entire domain is hyp !Maximum effective eevents per saves r n generator level $ !Flag for chat level in output
*******INTEGER m_nBinMax INTEGER m_NdiMax !No of bins in histogram for cell exploration division $ !Last vertex $ !Last active cell $ !Last cell in buffer $ !No of sampling when dividing cell $ !No of function total $ !Flag for random ceel for $ !Flag for type of for WtMax $ !Flag which decides whether vertices are included in the sampling $ entire domain is hyp !Maximum effective eevents per saves r n generator level $ !Flag for chat level in !Latex Output unit
CLHEP::Hep3Vector Vector3
const HepPoint3D ORIGIN
Constants.
void bitDisplay(unsigned)
#define WireHitConformalFinder
unsigned SuperLayer(const AList< TMLink > &list)
returns super layer pattern.
unsigned Width(const AList< TMLink > &)
unsigned NSuperLayers(const AList< TMLink > &links)
returns # of layers.
AList< TMLink > Cores(const AList< TMLink > &input)
unsigned NMissingAxialSuperLayers(const AList< TMLink > &links)
unsigned NMajorLinks(const TSegment &a)
returns # of links in the major link.
AList< TMLink > Links(const TSegment &, const TTrack &)
returns AList of TMLink used for a track.
unsigned NUniqueLinks(const TSegment &a)
checks property of segments.
TSegment * OuterMostUniqueLink(const TSegment &a)
returns a segment to the outer-most unique segment.
AList< TSegment > UniqueLinks(const TSegment &a)
returns a list of unique segments in links.
AList< TSegment > MajorLinks(const TSegment &a)
returns a list of segments in major links.
#define TrackOldConformalFinder
****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
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
virtual int debugLevel(void) const
returns debug level.
virtual void dump(const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
dumps debug information.
AList< TSegment > segments(void) const
returns an AList<TSegment0> using clusters() function.
void fillPhi(const AList< TMLink > &links)
fills with hits.
AList< TSegment > segments(const AList< TMLink > &links)
finds segments.
const TTrackHEP *const hep(void) const
returns a pointer to a GEN_HEPEVT.
float drift(unsigned) const
returns drift distance.
const TMDCWireHitMC *const mc(void) const
returns a pointer to TMDCWireHitMC.
A class to represent a wire in MDC.
unsigned superLayerId(void) const
returns super layer id.
std::string name(void) const
returns name.
const TMDCWire *const wire(unsigned wireId) const
returns a pointer to a wire. 0 will be returned if 'wireId' is invalid.
static TMDC * getTMDC(void)
const HepPoint3D & positionOnWire(void) const
returns the closest point on wire to a track.
const HepPoint3D & positionOnTrack(void) const
returns the closest point on track to wire.
const TMDCWireHit * hit(void) const
returns a pointer to a hit.
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
A class to relate TMDCWireHit and TTrack objects.
const HepVector3D & direction(void) const
returns direction.
void dump(const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
dumps debug information.
AList< TSegment > & outerLinks(void)
const HepPoint3D & position(void) const
returns position.
double distance(const TSegment &) const
calculates distance between two clusters. Smaller value indicates closer.
AList< TSegment > & innerLinks(void)
AList< TTrack > & tracks(void)
virtual int fit(void)
fits itself by a default fitter. Error was happened if return value is not zero.
const AList< TMLink > & links(unsigned mask=0) const
void remove(TMLink &a)
removes a TMLink.
unsigned nCores(unsigned mask=0) const
returns # of masked TMLinks for fit. 'mask' will be applied if mask is not 0.
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.
unsigned id(void) const
returns an id started from 0.
static const AList< TTrackHEP > & list(void)
returns a list of TTrackHEP's.
static void maskBadHits(const AList< TTrack > &, float maxSigma2)
masks hits with large chisq as associated hits. Pull in TMLink is used.
static bool goodTrack(const TTrack &, bool track2D=false)
checks goodness of a track.
A class to represent a track in tracking.
AList< TSegment > & segments(void)
returns AList<TSegment>.
const std::string & name(void) const
returns/sets name.
TPoint2D center(void) const
returns position of helix center.
double radius(void) const
returns signed radius.
int approach(TMLink &) const
double charge(void) const
returns charge.
complex_t R(double Q2, double M2, double G, double Mp2, double Mm2)