// @(#) $Id$
/** \class AliHLTTPCCATracker
//_____________________________________________________________
// AliHLTTPCCATracker
// !
// !
// !
// !
// !
//
// Author: Ivan Kisel
// Copyright © ALICE HLT Group
*/
#define WRITETRACKS 1
#include "AliHLTTPCSpacePointData.h"
#include "AliHLTTPCCATracker.h"
#include "AliHLTTPCTrackSegmentData.h"
#include "TH1.h"
#include "TH2.h"
#include "TFile.h"
#include "TMath.h"
#if __GNUC__ >= 3
using namespace std;
#endif
#include "TROOT.h"
#include "TCanvas.h"
#include "TMarker.h"
#include "TLine.h"
#include "TStyle.h"
#include "TApplication.h"
#include "AliHLTTPCConfMapPoint.h"
#include "AliHLTTPCTrackArray.h"
#include
ClassImp(AliHLTTPCCATracker)
// ----------------------------------------------------------------------------------
AliHLTTPCCATracker::AliHLTTPCCATracker()
{
//Default constructor
fVertex = NULL;
fTrack = NULL;
fHit = NULL;
fBench = (Bool_t)true;
fVertexConstraint = (Bool_t)true;
fParamSet[0]=0;
fParamSet[1]=0;
//JMT 2006/11/13
fOutputPtr= NULL;
fOutputNTracks=0;
fOutputSize=0;
fDRAW = 0;
fAsk = 0;
}
// ----------------------------------------------------------------------------------
AliHLTTPCCATracker::AliHLTTPCCATracker(const AliHLTTPCCATracker &x )
{
//Copy constructor
fVertex = x.fVertex;
fTrack = x.fTrack;
fHit = x.fHit;
fBench = x.fBench;
fVertexConstraint = x.fVertexConstraint;
fParamSet[0]=x.fParamSet[0];
fParamSet[1]=x.fParamSet[1];
//JMT 2006/11/13
fOutputPtr= x.fOutputPtr;
fOutputNTracks=x.fOutputNTracks;
fOutputSize=x.fOutputSize;
fDRAW = x.fDRAW;
fAsk = x.fAsk;
}
// ----------------------------------------------------------------------------------
AliHLTTPCCATracker & AliHLTTPCCATracker::operator=( const AliHLTTPCCATracker &x )
{
//Copy operator
fVertex = x.fVertex;
fTrack = x.fTrack;
fHit = x.fHit;
fBench = x.fBench;
fVertexConstraint = x.fVertexConstraint;
fParamSet[0]=x.fParamSet[0];
fParamSet[1]=x.fParamSet[1];
//JMT 2006/11/13
fOutputPtr= x.fOutputPtr;
fOutputNTracks=x.fOutputNTracks;
fOutputSize=x.fOutputSize;
fDRAW = x.fDRAW;
fAsk = x.fAsk;
return *this;
}
// ----------------------------------------------------------------------------------
AliHLTTPCCATracker::~AliHLTTPCCATracker()
{
// Destructor.
if(fHit) {
delete [] fHit;
}
if(fTrack) {
delete fTrack;
}
//JMT 2006/11/13
if(fOutputPtr){
fOutputPtr = NULL;
delete fOutputPtr;
}
}
// ----------------------------------------------------------------------------------
void AliHLTTPCCATracker::CACreateHistos()
{
// IK histogramming
static bool firstCall = kTRUE;
if (firstCall){
firstCall = kFALSE;
fHistEvent = 0;
TDirectory *curdir = gDirectory;
TDirectory *histodir = gROOT->mkdir("histodir");
histodir->cd();
fHistNClusters = new TH1F("h_NClusters", "Number of clusters in event", 100, 0.0, 1000.0);
fHistClustersXY[0] = new TH2F("h_ClustersXY_0", "Clusters in XY plane Ev 0", 100, 50.0, 300.0, 100, -100.0, 100.0);
fHistClustersXY[1] = new TH2F("h_ClustersXY_1", "Clusters in XY plane Ev 1", 100, 50.0, 300.0, 100, -100.0, 100.0);
fHistClustersXY[2] = new TH2F("h_ClustersXY_2", "Clusters in XY plane Ev 2", 100, 50.0, 300.0, 100, -100.0, 100.0);
fHistClustersXY[3] = new TH2F("h_ClustersXY_3", "Clusters in XY plane Ev 3", 100, 50.0, 300.0, 100, -100.0, 100.0);
fHistClustersXY[4] = new TH2F("h_ClustersXY_4", "Clusters in XY plane Ev 4", 100, 50.0, 300.0, 100, -100.0, 100.0);
fHistClustersXY[5] = new TH2F("h_ClustersXY_5", "Clusters in XY plane Ev 5", 100, 50.0, 300.0, 100, -100.0, 100.0);
fHistClustersXY[6] = new TH2F("h_ClustersXY_6", "Clusters in XY plane Ev 6", 100, 50.0, 300.0, 100, -100.0, 100.0);
fHistClustersXY[7] = new TH2F("h_ClustersXY_7", "Clusters in XY plane Ev 7", 100, 50.0, 300.0, 100, -100.0, 100.0);
fHistClustersXY[8] = new TH2F("h_ClustersXY_8", "Clusters in XY plane Ev 8", 100, 50.0, 300.0, 100, -100.0, 100.0);
fHistClustersXY[9] = new TH2F("h_ClustersXY_9", "Clusters in XY plane Ev 9", 100, 50.0, 300.0, 100, -100.0, 100.0);
fListHisto = gDirectory->GetList();
curdir->cd();
if( fDRAW ){
fMyapp = new TApplication("myapp", 0, 0);
gStyle->SetCanvasBorderMode(0);
gStyle->SetCanvasBorderSize(1);
gStyle->SetCanvasColor(0);
fYX = new TCanvas ("YX", "YX (Pad-Row) window", -10, 0, 680, 400);
fYX->Range(-50.0, 80.0, 50.0, 250.0);
fYX->Clear();
fYX->Draw();
fZX = new TCanvas ("ZX", "ZX window", -700, 0, 680, 400);
fZX->Range(-250.0, 80.0, 250.0, 250.0);
fZX->Clear();
fZX->Draw();
#ifdef XXX
char symbol;
if (fAsk){
do{
std::cin.get(symbol);
if (symbol == 'r')
fAsk = 0;
} while (symbol != '\n');
}
#endif //XXX
} //fDRAW
}
}
// ----------------------------------------------------------------------------------
void AliHLTTPCCATracker::CAWriteHistos()
{
// IK Open the output file and write histogramms
TFile *outfile = new TFile("ConfMapper_histo.root", "RECREATE");
TIter hiter(fListHisto);
while (TObject *obj = hiter()) obj->Write();
outfile->Close();
}
// ----------------------------------------------------------------------------------
Bool_t AliHLTTPCCATracker::ReadHits(UInt_t count, AliHLTTPCSpacePointData* hits )
{
//read hits
Int_t nhit=(Int_t)count;
vector fVecHits;
fVecHits.clear();
for (Int_t i=0;ifX;
hit.fY = pSP->fY;
hit.fZ = pSP->fZ;
hit.fErrx = 1.0;//pSP->fSigmaY2;
if (patch <= 3)
hit.fErry = 10.0;//1.0;//pSP->fSigmaY2;
else
hit.fErry = 10.0;//pSP->fSigmaY2;
hit.fErrz = 1.0;//pSP->fSigmaZ2;
hit.fIndex = i;
hit.fCounter = 0;
fVecHits.push_back(hit);
}
if( fDRAW ){
TMarker *mhit = new TMarker(0.0, 0.0, 6);
mhit->SetMarkerColor(kBlue);
for (Int_t i = fPatchFirstHitInd; i <= fPatchLastHitInd; i++)
{
fYX->cd();
mhit->DrawMarker(fVecHits[i].fY, fVecHits[i].fX);
fZX->cd();
mhit->DrawMarker(fVecHits[i].fZ, fVecHits[i].fX);
}
delete mhit;
fYX->cd(); fYX->Update(); fYX->Draw();
fZX->cd(); fZX->Update(); fZX->Draw();
} //fDRAW
return;
}
// ----------------------------------------------------------------------------------
void AliHLTTPCCATracker::CAFindPatchTracks(Int_t patch)
{
//!
//if(fDRAW){
TLine *line = new TLine();
line->SetLineColor(kBlack);
//} //fDRAW
Double_t dist01, dist12, dist02, mindist, chi2, minchi2;
AliHLTTPCCAHit *ph0, *ph1, *ph2, *phbest, *next;
Double_t x, y, z, ty, tz, fCovy, fCovty, fCovyty, fCovz, fCovtz, fCovztz, ye, ze, dx, dy, dz, sy2, sz2;
for (Int_t i1 = fPatchFirstHitInd; i1 < fPatchLastHitInd; i1++) // fCounter != 0){ // the previous hit exists
x = ph1->fX;
y = ph1->fY;
z = ph1->fZ;
dx = (ph1->fX-ph0->fX); // assume different x !!!
if (TMath::Abs(dx) < 0.0001) dx = 0.0001;
ty = (ph1->fY-ph0->fY)/dx;
tz = (ph1->fZ-ph0->fZ)/dx;
fCovy = ph1->fErry*ph1->fErry;
fCovty = (ph0->fErry*ph0->fErry + ph1->fErry*ph1->fErry)/(dx*dx);
fCovyty = (ph1->fErry*ph1->fErry)/dx;
fCovz = ph1->fErrz*ph1->fErrz;
fCovtz = (ph0->fErrz*ph0->fErrz + ph1->fErrz*ph1->fErrz)/(dx*dx);
fCovztz = (ph1->fErrz*ph1->fErrz)/dx;
}
for (Int_t i2 = i1+1; i2 <= fPatchLastHitInd; i2++)
{
ph2 = &(fVecHits[i2]);
if (ph2->fX < ph1->fX) continue; // no backward direction!
dist12 = TMath::Sqrt((ph1->fX-ph2->fX)*(ph1->fX-ph2->fX) + (ph1->fY-ph2->fY)*(ph1->fY-ph2->fY) + (ph1->fZ-ph2->fZ)*(ph1->fZ-ph2->fZ));
if (dist12 < mindist){
if (ph1->fCounter == 0){
mindist = dist12;
phbest = ph2;
}
else{
// calculate chi2 distance between the hit and the line
dx = (ph2->fX-x); // assume different x !!!
if (TMath::Abs(dx) < 0.0001) dx = 0.0001;
ye = y + ty*dx;
ze = z + tz*dx;
sy2 = fCovy + 2.0*fCovyty*dx + fCovty*dx*dx;
sz2 = fCovz + 2.0*fCovztz*dx + fCovtz*dx*dx;
dy = ph2->fY - ye;
dz = ph2->fZ - ze;
chi2 = (dy*dy)/(sy2+ph2->fErry*ph2->fErry) + (dz*dz)/(sz2+ph2->fErrz*ph2->fErrz);
// check the straight line model
if (chi2 < minchi2){
mindist = dist12;
phbest = ph2;
}
}
}
}
if (phbest != NULL){// closest hit found
// exchange jbest with the next hit
Double_t xtmp = next->fX;
Double_t ytmp = next->fY;
Double_t ztmp = next->fZ;
Double_t errxtmp = next->fErrx;
Double_t errytmp = next->fErry;
Double_t errztmp = next->fErrz;
Int_t indextmp = next->fIndex;
Int_t countertmp = next->fCounter;
next->fX = phbest->fX;
next->fY = phbest->fY;
next->fZ = phbest->fZ;
next->fErrx = phbest->fErrx;
next->fErry = phbest->fErry;
next->fErrz = phbest->fErrz;
next->fIndex = phbest->fIndex;
next->fCounter = phbest->fCounter;
phbest->fX = xtmp;
phbest->fY = ytmp;
phbest->fZ = ztmp;
phbest->fErrx = errxtmp;
phbest->fErry = errytmp;
phbest->fErrz = errztmp;
phbest->fIndex = indextmp;
phbest->fCounter = countertmp;
if (ph1->fCounter == 0)
ph1->fCounter = 1;
next->fCounter = ph1->fCounter+1;
ph0 = ph1;
dist01 = mindist;
if(fDRAW){
fYX->cd();
line->DrawLine(ph1->fY, ph1->fX, next->fY, next->fX);
fZX->cd();
line->DrawLine(ph1->fZ, ph1->fX, next->fZ, next->fX);
}//fDRAW
}
}
if(fDRAW){
delete line;
fYX->cd(); fYX->Update(); fYX->Draw();
fZX->cd(); fZX->Update(); fZX->Draw();
}//fDRAW
AliHLTTPCCATrack tr;
tr.fNhits = 0;
tr.fChi2 = 0.0;
tr.fNdf = -4;
tr.fVecIHits.clear();
fPatchFirstTrackInd = fVecPatchTracks.size();
fPatchLastTrackInd = fPatchFirstTrackInd - 1;
AliHLTTPCCAHit *myphf;
// collect tracks
for (Int_t ihr = fPatchLastHitInd; ihr >= fPatchFirstHitInd; ihr--){
AliHLTTPCCAHit* phit = &(fVecHits[ihr]);
if ((phit->fCounter < 5)&&(tr.fNhits == 0))
continue; // do not collect short tracks
if ((phit->fCounter != 0)&&(tr.fNhits == 0))// store the first hit
myphf = phit;
if (phit->fCounter != 0){//add hit to the track
tr.fNhits++;
tr.fVecIHits.push_back(ihr);
if (tr.fNhits == 2){ // calculate initial track parameters
AliHLTTPCCAHit* phit0 = &(fVecHits[tr.fVecIHits[0]]);
AliHLTTPCCAHit* phit1 = &(fVecHits[tr.fVecIHits[1]]);
tr.fX = phit1->fX;
tr.fY = phit1->fY;
tr.fZ = phit1->fZ;
Double_t dx = (phit1->fX-phit0->fX); // assume different x !!!
if (TMath::Abs(dx) < 0.0001) dx = 0.0001;
tr.fTy = (phit1->fY-phit0->fY)/dx;
tr.fTz = (phit1->fZ-phit0->fZ)/dx;
tr.fCovy = phit1->fErry*phit1->fErry;
tr.fCovty = (phit0->fErry*phit0->fErry + phit1->fErry*phit1->fErry)/(dx*dx);
tr.fCovyty = (phit1->fErry*phit1->fErry)/dx;
tr.fCovz = phit1->fErrz*phit1->fErrz;
tr.fCovtz = (phit0->fErrz*phit0->fErrz + phit1->fErrz*phit1->fErrz)/(dx*dx);
tr.fCovztz = (phit1->fErrz*phit1->fErrz)/dx;
}
if (tr.fNhits > 2){
// propagate the track
Double_t dx = (phit->fX-tr.fX); // assume different x !!!
if (TMath::Abs(dx) < 0.0001) dx = 0.0001;
Double_t ye = tr.fY + tr.fTy*dx;
Double_t ze = tr.fZ + tr.fTz*dx;
Double_t fCovy = tr.fCovy + 2.0*tr.fCovyty*dx + tr.fCovty*dx*dx;
Double_t fCovyty = tr.fCovyty + tr.fCovty*dx;
Double_t fCovty = tr.fCovty;
Double_t fCovz = tr.fCovz + 2.0*tr.fCovztz*dx + tr.fCovtz*dx*dx;
Double_t fCovztz = tr.fCovztz + tr.fCovtz*dx;
Double_t fCovtz = tr.fCovtz;
Double_t dy = phit->fY - ye;
Double_t dz = phit->fZ - ze;
// add the measurement
Double_t w = 1.0/(phit->fErry*phit->fErry + fCovy);
tr.fY = ye + fCovy*dy*w;
tr.fTy = tr.fTy + fCovyty*dy*w;
tr.fCovy = fCovy - fCovy*fCovy*w;
tr.fCovyty = fCovyty - fCovy*fCovyty*w;
tr.fCovty = fCovty -fCovyty*fCovyty*w;
tr.fChi2 += dy*dy*w;
tr.fNdf += 1;
w = 1.0/(phit->fErrz*phit->fErrz + fCovz);
tr.fZ = ze + fCovz*dz*w;
tr.fTz = tr.fTz + fCovztz*dz*w;
tr.fCovz = fCovz - fCovz*fCovz*w;
tr.fCovztz = fCovztz - fCovz*fCovztz*w;
tr.fCovtz = fCovtz -fCovztz*fCovztz*w;
tr.fX += dx;
tr.fChi2 += dz*dz*w;
tr.fNdf += 1;
}
}
if (phit->fCounter == 1){// store the track
tr.fGood = 1;
tr.fUsed = 0;
tr.fNext = -1;
tr.fPatch = patch;
Double_t trdist = TMath::Sqrt((myphf->fX-phit->fX)*(myphf->fX-phit->fX)+
(myphf->fY-phit->fY)*(myphf->fY-phit->fY)+
(myphf->fZ-phit->fZ)*(myphf->fZ-phit->fZ));
if ((trdist > 1.0)&&(tr.fChi2/tr.fNdf < 10.0)){
fVecPatchTracks.push_back(tr);
fPatchLastTrackInd++;
}
// reset the track
tr.fNhits = 0;
tr.fChi2 = 0.0;
tr.fNdf = -4;
tr.fVecIHits.clear();
}
}
// sort tracks according (currently) to number of hits
//sort(fVecPatchTracks.begin(), fVecPatchTracks.end(), compareNhits); //don't need to sort here
if(fDRAW){
TLine *trline = new TLine();
trline->SetLineColor(kGreen);
for (Int_t itr = fPatchFirstTrackInd; itr <= fPatchLastTrackInd; itr++){
AliHLTTPCCATrack *ptr = &(fVecPatchTracks[itr]);
AliHLTTPCCAHit* phitf = &(fVecHits[ptr->fVecIHits.back()]);
AliHLTTPCCAHit* phitl = &(fVecHits[ptr->fVecIHits.front()]);
fYX->cd();
Double_t yf = ptr->fY + ptr->fTy*(phitf->fX-ptr->fX);
Double_t yl = ptr->fY + ptr->fTy*(phitl->fX-ptr->fX);
trline->DrawLine(yf, phitf->fX, yl, phitl->fX);
fZX->cd();
Double_t zf = ptr->fZ + ptr->fTz*(phitf->fX-ptr->fX);
Double_t zl = ptr->fZ + ptr->fTz*(phitl->fX-ptr->fX);
trline->DrawLine(zf, phitf->fX, zl, phitl->fX);
}
delete trline;
fYX->cd(); fYX->Update(); fYX->Draw();
fZX->cd(); fZX->Update(); fZX->Draw();
}//fDRAW
return;
}
// ----------------------------------------------------------------------------------
void AliHLTTPCCATracker::CAFindSliceTracks()
{
//!
Int_t ntracks = fVecPatchTracks.size();
// merge patch tracks into slice tracks
// start with the longest tracks in the first patches
// sort tracks according (currently) to patch and within patch - number of hits
sort(fVecPatchTracks.begin(), fVecPatchTracks.end(), CompareCATracks);
for (Int_t itr1 = 0; itr1 < ntracks-1; itr1++){
AliHLTTPCCATrack *ptr1 = &(fVecPatchTracks[itr1]);
Double_t maxdisty = 10.0;
Double_t maxdistz = 5.0;
Double_t mindist = 10.0;
Int_t next = -1;
#ifdef XXX
for (Int_t itr2 = itr1+1; itr2 < ntracks; itr2++){
AliHLTTPCCATrack *ptr2 = &(fVecPatchTracks[itr2]);
if (ptr2->patch == ptr1->patch) continue; // the same patch - no prolongation
if (ptr2->patch > ptr1->patch+1) break; // sorted tracks - no prolongation skippeng over patches
if (ptr2->fUsed == 1) continue; // already matched
AliHLTTPCCAHit* phitf2 = &(fVecHits[ptr2->fVecIHits.back()]);
AliHLTTPCCAHit* phitl2 = &(fVecHits[ptr2->fVecIHits.front()]);
// extrapolate tr1 to the both ends of tr2
Double_t dyf = ptr1->fY + ptr1->fty*(phitf2->fX-ptr1->fX) - phitf2->fY;
Double_t dyl = ptr1->fY + ptr1->fTy*(phitl2->fX-ptr1->fX) - phitl2->fY;
Double_t dzf = ptr1->fZ + ptr1->fTz*(phitf2->fX-ptr1->fX) - phitf2->fZ;
Double_t dzl = ptr1->fZ + ptr1->fTz*(phitl2->fX-ptr1->fX) - phitl2->fZ;
// roughly similar tracks ?
if ((TMath::Abs(dyf) > maxdisty)||(TMath::Abs(dyl) > maxdisty)||(TMath::Abs(dzf) > maxdistz)||(TMath::Abs(dzl) > maxdistz)) continue;
// roughly parallel tracks ?
Double_t dist = TMath::Sqrt((dyf-dyl)*(dyf-dyl)+(dzf-dzl)*(dzf-dzl));
if (dist > mindist) continue;
mindist = dist;
next = itr2;
}
#endif
// found track prolongations?
if (next != -1){
AliHLTTPCCATrack *ptr2 = &(fVecPatchTracks[next]);
ptr1->fNext = next;
ptr2->fUsed = 1;
}
}
AliHLTTPCCATrack tr;
tr.fNhits = 0;
tr.fChi2 = 0.0;
tr.fNdf = -4;
tr.fVecIHits.clear();
//collect tracks
for (Int_t itr = 0; itr < ntracks; itr++){
AliHLTTPCCATrack *ptr = &(fVecPatchTracks[itr]);
if (ptr->fUsed) continue; // start with a track not used in prolongations
Int_t first = 1;
do{
if (first == 1){
first = 0;
}
else{
ptr = &(fVecPatchTracks[ptr->fNext]);
}
for (Int_t ih = 0; ih < ptr->fNhits; ih++){
tr.fVecIHits.push_back(ptr->fVecIHits[ih]);
tr.fNhits++;
}
}while(ptr->fNext != -1);
//sort hits according to increasing x
sort(tr.fVecIHits.begin(), tr.fVecIHits.end(), CompareCAHitsX);
fVecSliceTracks.push_back(tr);
tr.fNhits = 0;
tr.fChi2 = 0.0;
tr.fNdf = -4;
tr.fVecIHits.clear();
}
//if(fDRAW){
TLine *trline = new TLine();
trline->SetLineColor(kRed);
//} //fDRAW
#if WRITETRACKS
UInt_t size = 0;
UInt_t nTracks = 0;
#endif
for (vector::iterator trIt = fVecSliceTracks.begin(); trIt != fVecSliceTracks.end(); trIt++){
AliHLTTPCCAHit* phit0 = &(fVecHits[trIt->fVecIHits[trIt->fNhits-1]]);
AliHLTTPCCAHit* phit1 = &(fVecHits[trIt->fVecIHits[trIt->fNhits-2]]);
trIt->fX = phit1->fX;
trIt->fY = phit1->fY;
trIt->fZ = phit1->fZ;
Double_t dx = (phit1->fX-phit0->fX); // assume different x !!!
if (TMath::Abs(dx) < 0.0001) dx = 0.0001;
trIt->fTy = (phit1->fY-phit0->fY)/dx;
trIt->fTz = (phit1->fZ-phit0->fZ)/dx;
trIt->fCovy = phit1->fErry*phit1->fErry;
trIt->fCovty = (phit0->fErry*phit0->fErry + phit1->fErry*phit1->fErry)/(dx*dx);
trIt->fCovyty = (phit1->fErry*phit1->fErry)/dx;
trIt->fCovz = phit1->fErrz*phit1->fErrz;
trIt->fCovtz = (phit0->fErrz*phit0->fErrz + phit1->fErrz*phit1->fErrz)/(dx*dx);
trIt->fCovztz = (phit1->fErrz*phit1->fErrz)/dx;
for (Int_t ih = trIt->fNhits-3; ih >= 0; ih--){
AliHLTTPCCAHit* phit = &(fVecHits[trIt->fVecIHits[ih]]);
// propagate the track
Double_t dx = (phit->fX-trIt->fX); // assume different x !!!
if (TMath::Abs(dx) < 0.0001) dx = 0.0001;
Double_t ye = trIt->fY + trIt->fTy*dx;
Double_t ze = trIt->fZ + trIt->fTz*dx;
Double_t fCovy = trIt->fCovy + 2.0*trIt->fCovyty*dx + trIt->fCovty*dx*dx;
Double_t fCovyty = trIt->fCovyty + trIt->fCovty*dx;
Double_t fCovty = trIt->fCovty;
Double_t fCovz = trIt->fCovz + 2.0*trIt->fCovztz*dx + trIt->fCovtz*dx*dx;
Double_t fCovztz = trIt->fCovztz + trIt->fCovtz*dx;
Double_t fCovtz = trIt->fCovtz;
Double_t dy = phit->fY - ye;
Double_t dz = phit->fZ - ze;
// add the measurement
Double_t w = 1.0/(phit->fErry*phit->fErry + fCovy);
trIt->fY = ye + fCovy*dy*w;
trIt->fTy = trIt->fTy + fCovyty*dy*w;
trIt->fCovy = fCovy - fCovy*fCovy*w;
trIt->fCovyty = fCovyty - fCovy*fCovyty*w;
trIt->fCovty = fCovty -fCovyty*fCovyty*w;
trIt->fChi2 += dy*dy*w;
trIt->fNdf += 1;
w = 1.0/(phit->fErrz*phit->fErrz + fCovz);
trIt->fZ = ze + fCovz*dz*w;
trIt->fTz = trIt->fTz + fCovztz*dz*w;
trIt->fCovz = fCovz - fCovz*fCovz*w;
trIt->fCovztz = fCovztz - fCovz*fCovztz*w;
trIt->fCovtz = fCovtz -fCovztz*fCovztz*w;
trIt->fChi2 += dz*dz*w;
trIt->fNdf += 1;
trIt->fX += dx;
}
trIt->fGood = 1;
trIt->fUsed = 0;
trIt->fNext = -1;
trIt->fPatch = -1;
//if (trIt->chi2/trIt->ndf < 1.0)
//trIt->good = 0;
// JMT 2006/11/13 Write Tracks to container
#if WRITETRACKS
AliHLTTPCCAHit* firstHit = &(fVecHits[trIt->fVecIHits[0]]);
AliHLTTPCCAHit* lastHit = &(fVecHits[trIt->fVecIHits[trIt->fNhits-1]]);
Float_t xFirst = (Float_t) firstHit->fX;
Float_t yFirst = (Float_t) trIt->fY + trIt->fTy*(xFirst-trIt->fX);
Float_t zFirst = (Float_t) trIt->fZ + trIt->fTz*(xFirst-trIt->fX);
Float_t xLast = (Float_t) lastHit->fX;
Float_t yLast = (Float_t) trIt->fY + trIt->fTy*(xLast-trIt->fX);
Float_t zLast = (Float_t) trIt->fZ + trIt->fTz*(xLast-trIt->fX);
fOutputPtr->fX = xFirst;
fOutputPtr->fY = yFirst;
fOutputPtr->fZ = zFirst;
fOutputPtr->fPt = -9876.0;
fOutputPtr->fPterr = 1;
fOutputPtr->fLastX = xLast;
fOutputPtr->fLastY = yLast;
fOutputPtr->fLastZ = zLast;
fOutputPtr->fPsi = atan(trIt->fTy);
fOutputPtr->fTgl = trIt->fTz;
fOutputPtr->fPsierr = 1;
fOutputPtr->fTglerr = 1;
fOutputPtr->fCharge = 1;
fOutputPtr->fNPoints = 0;
Byte_t *tmpP = (Byte_t *)fOutputPtr;
tmpP += sizeof(AliHLTTPCTrackSegmentData); //+fOutputPtr->fNPoints*sizeof(UInt_t);
size += sizeof(AliHLTTPCTrackSegmentData); //+fOutputPtr->fNPoints*sizeof(UInt_t);
fOutputPtr = (AliHLTTPCTrackSegmentData*)tmpP;
nTracks++;
#endif
if(fDRAW){
AliHLTTPCCAHit* phitf = &(fVecHits[trIt->fVecIHits[0]]);
AliHLTTPCCAHit* phitl = &(fVecHits[trIt->fVecIHits[trIt->fNhits-1]]);
Double_t xf = phitf->fX;
Double_t yf = trIt->fY + trIt->fTy*(xf-trIt->fX);
Double_t zf = trIt->fZ + trIt->fTz*(xf-trIt->fX);
Double_t xl = phitl->fX;
Double_t yl = trIt->fY + trIt->fTy*(xl-trIt->fX);
Double_t zl = trIt->fZ + trIt->fTz*(xl-trIt->fX);
fYX->cd();
trline->DrawLine(yf, xf, yl, xl);
fZX->cd();
trline->DrawLine(zf, xf, zl, xl);
} //fDRAW
}
#if WRITETRACKS
fOutputNTracks = nTracks;
fOutputSize = size;
cout << "NTRACKS=" << nTracks << endl;
cout << "SIZEoF=" << sizeof(AliHLTTPCTrackSegmentData) << endl;
cout << "SIZE=" << fOutputSize << endl;
#endif
if(fDRAW){
delete trline;
fYX->cd(); fYX->Update(); fYX->Draw();
fZX->cd(); fZX->Update(); fZX->Draw();
}//fDRAW
return;
}