13#include "TrkReco/TMLine.h"
14#include "TrkReco/TMDCUtil.h"
15#include "TrkReco/TMDCWire.h"
16#include "TrkReco/TMDCWireHit.h"
17#include "TrkReco/TMDCWireHitMC.h"
18#include "TrkReco/TTrackHEP.h"
27 , _fittedUpdated( false )
29 , _reducedChi2( 0. ) {
32 fitter( &TMLine::_fitter );
40 , _fittedUpdated( false )
42 , _reducedChi2( 0. ) {
45 fitter( &TMLine::_fitter );
50void TMLine::dump(
const std::string& msg,
const std::string& pre )
const {
52 if ( msg ==
"" ) def =
true;
54 if ( def || msg.find(
"line" ) != std::string::npos ||
55 msg.find(
"detail" ) != std::string::npos )
58 std::cout <<
"#links=" <<
_links.length();
59 std::cout <<
",a=" << _a;
60 std::cout <<
",b=" << _b;
61 std::cout <<
",det=" << _det;
62 std::cout << std::endl;
113 if ( !
_fitted ) std::cout <<
"TMLine::chi2 !!! fit not performed" << std::endl;
116 if ( _fittedUpdated )
return _chi2;
119 for (
unsigned i = 0; i <
n; i++ )
125 double c = y - _a * x - _b;
128 _fittedUpdated =
true;
135 for (
unsigned i = 0; i <
n; i++ )
139 if ( dist > maxSigma ) bad.append( l );
142#ifdef TRKRECO_DEBUG_DETAIL
143 std::cout <<
" TMLine::refine ... rejected hits:max distance=" << maxSigma;
144 std::cout << std::endl;
146 for (
unsigned i = 0; i < bad.length(); i++ )
156 else std::cout <<
"0";
160 if (
distance( l ) > maxSigma ) std::cout <<
" X";
161 std::cout << std::endl;
170 _fittedUpdated =
false;
175 std::cout <<
" " << __FILE__ <<
" " << __LINE__ <<
" ERROR : nsl" << std::endl;
179 int mask[100] = { 0 };
180 int nsl[11] = { 64, 80, 96, 128, 144, 160, 192, 208, 240, 256, 288 };
181 int npos = 0,
nneg = 0;
182 for (
unsigned i = 0; i <
n - 1; i++ )
185 for (
unsigned j = i + 1; j <
n; j++ )
191 if ( i > 0 && ( mask[i - 1] == 1 && mask[j] == 1 ) )
194 if ( l.
hit()->
wire()->
layerId() ==
t.hit()->wire()->layerId() ) { mask[i] = 1; }
198 int jlocal =
s.hit()->wire()->localId();
199 if ( ilocal > 0 && ilocal < ilast )
201 if (
abs( jlocal - ilocal ) > 1 )
207 else if ( ilocal == 0 )
209 if ( jlocal > 1 && jlocal < ilast )
215 else if ( ilocal == ilast )
217 if ( jlocal > 0 && jlocal < ilast - 1 )
228 if ( l.
position().y() >= 0 ) npos += 1;
234 double sumX = 0., sumY = 0., sumX2 = 0., sumXY = 0., sumY2 = 0.;
237 for (
unsigned i = 0; i <
n; i++ )
240 if ( mask[i] == 1 )
continue;
248 if ( npos >
nneg && y < 0 )
continue;
249 if ( npos < nneg && y > 0 )
continue;
260 if ( nused < 2 || ( nused == 2 && lyid[0] == lyid[1] ) ) {
return -2; }
261 double sum = double( nused );
262 _det = sum * sumX2 - sumX * sumX;
263 if ( _det == 0. ) {
return -1; }
264 _a = ( sumXY * sum - sumX * sumY ) / _det;
265 _b = ( sumX2 * sumY - sumX * sumXY ) / _det;
275 int mask[100] = { 0 };
276 int npos = 0,
nneg = 0;
277 for (
unsigned i = 0; i <
n - 1; i++ )
280 for (
unsigned j = i + 1; j <
n; j++ )
292 if ( l.
position().y() >= 0 ) npos += 1;
298 double sumX = 0., sumY = 0., sumX2 = 0., sumXY = 0., sumY2 = 0.;
301 for (
unsigned i = 0; i <
n; i++ )
304 if ( mask[i] == 1 )
continue;
310 if ( npos >
nneg && y < 0 )
continue;
311 if ( npos < nneg && y > 0 )
continue;
321 if ( nused < 4 ) {
return -2; }
322 double sum = double( nused );
323 _det = sum * sumX2 - sumX * sumX;
324 if ( _det == 0. ) {
return -1; }
325 _a = ( sumXY * sum - sumX * sumY ) / _det;
326 _b = ( sumX2 * sumY - sumX * sumXY ) / _det;
335 int mask[100] = { 0 };
338 double Crad = 180. / 3.141592;
339 for (
unsigned i = 0; i <
n - 1; i++ )
342 for (
unsigned j = i + 1; j <
n; j++ )
361 if ( mask[
n - 1] != 1 )
372 phi_max = phi_ave /
n + 40;
373 phi_min = phi_ave /
n - 40;
377 double sumX = 0., sumY = 0., sumX2 = 0., sumXY = 0., sumY2 = 0.;
380 for (
unsigned i = 0; i <
n; i++ )
383 if ( mask[i] == 1 )
continue;
390 if ( phi > phi_max && phi < phi_min )
continue;
400 if ( nused < 4 ) {
return -2; }
401 double sum = double( nused );
402 _det = sum * sumX2 - sumX * sumX;
403 if ( _det == 0. ) {
return -1; }
404 _a = ( sumXY * sum - sumX * sumY ) / _det;
405 _b = ( sumX2 * sumY - sumX * sumXY ) / _det;
414 std::cout <<
" " << __FILE__ <<
" " << __LINE__ <<
" ERROR : nsl" << std::endl;
416 int mask[100] = { 0 };
417 int nsl[11] = { 64, 80, 96, 128, 144, 160, 192, 208, 240, 256, 288 };
420 double Crad = 180. / 3.141592;
421 for (
unsigned i = 0; i <
n - 1; i++ )
424 for (
unsigned j = i + 1; j <
n; j++ )
430 if ( i > 0 && ( mask[i - 1] == 1 && mask[j] == 1 ) )
433 if ( l.
hit()->
wire()->
layerId() ==
t.hit()->wire()->layerId() ) { mask[i] = 1; }
437 int jlocal =
s.hit()->wire()->localId();
438 if ( ilocal > 0 && ilocal < ilast )
440 if (
abs( jlocal - ilocal ) > 1 )
446 else if ( ilocal == 0 )
448 if ( jlocal > 1 && jlocal < ilast )
454 else if ( ilocal == ilast )
456 if ( jlocal > 0 && jlocal < ilast - 1 )
475 if ( mask[
n - 1] != 1 )
486 phi_max = phi_ave /
n + 40;
487 phi_min = phi_ave /
n - 40;
491 double sumX = 0., sumY = 0., sumX2 = 0., sumXY = 0., sumY2 = 0.;
494 for (
unsigned i = 0; i <
n; i++ )
497 if ( mask[i] == 1 )
continue;
504 if ( phi > phi_max && phi < phi_min )
continue;
515 if ( nused < 2 || ( nused == 2 && lyid[0] == lyid[1] ) ) {
return -2; }
516 double sum = double( nused );
517 _det = sum * sumX2 - sumX * sumX;
518 if ( _det == 0. ) {
return -1; }
519 _a = ( sumXY * sum - sumX * sumY ) / _det;
520 _b = ( sumX2 * sumY - sumX * sumXY ) / _det;
529 int nlyr[50] = { 0 };
530 int nneg = 0, npos = 0;
531 for (
unsigned i = 0; i <
n - 1; i++ )
541 for (
unsigned i = 0; i <
n; i++ )
555 if ( npos >
nneg && l.
position().y() < 0 ) bad.append( l );
556 if ( npos <
nneg && l.
position().y() > 0 ) bad.append( l );
560 if ( bad.length() > 0 && bad.length() <
n ) {
_links.remove( bad ); }
564 _fittedUpdated =
false;
570 _fittedUpdated =
false;
576 _fittedUpdated =
false;
582 unsigned nb =
_links.length();
585 unsigned n = list.length();
586 for (
unsigned i = 0; i <
n; i++ )
592 if ( dist < maxSigma ) {
_links.append( l ); }
596 unsigned na =
_links.length();
601 for (
unsigned i = 0; i < na; i++ )
614 if ( bad.length() > 0 )
_links.remove( bad );
616 _fittedUpdated =
false;
622 if ( !
_fitted ) std::cout <<
"TMLine::reducedChi2 !!! fit not performed" << std::endl;
625 if ( _fittedUpdated )
return _reducedChi2;
629 for (
unsigned i = 0; i <
n; i++ )
635 double c = y - _a * x - _b;
638 chi2 += c * c / err / err;
641 _reducedChi2 =
chi2 / (
n - 2 );
642 _fittedUpdated =
true;
646#if defined( __GNUG__ )
649 if ( fabs( ( *a )->b() ) > fabs( ( *b )->b() ) )
return 1;
650 else if ( fabs( ( *a )->b() ) == fabs( ( *b )->b() ) )
return 0;
656extern "C" int SortByB(
const void* av,
const void* bv ) {
659 if ( fabs( ( *a )->b() ) > fabs( ( *b )->b() ) )
return 1;
660 else if ( fabs( ( *a )->b() ) == fabs( ( *b )->b() ) )
return 0;
int SortByWireId(const void *a, const void *b)
Sorter.
int SortByB(const void *av, const void *bv)
Sorter.
A class to fit a TTrackBase object to a line.
const TTrackHEP *const hep(void) const
returns a pointer to a GEN_HEPEVT.
float dDrift(unsigned) const
returns drift distance error.
const TMDCWire *const wire(void) const
returns a pointer to a TMDCWire.
const TMDCWireHitMC *const mc(void) const
returns a pointer to TMDCWireHitMC.
unsigned localId(void) const
returns local id in a wire layer.
unsigned layerId(void) const
returns layer id.
unsigned superLayerId(void) const
returns super layer id.
A class to represent a track in tracking.
double chi2(void) const
returns chi2.
void removeChits()
remove extremly bad points.
void removeSLY(AList< TMLink > &list)
int fit2()
fits itself. Error was happened if return value is not zero.
void refine(AList< TMLink > &list, float maxSigma)
virtual ~TMLine()
Destructor.
double distance(const TMLink &) const
returns distance to a position of TMLink itself. (not to a wire)
void appendByszdistance(AList< TMLink > &list, unsigned isl, float maxSigma)
int fit2p()
fits itself using isolated hits. Error was happened if return value is not zero.
double a(void) const
returns coefficient a.
void dump(const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
dumps debug information.
void appendSLY(AList< TMLink > &list)
double reducedChi2(void) const
returns reduced-chi2.
A class to relate TMDCWireHit and TTrack objects.
const TMDCWireHit * hit(void) const
returns a pointer to a hit.
const HepPoint3D & position(void) const
returns position.
const TMDCWire *const wire(void) const
returns a pointer to a wire.
virtual void dump(const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
dumps debug information.
const TMFitter *const fitter(void) const
returns a pointer to a default fitter.
unsigned id(void) const
returns an id started from 0.