00001
00002
00003
00004
00005
00006 #include "TMath.h"
00007
00008 #include "StThreeVectorD.hh"
00009
00010
00011 #include "Line.hh"
00012 #include "Track.hh"
00013
00014 #define MAX_SLOPE 0.1
00015
00016 TLinearFitter Track::mXfitter(1, "pol1", "");
00017 TLinearFitter Track::mYfitter(1, "pol1", "");
00018
00019 void Track::merge(Track* track)
00020 {
00021 unsigned int oldSize = size();
00022 copy(track->begin(), track->end(), back_inserter(*this));
00023 inplace_merge(begin(), begin()+oldSize, end(), LessHit());
00024 }
00025
00026 bool Track::fit()
00027 {
00028
00029
00030
00031 mXfitter.ClearPoints();
00032 mYfitter.ClearPoints();
00033 for (iterator i = begin(); i != end(); ++i) {
00034 StHit* hit = *i;
00035 double x = hit->position().x();
00036 double y = hit->position().y();
00037 double z = hit->position().z();
00038 mXfitter.AddPoint(&z, x);
00039 mYfitter.AddPoint(&z, y);
00040 }
00041 mXfitter.Eval();
00042 mYfitter.Eval();
00043 mChiSquareX = mXfitter.GetChisquare();
00044 mChiSquareY = mYfitter.GetChisquare();
00045 mNumberFreeParameters = mXfitter.GetNumberFreeParameters();
00046 mX0 = mXfitter.GetParameter(0);
00047 mY0 = mYfitter.GetParameter(0);
00048 mdxdz = mXfitter.GetParameter(1);
00049 mdydz = mYfitter.GetParameter(1);
00050 mX0error = mXfitter.GetParError(0);
00051 mY0error = mYfitter.GetParError(0);
00052 mdxdzError = mXfitter.GetParError(1);
00053 mdydzError = mYfitter.GetParError(1);
00054 StThreeVectorD origin(mX0, mY0, 0);
00055 StThreeVectorD direction(mdxdz, mdydz, 1);
00056 Line line(origin, direction);
00057 mLength = abs(line.perigee(lastHit()->position()) - line.perigee(firstHit()->position()));
00058
00059 return true;
00060 }
00061
00062 bool Track::ok() const
00063 {
00064 return fabs(dxdz()) <= MAX_SLOPE && fabs(dydz()) <= MAX_SLOPE;
00065 }
00066
00067 bool Track::accept(StHit* hit) const
00068 {
00069 double dx = x0() + dxdz() * hit->position().z() - hit->position().x();
00070 double dy = y0() + dydz() * hit->position().z() - hit->position().y();
00071 double dr = hypot(dx, dy);
00072 return fabs(dr) <= 5;
00073 }
00074
00075 ostream& operator<<(ostream& os, Track& track)
00076 {
00077 os << "Track " << &track << " has " << track.size() << " hits:\n";
00078 for (Track::iterator i = track.begin(); i != track.end(); ++i) {
00079 StHit* hit = *i;
00080 os << hit->position() << '\n';
00081 }
00082 os << "x0:\t" << track.x0() << " +/- " << track.x0error() << '\n'
00083 << "y0:\t" << track.y0() << " +/- " << track.y0error() << '\n'
00084 << "dxdz:\t" << track.dxdz() << " +/- " << track.dxdzError() << '\n'
00085 << "dydz:\t" << track.dydz() << " +/- " << track.dydzError() << '\n'
00086 << "chi2zx:\t" << track.chi2zx() << '\n'
00087 << "chi2zy:\t" << track.chi2zy() << '\n'
00088 << "probzx:\t" << TMath::Prob(track.chi2zx(), track.ndf()) << '\n'
00089 << "probzy:\t" << TMath::Prob(track.chi2zy(), track.ndf()) << '\n';
00090 return os;
00091 }