13#include "TrkReco/TSegment.h"
14#include "TrkReco/TMDC.h"
15#include "TrkReco/TMDCUtil.h"
16#include "TrkReco/TMDCWire.h"
17#include "TrkReco/TMDCWireHit.h"
18#include "TrkReco/TMLink.h"
19#include "TrkReco/TTrack.h"
21#include "TrkReco/Range.h"
23#include "CLHEP/Matrix/Vector.h"
24#include "CLHEP/Vector/ThreeVector.h"
27TMDC* TSegment::_cdc = 0;
39 , _lineTsf( 0., 0., 0. ) {
66 , _lineTsf( 0., 0., 0. ) {
116 if ( msg ==
"" ) def =
true;
118 if ( def || msg.find(
"cluster" ) != std::string::npos ||
119 msg.find(
"detail" ) != std::string::npos )
122 std::cout <<
"#links=" <<
_links.length();
123 std::cout <<
"(" << _innerWidth <<
"," << _outerWidth <<
":";
124 std::cout <<
clusterType() <<
")," << _nDual <<
"," << _duality <<
",";
125 std::cout << _angle << std::endl;
127 if ( def || msg.find(
"vector" ) != std::string::npos ||
128 msg.find(
"detail" ) != std::string::npos )
131 std::cout <<
"pos" << _position <<
","
132 <<
"dir" << _direction;
133 std::cout << std::endl;
135 if ( def || msg.find(
"state" ) != std::string::npos ||
136 msg.find(
"detail" ) != std::string::npos )
139 std::cout <<
"state=" << _state << std::endl;
141 if ( def || msg.find(
"link" ) != std::string::npos ||
142 msg.find(
"detail" ) != std::string::npos )
146 std::cout <<
",major links=" <<
NMajorLinks( *
this );
148 std::cout << std::endl;
161 if (
_links.length() == 0 )
return;
164 _innerMostLayer =
_links[0]->wire()->layerId();
165 _outerMostLayer = _innerMostLayer;
166 for (
unsigned i = 1; i <
_links.length(); i++ )
168 unsigned id =
_links[i]->wire()->layerId();
169 if (
id < _innerMostLayer ) _innerMostLayer = id;
170 else if (
id > _outerMostLayer ) _outerMostLayer = id;
172 _nLayer = _outerMostLayer - _innerMostLayer + 1;
174 double centerX =
_links[0]->position().x();
179 for (
unsigned i = 0; i <
n; i++ )
190 unsigned id =
_links[i]->wire()->layerId();
191 if (
id == _innerMostLayer )
195 _inners.append(
_links[i] );
197 if (
id == _outerMostLayer )
199 _outerPosition += tmp;
201 _outers.append(
_links[i] );
210 _innerWidth =
Width( _inners );
211 _outerWidth =
Width( _outers );
212 _position *= ( 1. / float(
n ) );
214 inner *= ( 1. / (float)nInner );
215 _outerPosition *= ( 1. / (float)nOuter );
216 _direction = ( inner - _outerPosition ).
unit();
247 if ( dir.x() >
M_PI ) dir.setX( dir.x() - 2. *
M_PI );
248 else if ( dir.x() < -
M_PI ) dir.setX( 2. *
M_PI + dir.x() );
250 float radial = fabs( _direction.dot( dir ) );
251 float radial2 = radial * radial;
253 return ( dir.mag2() - radial2 ) > 0.0 ? sqrt( dir.mag2() - radial2 ) : 0.;
258 if ( dir.x() >
M_PI ) dir.setX( dir.x() - 2. *
M_PI );
259 else if ( dir.x() < -
M_PI ) dir.setX( 2. *
M_PI + dir.x() );
261 float radial = fabs(
v.unit().dot( dir ) );
262 float radial2 = radial * radial;
264 return ( dir.mag2() - radial2 ) > 0.0 ? sqrt( dir.mag2() - radial2 ) : 0.;
268#ifdef TRKRECO_DEBUG_DETAIL
271 std::cout <<
"TSegment::range !!! bad arguments:min,max=";
272 std::cout <<
min <<
"," <<
max << std::endl;
277 if (
n == 0 )
return Range( 0., 0. );
282 for (
unsigned i = 0; i <
n; i++ )
284 double x =
_links[i]->position().x();
290 if ( !found )
return Range( 0., 0. );
292#ifdef TRKRECO_DEBUG_DETAIL
296 double distanceR = 0.;
297 double distanceL = 0.;
298 double distanceMax =
max -
min;
299 for (
unsigned i = 0; i <
n; i++ )
301 double x =
_links[i]->position().x();
304 double distance0, distance1;
308 distance1 = distanceMax - distance0;
313 distance0 = distanceMax - distance1;
316 if ( distance0 < distance1 )
318 if ( distance0 > distanceR ) distanceR = distance0;
322 if ( distance1 > distanceL ) distanceL = distance1;
325#ifdef TRKRECO_DEBUG_DETAIL
336 double right =
center + distanceR;
337 double left =
center - distanceL;
339 return Range( left, right );
342void TSegment::updateType(
void )
const {
355 if ( ( _innerWidth < fat ) && ( _outerWidth < fat ) )
360 if ( _nLayer > tall ) _clusterType = 2;
365 else if ( _outerWidth < fat )
372 else if ( _innerWidth < fat )
382 for (
unsigned i = _innerMostLayer; i <= _outerMostLayer; i++ )
386 for (
unsigned j = 0; j <
_links.length(); j++ )
387 if (
_links[j]->wire()->layerId() == i )
401 if ( space ) _clusterType = 6;
411#ifdef TRKRECO_DEBUG_DETAIL
412 std::cout <<
" ... splitting : type=" <<
t << std::endl;
414 if (
t == 0 )
return list;
423 if ( _nDual > 2 && _duality > 0.7 && _angle > 0.7 )
return splitDual();
426 else if (
t == 1 )
return list;
427 else if (
t == 7 )
return list;
430 else if (
t == 6 )
return splitParallel();
434 else if (
t > 4 )
return splitComplicated();
446 if (
t == 3 ) corners = &_outers;
447 else corners = &_inners;
449 for (
unsigned i = 0; i < corners->length(); i++ )
450 corner += ( *corners )[i]->wire()->xyPosition();
451 corner *= 1. / (float)corners->length();
452 seeds[0].append( *corners );
453 seeds[1].append( *corners );
457 if (
t == 3 )
links = &_inners;
458 else links = &_outers;
462 for (
unsigned i = 0; i < 2; i++ )
464 edgePos[i] = edge[i]->wire()->xyPosition();
465 v[i] = ( edgePos[i] - corner ).
unit();
467 seeds[0].append( edge[0] );
468 seeds[1].append( edge[1] );
470#ifdef TRKRECO_DEBUG_DETAIL
471 std::cout <<
" corner:" << corner << std::endl;
472 std::cout <<
" edge:" << edgePos[0] <<
"(";
473 std::cout << edge[0]->wire()->layerId() <<
"-";
474 std::cout << edge[0]->wire()->localId() <<
")";
475 std::cout <<
v[0] << std::endl;
477 std::cout << edgePos[1] <<
"(";
478 std::cout << edge[1]->wire()->layerId() <<
"-";
479 std::cout << edge[1]->wire()->localId() <<
")";
480 std::cout <<
v[1] << std::endl;
485 for (
unsigned i = 0; i <
n; i++ )
488 if ( edge.member( l ) )
continue;
489 if ( corners->member( l ) )
continue;
492 double p2 = p.mag2();
495 for (
unsigned j = 0; j < 2; j++ )
497 dist[j] =
v[j].dot( p );
498 double d2 = dist[j] * dist[j];
499 dist[j] = (
p2 - d2 ) > 0. ? sqrt(
p2 - d2 ) : 0.;
501 if ( dist[0] < dist[1] ) seeds[0].append( l );
502 else seeds[1].append( l );
504#ifdef TRKRECO_DEBUG_DETAIL
505 std::cout <<
" p:" << p << std::endl;
507 std::cout << l->
wire()->
localId() <<
":" << dist[0];
508 std::cout <<
"," << dist[1] << std::endl;
512 AList<TSegment> list;
513 for (
unsigned i = 0; i < 2; i++ )
515 if ( seeds[i].length() )
518 AList<TSegment> ncx = nc->
split();
519 if ( ncx.length() == 0 )
537 AList<TSegment> newClusters;
538 AList<TMLink> goodHits;
540 for (
unsigned i = 0; i <
n; i++ )
542 const TMDCWireHit* h =
_links[i]->hit();
548 goodHits.append(
_links[i] );
550 if ( goodHits.length() == 0 )
return newClusters;
554 AList<TMLink> original(
_links );
555 while ( goodHits.length() )
559 TMLink* seed = goodHits.last();
560 const TMDCWire* wire = seed->
wire();
561 unsigned localId = wire->
localId();
563 unsigned nn =
_links.length();
564 for (
unsigned i = 0; i < nn; i++ )
567 const TMDCWire*
w =
t->wire();
570 if (
abs( (
int)
w->localId() - (
int)localId ) < 2 ) used.append(
t );
573#ifdef TRKRECO_DEBUG_DETAIL
574 std::cout <<
" seed is " << seed->
wire()->
name() << std::endl;
576 for (
unsigned i = 0; i < used.length(); i++ )
577 { std::cout << used[i]->wire()->name() <<
","; }
578 std::cout << std::endl;
582 if ( used.length() == 0 )
continue;
583 if ( used.length() ==
nLinks() )
return newClusters;
585 AList<TSegment> cx = c->
split();
586 if ( cx.length() == 0 )
589 newClusters.append( c );
593 newClusters.append( cx );
596 goodHits.remove( used );
597 original.remove( used );
601 if ( ( original.length() ) && ( original.length() <
nLinks() ) )
604 AList<TSegment> cx = c->
split();
605 if ( cx.length() == 0 )
608 newClusters.append( c );
612 newClusters.append( cx );
621 AList<TMLink> seeds[2];
622 AList<TSegment> newClusters;
623 for (
unsigned i = _innerMostLayer; i <= _outerMostLayer; i++ )
626 AList<TMLink> outerList =
Edges( list );
628#ifdef TRKRECO_DEBUG_DETAIL
629 if ( outerList.length() != 2 )
631 std::cout <<
"TSegment::splitParallel !!! ";
632 std::cout <<
"This is not a parallel cluster" << std::endl;
636 seeds[0].append( outerList[0] );
637 seeds[1].append( outerList[1] );
638 if ( list.length() == 2 )
continue;
640 const TMDCWire& wire0 = *outerList[0]->wire();
641 const TMDCWire& wire1 = *outerList[1]->wire();
642 for (
unsigned k = 0; k < list.length(); k++ )
645 if (
t == outerList[0] )
continue;
646 if (
t == outerList[1] )
continue;
650 seeds[0].append(
t );
651 else seeds[1].append(
t );
655 if ( ( seeds[0].length() ) && ( seeds[0].length() <
nLinks() ) )
658 AList<TSegment> c0x = c0->
split();
661 newClusters.append( c0x );
667 newClusters.append( c0 );
671 if ( ( seeds[1].length() ) && ( seeds[1].length() <
nLinks() ) )
674 AList<TSegment> c1x = c1->
split();
677 newClusters.append( c1x );
683 newClusters.append( c1 );
690void TSegment::updateDuality(
void )
const {
694 for (
unsigned i = _innerMostLayer; i <= _outerMostLayer; i++ )
697 if ( i == _innerMostLayer )
699 for (
unsigned j = 0; j < list.length(); j++ )
x[0] += list[j]->hit()->xyPosition();
700 x[0] *= 1. / float( list.length() );
702 else if ( i == _outerMostLayer )
704 for (
unsigned j = 0; j < list.length(); j++ )
x[1] += list[j]->hit()->xyPosition();
705 x[1] *= 1. / float( list.length() );
708 if ( list.length() == 2 )
710 if (
Width( list ) != 2 )
continue;
711 const TMDCWireHit* h0 = list[0]->hit();
712 const TMDCWireHit* h1 = list[1]->hit();
720 if ( _nDual > 0 ) _duality /= float( _nDual );
721 _angle = (
x[1] -
x[0] ).
unit().dot(
x[0].
unit() );
725#ifdef TRKRECO_DEBUG_DETAIL
726 std::cout <<
" TSegment::splitDual called" << std::endl;
728 AList<TMLink> seeds[2];
729 AList<TMLink> unknown;
730 for (
unsigned i = _innerMostLayer; i <= _outerMostLayer; i++ )
734 if ( list.length() == 2 )
736 if (
Width( list ) == 2 )
738 seeds[0].append( list[0] );
739 seeds[1].append( list[1] );
743 unknown.append( list );
746 if ( unknown.length() > 0 )
748#ifdef TRKRECO_DEBUG_DETAIL
749 if ( seeds[0].length() == 0 )
750 std::cout <<
"TSegment::splitDual !!! no TMLink for seed 0" << std::endl;
751 if ( seeds[1].length() == 0 )
752 std::cout <<
"TSegment::splitDual !!! no TMLink for seed 1" << std::endl;
754 const HepPoint3D& p0 = seeds[0][0]->xyPosition();
756 HepVector3D v0 = ( seeds[0].last()->xyPosition() - p0 ).unit();
757 HepVector3D v1 = ( seeds[1].last()->xyPosition() -
p1 ).unit();
759 for (
unsigned i = 0; i < unknown.length(); i++ )
761 TMLink*
t = unknown[i];
763 double d0 = ( x0 - ( x0.dot( v0 ) * v0 ) ).mag();
765 double d1 = ( x1 - ( x1.dot( v0 ) * v0 ) ).mag();
767 if ( d0 < d1 ) seeds[0].append(
t );
768 else seeds[1].append(
t );
772 AList<TSegment> newClusters;
773 newClusters.append(
new TSegment( seeds[0] ) );
774 newClusters.append(
new TSegment( seeds[1] ) );
780 if ( _clusterType == 0 )
return 0;
781 if ( _nDual == 0 )
return 0;
786 if ( _clusterType == 0 )
return 0;
787 if ( _nDual == 0 )
return 0;
791 for (
unsigned i = _innerMostLayer; i <= _outerMostLayer; i++ )
795 if ( list.length() == 1 ) { seeds.append( list[0] ); }
796 else if ( list.length() == 2 )
798 if (
Width( list ) > 1 )
804 if (
distance > 0.5 ) duals.append( list );
805#ifdef TRKRECO_DEBUG_DETAIL
808 std::cout <<
" lyr=" << i;
809 std::cout <<
", duality distance = " <<
distance << std::endl;
813 else if ( list.length() == 0 ) {
continue; }
814#ifdef TRKRECO_DEBUG_DETAIL
817 std::cout <<
"TSegment::solveDualHits !!! this is not expected 2";
818 std::cout << std::endl;
819 this->
dump(
"cluster hits mc",
" " );
825 if ( seeds.length() < 2 )
return -1;
829 unsigned n = duals.length() / 2;
830 for (
unsigned i = 0; i <
n; i++ )
832 TMLink* t0 = duals[i * 2 + 0];
833 TMLink* t1 = duals[i * 2 + 1];
836 double d0 = ( x0 - ( x0.dot(
v ) *
v ) ).mag();
837 double d1 = ( x1 - ( x1.dot(
v ) *
v ) ).mag();
838 if ( d0 < d1 )
_links.remove( t1 );
989 unsigned nList = list.length();
990 for (
unsigned i = 0; i < nList; i++ )
993 for (
unsigned j = 0; j < links.length(); j++ )
995 unsigned state = links[j]->hit()->state();
1007 unsigned n = links.length();
1008 for (
unsigned i = 0; i <
n; i++ )
1010 if ( trackLinks.hasMember( links[i] ) ) a.append( links[i] );
1021 unsigned nLinks =
s->innerLinks().length();
1022 if ( nLinks != 1 )
return n;
1024 s =
s->innerLinks()[0];
1034 unsigned nLinks =
s->innerLinks().length();
1035 if ( nLinks != 1 )
return links;
1048 unsigned nLinks =
s->innerLinks().length();
1049 if ( nLinks == 0 )
return n;
1051 int tmp = 0, ii = 0;
1052 for (
int i = 0; i < nLinks; ++i )
1054 if (
s->innerLinks()[i]->links().length() > tmp )
1056 tmp =
s->innerLinks()[i]->links().length();
1060 s =
s->innerLinks()[ii];
1071 unsigned nLinks =
s->innerLinks().length();
1072 if ( nLinks == 0 )
return links;
1073 int tmp = 0, ii = 0;
1074 for (
int i = 0; i < nLinks; ++i )
1076 if (
s->innerLinks()[i]->links().length() > tmp )
1078 tmp =
s->innerLinks()[i]->links().length();
1095 unsigned nLinks =
s->innerLinks().length();
1096 if ( nLinks == 0 )
return n;
1097 if ( nLinks > 1 ) ++
n;
1098 s =
s->innerLinks()[0];
1105 unsigned n = in.length();
1106 if (
n == 0 )
return;
1108 for (
unsigned i = 0; i <
n; i++ )
1112 else isolated.append(
s );
1118 unsigned n = list.length();
1119 for (
unsigned i = 0; i <
n; i++ ) sl |= ( 1 << ( list[i]->superLayerId() ) );
1131 unsigned n = list.length();
1132 for (
unsigned i = 0; i <
n; i++ ) links.append( list[i]->links() );
1137 unsigned maxWidth = 0;
1141 unsigned w =
Width( tmp );
1142 if (
w > maxWidth ) maxWidth =
w;
1148double TSegment::maxdDistance(
TMLink* l )
const {
1151 double _averR[11] = { 9.7, 14.5, 22.14, 28.62, 35.1, 42.39,
1152 48.87, 55.35, 61.83, 69.12, 74.79 };
1153 double _averR2[43] = {
1154 7.885, 9.07, 10.29, 11.525, 12.72, 13.875, 15.01, 16.16, 19.7, 21.3, 22.955,
1155 24.555, 26.215, 27.82, 29.465, 31.06, 32.69, 34.265, 35.875, 37.455, 39.975, 41.52,
1156 43.12, 44.76, 46.415, 48.02, 49.685, 51.37, 53.035, 54.595, 56.215, 57.855, 59.475,
1157 60.995, 62.565, 64.165, 66.68, 68.285, 69.915, 71.57, 73.21, 74.76, 76.345 };
1158 double radius = _averR2[lId];
1159 const double singleSigma = l->
dDrift();
1160 return 2 * singleSigma / ( radius * radius );
1171 for (
unsigned i = 0; i <
_links.length(); ++i )
1178 if (
links[0].length() == 0 )
1180 if (
links[3].length() == 0 )
return list;
1181 if (
links[1].length() != 1 )
1183 cout <<
"wrong in tsf, TSegment::splitTsf ...1" << endl;
1187 seeds2.append(
links[3] );
1188 exTsf.append(
links[2] );
1190 else if (
links[0].length() == 1 )
1193 if (
links[3].length() > 0 )
1195 seeds2.append(
links[3] );
1196 exTsf.append(
links[1] );
1197 exTsf.append(
links[2] );
1199 else if (
links[2].length() > 0 )
1201 seeds2.append(
links[2] );
1202 exTsf.append(
links[1] );
1206 else cout <<
"wrong in tsf, TSegment::splitTsf ...2" << endl;
1207 exTsf.append( seeds2 );
1210 for (
unsigned i = 0; i < seeds2.length(); ++i )
1212 if ( seed->
tsfTag() > 0 && seeds2[i]->tsfTag() > 0 )
continue;
1215 fitLine( seed, seeds2[i], line );
1216 segments = appendByLine( seed, seeds2[i], seedNeighbors, exTsf, line );
1217 list.append( segments );
1218 segments.removeAll();
1224 exTsf.append(
links[1] );
1225 exTsf.append(
links[2] );
1226 for (
int k = 0; k <
links[2].length(); ++k )
1228 if (
links[2][k]->tsfTag() == 0 ) seeds2.append(
links[2][k] );
1230 for (
unsigned i = 0; i < seeds2.length(); ++i )
1232 if ( seed->
tsfTag() > 0 && seeds2[i]->tsfTag() > 0 )
continue;
1235 fitLine( seed, seeds2[i], line2 );
1236 segments2 = appendByLine( seed, seeds2[i], seedNeighbors, exTsf, line2 );
1237 list.append( segments2 );
1238 segments2.removeAll();
1248 double ar = seed->
cDrift();
1251 double br = outer->
cDrift();
1253 double dis = sqrt( ( ax - bx ) * ( ax - bx ) + ( ay - by ) * ( ay - by ) );
1254 double costheta = ( bx - ax ) / dis;
1255 double sintheta = ( by - ay ) / dis;
1256 double c1 = ( ax * ax - bx * bx + ay * ay - by * by ) / ( 2 * dis );
1257 double c2 = ( ax * by - bx * ay ) / dis;
1259 line[0].setX( ( br - ar ) * costheta +
1260 sqrt( dis * dis - ( ar - br ) * ( ar - br ) ) * sintheta );
1261 line[0].setY( ( br - ar ) * sintheta -
1262 sqrt( dis * dis - ( ar - br ) * ( ar - br ) ) * costheta );
1263 line[0].setZ( ( br - ar ) * c1 - sqrt( dis * dis - ( ar - br ) * ( ar - br ) ) * c2 +
1264 0.5 * dis * ( ar + br ) );
1265 line[1].setX( ( br - ar ) * costheta -
1266 sqrt( dis * dis - ( ar - br ) * ( ar - br ) ) * sintheta );
1267 line[1].setY( ( br - ar ) * sintheta +
1268 sqrt( dis * dis - ( ar - br ) * ( ar - br ) ) * costheta );
1269 line[1].setZ( ( br - ar ) * c1 + sqrt( dis * dis - ( ar - br ) * ( ar - br ) ) * c2 +
1270 0.5 * dis * ( ar + br ) );
1271 line[2].setX( ( br + ar ) * costheta +
1272 sqrt( dis * dis - ( ar + br ) * ( ar + br ) ) * sintheta );
1273 line[2].setY( ( br + ar ) * sintheta -
1274 sqrt( dis * dis - ( ar + br ) * ( ar + br ) ) * costheta );
1275 line[2].setZ( ( br + ar ) * c1 - sqrt( dis * dis - ( ar + br ) * ( ar + br ) ) * c2 +
1276 0.5 * dis * ( br - ar ) );
1277 line[3].setX( ( br + ar ) * costheta -
1278 sqrt( dis * dis - ( ar + br ) * ( ar + br ) ) * sintheta );
1279 line[3].setY( ( br + ar ) * sintheta +
1280 sqrt( dis * dis - ( ar + br ) * ( ar + br ) ) * costheta );
1281 line[3].setZ( ( br + ar ) * c1 + sqrt( dis * dis - ( ar + br ) * ( ar + br ) ) * c2 +
1282 0.5 * dis * ( br - ar ) );
1296 AList<TSegment> list;
1303 for (
int i = 0; i < 4; ++i )
1305 AList<TMLink> seeds;
1306 for (
int j = 0, size = restHits.length(); j < size; ++j )
1308 TMLink* l = restHits[j];
1309 if ( l->
wire()->
id() == outer->
wire()->
id() )
continue;
1311 double maxdis = maxdDistance( l ) * _times[slId];
1312 double dis = distance2( l, line[i] );
1314 if ( seeds.hasMember( l ) )
continue;
1315 if ( fabs( dis - l->
cDrift() ) < maxdis ) seeds.append( l );
1318 seeds.append( seed );
1319 seeds.append( outer );
1320 unsigned nHitsLayer[4] = { 0, 0, 0, 0 };
1321 unsigned nLayers = 0;
1323 for (
int j = 0; j < seeds.length(); ++j ) ++nHitsLayer[seeds[j]->wire()->
localLayerId()];
1324 for (
int j = 0; j < 4; ++j )
1325 if ( nHitsLayer[j] > 0 ) ++nLayers;
1326 if ( nLayers < 3 )
continue;
1329 for (
int k = 0; k < seedNeighbors.length(); ++k )
1331 TMLink* l = seedNeighbors[k];
1334 double maxdis = maxdDistance( l ) * _times[slId];
1335 double dis = distance2( l, line[i] );
1337 if ( seeds.hasMember( l ) )
continue;
1338 if ( fabs( dis - l->
cDrift() ) < maxdis ) seeds.append( l );
1343 for (
int k = 0; k < seeds.length(); ++k )
1345 unsigned a = seeds[k]->tsfTag();
1347 seeds[k]->tsfTag( a );
1401 double a = line.x();
1402 double b = line.y();
1403 double c = line.z();
1404 return fabs( a *
x + b * y + c ) / sqrt( a * a + b * b );
1410 for (
int i = 0; i <
links.length(); ++i )
1413 double d =
links[i]->cDrift();
1414 HepPoint3D posOnLine = closestPoint( p, _lineTsf );
1420 sumPos *= ( 1. / double(
n ) );
1421 HepPoint3D posTsf = closestPoint( sumPos, line );
1428 line0.setX( tsfLine.x() / sqrt( tsfLine.x() * tsfLine.x() + tsfLine.y() * tsfLine.y() ) );
1429 line0.setY( tsfLine.y() / sqrt( tsfLine.x() * tsfLine.x() + tsfLine.y() * tsfLine.y() ) );
1430 line0.setZ( tsfLine.z() / sqrt( tsfLine.x() * tsfLine.x() + tsfLine.y() * tsfLine.y() ) );
1433 unsigned n =
links.length();
1434 unsigned nTrial = 0;
1437 if ( nTrial > 10 )
break;
1438 double a = 0., b = 0.;
1439 double sumXSig = 0., sumYSig = 0., sumX2Sig = 0., sumXYSig = 0., sumSig = 0.;
1440 for (
unsigned i = 0; i <
n; i++ )
1443 double d =
links[i]->cDrift();
1444 HepPoint3D posOnLine = closestPoint( p, _lineTsf );
1447 double Sig = maxdDistance(
links[i] );
1448 Sig = 1. / ( Sig * Sig );
1453 sumX2Sig += X * X * Sig;
1454 sumXYSig += X * Y * Sig;
1458 b = ( sumXYSig * sumSig - sumXSig * sumYSig ) / ( sumX2Sig * sumSig - sumXSig * sumXSig );
1459 a = ( sumYSig - sumXSig * b ) / sumSig;
1461 line.set( b / sqrt( 1 + b * b ), -1 / sqrt( 1 + b * b ), a / sqrt( 1 + b * b ) );
1465 for (
unsigned i = 0; i <
n; i++ )
1468 double d =
links[i]->cDrift();
1469 double Sig = maxdDistance(
links[i] );
1470 Sig = 1. / ( Sig * Sig );
1471 double dis = fabs( p.x() * line.x() + p.y() * line.y() + line.z() ) - d;
1472 chi2 += dis * dis * Sig;
1476 cout <<
"n = " <<
n <<
" nTrial = " << nTrial <<
" line0 = " << line0 << endl;
1477 cout <<
"chi2 in TSF = " << chi2 << endl;
1480 if ( fabs( line.x() - line0.x() ) < 0.0001 )
break;
1491 line0.setX( tsfLine.x() / sqrt( tsfLine.x() * tsfLine.x() + tsfLine.y() * tsfLine.y() ) );
1492 line0.setY( tsfLine.y() / sqrt( tsfLine.x() * tsfLine.x() + tsfLine.y() * tsfLine.y() ) );
1493 line0.setZ( tsfLine.z() / sqrt( tsfLine.x() * tsfLine.x() + tsfLine.y() * tsfLine.y() ) );
1502 if ( nTrial > 15 )
break;
1503 double a0 = line0.x();
1504 double b0 = line0.y();
1505 double c0 = line0.z();
1510 cout <<
"b0 == 0 TSegment::leastSquaresFitting!" << endl;
1514 double a = 0., b = 0., c = 0.;
1515 double sumSigX2 = 0., sumSigX = 0., sumSig = 0.;
1516 for (
int i = 0; i <
n; ++i )
1521 double Sig = maxdDistance(
links[i] );
1522 Sig = 1. / ( Sig * Sig );
1523 sumSigX2 += Sig * ( X - Y *
a0 / b0 ) * ( X - Y *
a0 / b0 );
1524 sumSigX += Sig * ( X - Y *
a0 / b0 );
1527 double detM = sumSigX2 * sumSig - sumSigX * sumSigX;
1528 double M11 = sumSig / detM;
1529 double M12 = -sumSigX / detM;
1531 double M22 = sumSigX2 / detM;
1532 for (
int i = 0; i <
n; ++i )
1537 double DRIFT =
links[i]->cDrift();
1538 if (
a0 * p.x() + b0 * p.y() + c0 * p.z() < 0 ) DRIFT = ( -1 ) * DRIFT;
1539 double Sig = maxdDistance(
links[i] );
1540 Sig = 1. / ( Sig * Sig );
1541 double D = DRIFT - Y / b0;
1542 a += ( ( X - Y *
a0 / b0 ) * M11 + M12 ) * Sig * D;
1543 c += ( ( X - Y *
a0 / b0 ) * M21 + M22 ) * Sig * D;
1546 b = ( 1 -
a0 * a ) / b0;
1548 line.setX( a / sqrt( a * a + b * b ) );
1549 line.setY( b / sqrt( a * a + b * b ) );
1550 line.setZ( c / sqrt( a * a + b * b ) );
1556 for (
int i = 0; i <
n; ++i )
1559 double dis = fabs( a * p.x() + b * p.y() + c );
1560 double DRIFT =
links[i]->cDrift();
1561 double Sig = maxdDistance(
links[i] );
1563 Sig = 1. / ( Sig * Sig );
1564 chi2 += ( dis - DRIFT ) * ( dis - DRIFT ) * Sig;
1569 if ( fabs( a -
a0 ) < 0.00001 )
break;
1589 AList<TMLink> segLinks =
_links;
1590 for (
int i = 0; i <
links.length(); ++i )
1592 TMLink* l =
links[i];
1593 if ( segLinks.hasMember( l ) )
continue;
1595 double maxdis = maxdDistance( l ) * ( _times[slId] );
1596 double dis = distance2( l, line );
1597 if ( fabs( dis - l->
cDrift() ) < maxdis )
1600 unsigned a = l->
tsfTag();
1609void TSegment::expandSeg(
const int empty,
AList<TMLink>& allLinks ) {
1610 if ( empty >= 4 || empty < 0 )
return;
1611 AList<TMLink> linksOnEmptyLayer;
1612 for (
int i = 0; i < allLinks.length(); ++i )
1613 if ( allLinks[i]->wire()->localLayerId() == empty )
1614 linksOnEmptyLayer.append( allLinks[i] );
1616 if ( linksOnEmptyLayer.length() == 0 )
return;
1619 float maxPhi[4] = { 0., 0., 0., 0. };
1620 float minPhi[4] = { 999., 999., 999., 999. };
1621 float max = 0.,
min = 999.;
1622 for (
int i = 0; i <
_links.length(); ++i )
1628 float phi0 = _cdc->layer( lId )->offset();
1629 int nWir = (int)_cdc->layer( lId )->nWires();
1630 float phi = phi0 + local * 2 *
pi / nWir;
1632 if ( phi > maxPhi[loId] ) maxPhi[loId] = phi;
1633 if ( phi < minPhi[loId] ) minPhi[loId] = phi;
1634 if ( phi >
max )
max = phi;
1635 if ( phi <
min )
min = phi;
1638 AList<TMLink> tmpList;
1639 for (
int i = 0; i < linksOnEmptyLayer.length(); ++i )
1641 TMLink* l = linksOnEmptyLayer[i];
1644 float phi0 = _cdc->layer( lId )->offset();
1645 int nWir = (int)_cdc->layer( lId )->nWires();
1646 float phi = phi0 + local * 2 *
pi / nWir;
1648 if ( empty != 0 || empty != 3 )
1650 if ( phi <= maxPhi[empty + 1] && phi >= minPhi[empty - 1] ) tmpList.append( l );
1651 else if ( phi <= maxPhi[empty - 1] && phi >= minPhi[empty + 1] ) tmpList.append( l );
1652 else if ( tmpList.length() == 0 && phi <= max && phi >=
min ) tmpList.append( l );
1654 if ( empty == 0 || empty == 3 )
1656 if ( phi <= maxPhi[1] && phi >= minPhi[2] ) tmpList.append( l );
1657 else if ( phi <= maxPhi[2] && phi >= minPhi[1] ) tmpList.append( l );
1658 else if ( tmpList.length() == 0 && phi <= max && phi >=
min ) tmpList.append( l );
1662 for (
int i = 0; i < tmpList.length(); ++i )
1664 TMLink* l = tmpList[i];
1666 unsigned a = l->
tsfTag();
1681 for (
int i = 0; i <
n; ++i )
1701 for (
int i = 0; i <
n; ++i )
1708 double cosA = ( p -
center ).
unit().dot( v1.unit() );
1709 double cosB = ( p -
center ).
unit().dot( v2.unit() );
1720 HepPoint3D PointOnLine( 1, -( line.x() + line.z() ) / line.y(), 0 );
1721 double dis = ( p - PointOnLine ).dot( Dir );
1722 HepPoint3D tmp( dis * Dir.x(), dis * Dir.y(), 0. );
1725 double disPLine = fabs( p.x() * line.x() + p.y() * line.y() + line.z() ) /
1726 sqrt( line.x() * line.x() + line.y() * line.y() );
1727 double disP1P2 = sqrt( ( p.x() - closestPoint.x() ) * ( p.x() - closestPoint.x() ) +
1728 ( p.y() - closestPoint.y() ) * ( p.y() - closestPoint.y() ) );
1729 if ( fabs( disPLine - disP1P2 ) > 0.00001 )
1730 cout <<
"TSegment::closestPoint: dis p -> line = " << disPLine
1731 <<
" dis p -> pos = " << disP1P2 << endl;
1732 return closestPoint;
1738 for (
unsigned i = 0; i <
n; i++ )
1746 for (
unsigned j = 0; j < 6; j++ ) neighbor[j] =
w->neighbor( j );
1749 unsigned pattern = 0;
1750 for (
unsigned j = 0; j < 6; j++ )
1753 if ( neighbor[j]->hit() ) pattern += ( 1 << j );
1758 if ( ( pattern == 34 ) || ( pattern == 42 ) || ( pattern == 40 ) || ( pattern == 10 ) ||
1759 ( pattern == 35 ) || ( pattern == 50 ) )
1761 else if ( ( pattern == 17 ) || ( pattern == 21 ) || ( pattern == 20 ) ||
1762 ( pattern == 5 ) || ( pattern == 19 ) || ( pattern == 49 ) )
HepGeom::Vector3D< double > HepVector3D
HepGeom::Point3D< double > HepPoint3D
character *LEPTONflag integer iresonances real zeta5 real a0
*******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
const HepPoint3D ORIGIN
Constants.
#define WireHitContinuous
#define WireHitPatternLeft
#define WireHitPatternRight
#define WireHitNeighborHit
AList< TMLink > Edges(const AList< TMLink > &)
unsigned Width(const AList< TMLink > &)
AList< TMLink > InOut(const AList< TMLink > &)
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.
**********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
HepGeom::Point3D< double > HepPoint3D
unsigned NMajorLinks(const TSegment &a)
returns # of links in the major link.
unsigned NUniqueLinks(const TSegment &a)
checks property of segments.
HepGeom::Vector3D< double > HepVector3D
unsigned NLinkBranches(const TSegment &a)
returns # of link branches in the major link.
unsigned NMajorLinks(const TSegment &a)
returns # of links in the major link.
unsigned NUniqueLinks(const TSegment &a)
checks property of segments.
TSegment * OuterMostUniqueLink(const TSegment &a)
returns a segment to the outer-most unique segment.
unsigned NLinkBranches(const TSegment &a)
returns # of link branches in the major link.
unsigned NCoreLinks(const CAList< TSegment > &list)
returns # of core links in segments.
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.
AList< TMLink > Links(const TSegment &s, const TTrack &t)
returns AList of TMLink used for a track.
unsigned SuperLayer(const AList< TSegment > &list)
returns super layer pattern.
void SeparateCrowded(const AList< TSegment > &in, AList< TSegment > &isolated, AList< TSegment > &crowded)
returns isolated and crowded list.
to specify 1-dim region or range by two floats
void dump(const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
dumps debug information.
unsigned state(void) const
returns state.
const TMDCWire *const wire(void) const
returns a pointer to a TMDCWire.
const HepPoint3D & xyPosition(void) const
returns drift time
A class to represent a wire in MDC.
unsigned id(void) const
returns id.
unsigned localLayerId(void) const
returns local layer id in a super layer.
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.
unsigned superLayerId(void) const
returns super layer id.
int localIdDifference(const TMDCWire &) const
returns local id difference.
std::string name(void) const
returns name.
static TMDC * getTMDC(void)
A class to relate TMDCWireHit and TTrack objects.
const HepPoint3D & xyPosition(void) const
returns middle position of a wire. z componet is 0.
unsigned tsfTag(void) const
return tsfTag of links
const TMDCWireHit * hit(void) const
returns a pointer to a hit.
const HepPoint3D & positionD(void) const
float dDrift(void) const
returns/sets drift distance error.
double cDrift(void) const
const TMDCWire *const wire(void) const
returns a pointer to a wire.
A class to relate TMDCWireHit and TTrack objects.
void dump(const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
dumps debug information.
const TMLink & center(void) const
returns a TMLink which is the closest to the center.
const AList< TMLink > & outers(void) const
void solveThreeHits(void)
Range rangeX(double min, double max) const
returns Range of x-coordinate of TMLinks.
virtual ~TSegment()
Destructor.
AList< TSegment > split(void) const
AList< TSegment > splitTsf(AList< TMLink > &)
unsigned state(void) const
unsigned innerMostLayer(void) const
returns inner most layer.
unsigned clusterType(void) const
void solveLR(void)
solve LR of hit in TSF.
AList< TSegment > & outerLinks(void)
const HepPoint3D & position(void) const
returns position.
unsigned width(void) const
returns width.
double distance(const TSegment &) const
calculates distance between two clusters. Smaller value indicates closer.
unsigned outerMostLayer(void) const
returns outer most layer.
const HepPoint3D & lineTsf(void) const
return line of Tsf for pos and dir
virtual void dump(const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
dumps debug information.
const AList< TMLink > & links(unsigned mask=0) const
unsigned nLinks(unsigned mask=0) const
returns # of masked TMLinks assigned to this track object.
void update(void) const
update cache.
A class to represent a track in tracking.