X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=HLT%2FTPCLib%2Ftracking-ca%2FAliTPCtrackerCA.cxx;h=88a7f981b019c38107765b153ae487c7be0b5d1c;hp=b31be58473c17287d79de2226d4f42814257b06c;hb=15d2e9cf0cb717aff7c3432044362c29247d950e;hpb=d54804bff0545cf449c527fcc1c05cd01fdc6744 diff --git a/HLT/TPCLib/tracking-ca/AliTPCtrackerCA.cxx b/HLT/TPCLib/tracking-ca/AliTPCtrackerCA.cxx index b31be58473c..88a7f981b01 100644 --- a/HLT/TPCLib/tracking-ca/AliTPCtrackerCA.cxx +++ b/HLT/TPCLib/tracking-ca/AliTPCtrackerCA.cxx @@ -1,5 +1,5 @@ // $Id$ -//*************************************************************************** +// ************************************************************************** // This file is property of and copyright by the ALICE HLT Project * // ALICE Experiment at CERN, All rights reserved. * // * @@ -14,27 +14,29 @@ // appear in the supporting documentation. The authors make no claims * // about the suitability of this software for any purpose. It is * // provided "as is" without express or implied warranty. * +// * //*************************************************************************** #include "AliTPCtrackerCA.h" -#include -#include -#include "AliCluster.h" +#include "TTree.h" +#include "Riostream.h" +//#include "AliCluster.h" #include "AliTPCClustersRow.h" #include "AliTPCParam.h" +#include "AliTPCClusterParam.h" + #include "AliRun.h" #include "AliRunLoader.h" #include "AliStack.h" -#include "AliHLTTPCCATracker.h" -#include "AliHLTTPCCAGBHit.h" #include "AliHLTTPCCAGBTracker.h" +#include "AliHLTTPCCAGBHit.h" #include "AliHLTTPCCAGBTrack.h" -#include "AliHLTTPCCAMCTrack.h" -#include "AliHLTTPCCAOutTrack.h" #include "AliHLTTPCCAPerformance.h" #include "AliHLTTPCCAParam.h" +#include "AliHLTTPCCATrackConvertor.h" +#include "AliHLTTPCCATracker.h" #include "TMath.h" #include "AliTPCLoader.h" @@ -42,27 +44,31 @@ #include "AliTPCclusterMI.h" #include "AliTPCTransform.h" #include "AliTPCcalibDB.h" -#include "AliTPCReconstructor.h" #include "AliTPCtrack.h" +#include "AliTPCseed.h" #include "AliESDtrack.h" #include "AliESDEvent.h" +#include "AliTrackReference.h" +#include "TStopwatch.h" +#include "AliTPCReconstructor.h" +//#include ClassImp(AliTPCtrackerCA) AliTPCtrackerCA::AliTPCtrackerCA() - :AliTracker(),fParam(0), fClusters(0), fNClusters(0), fHLTTracker(0),fHLTPerformance(0),fDoHLTPerformance(0) + :AliTracker(),fkParam(0), fClusters(0), fNClusters(0), fHLTTracker(0),fDoHLTPerformance(0),fDoHLTPerformanceClusters(0),fStatNEvents(0) { //* default constructor } AliTPCtrackerCA::AliTPCtrackerCA(const AliTPCtrackerCA &): - AliTracker(),fParam(0), fClusters(0), fNClusters(0), fHLTTracker(0),fHLTPerformance(0),fDoHLTPerformance(0) + AliTracker(),fkParam(0), fClusters(0), fNClusters(0), fHLTTracker(0),fDoHLTPerformance(0),fDoHLTPerformanceClusters(0),fStatNEvents(0) { //* dummy } -AliTPCtrackerCA & AliTPCtrackerCA::operator=(const AliTPCtrackerCA& ) +const AliTPCtrackerCA & AliTPCtrackerCA::operator=(const AliTPCtrackerCA& ) const { //* dummy return *this; @@ -74,99 +80,179 @@ AliTPCtrackerCA::~AliTPCtrackerCA() //* destructor if( fClusters ) delete[] fClusters; if( fHLTTracker ) delete fHLTTracker; - if( fHLTPerformance ) delete fHLTPerformance; } +//#include "AliHLTTPCCADisplay.h" + AliTPCtrackerCA::AliTPCtrackerCA(const AliTPCParam *par): - AliTracker(),fParam(par), fClusters(0), fNClusters(0), fHLTTracker(0), fHLTPerformance(0),fDoHLTPerformance(0) + AliTracker(),fkParam(par), fClusters(0), fNClusters(0), fHLTTracker(0),fDoHLTPerformance(0),fDoHLTPerformanceClusters(0),fStatNEvents(0) { //* constructor - - DoHLTPerformance() = 0; + + fDoHLTPerformance = 0; + fDoHLTPerformanceClusters = 0; fHLTTracker = new AliHLTTPCCAGBTracker; - fHLTTracker->SetNSlices( fParam->GetNSector()/2 ); + fHLTTracker->SetNSlices( fkParam->GetNSector()/2 ); if( fDoHLTPerformance ){ - fHLTPerformance = new AliHLTTPCCAPerformance; - fHLTPerformance->SetTracker( fHLTTracker ); + AliHLTTPCCAPerformance::Instance().SetTracker( fHLTTracker ); } - for( int iSlice=0; iSliceNSlices(); iSlice++ ){ - - Double_t bz = AliTracker::GetBz(); - - Double_t inRmin = fParam->GetInnerRadiusLow(); - //Double_t inRmax = fParam->GetInnerRadiusUp(); - //Double_t outRmin = fParam->GetOuterRadiusLow(); - Double_t outRmax = fParam->GetOuterRadiusUp(); - Double_t plusZmin = 0.0529937; - Double_t plusZmax = 249.778; - Double_t minusZmin = -249.645; - Double_t minusZmax = -0.0799937; - Double_t dalpha = 0.349066; - Double_t alpha = 0.174533 + dalpha*iSlice; + for( Int_t iSlice=0; iSliceNSlices(); iSlice++ ){ + + const Double_t kCLight = 0.000299792458; + + Float_t bz = AliTracker::GetBz()*kCLight; + + Float_t inRmin = fkParam->GetInnerRadiusLow(); + //Float_t inRmax = fkParam->GetInnerRadiusUp(); + //Float_t outRmin = fkParam->GetOuterRadiusLow(); + Float_t outRmax = fkParam->GetOuterRadiusUp(); + Float_t plusZmin = 0.0529937; + Float_t plusZmax = 249.778; + Float_t minusZmin = -249.645; + Float_t minusZmax = -0.0799937; + Float_t dalpha = 0.349066; + Float_t alpha = 0.174533 + dalpha*iSlice; Bool_t zPlus = (iSlice<18 ); - Double_t zMin = zPlus ?plusZmin :minusZmin; - Double_t zMax = zPlus ?plusZmax :minusZmax; + Float_t zMin = zPlus ?plusZmin :minusZmin; + Float_t zMax = zPlus ?plusZmax :minusZmax; //TPCZmin = -249.645, ZMax = 249.778 - //Double_t rMin = inRmin; - //Double_t rMax = outRmax; + //Float_t rMin = inRmin; + //Float_t rMax = outRmax; - Double_t padPitch = 0.4; - Double_t sigmaZ = 0.228808; + Float_t padPitch = 0.4; + Float_t sigmaZ = 0.228808; - Int_t NRows = fParam->GetNRowLow()+fParam->GetNRowUp(); - - Double_t rowX[200]; - for( Int_t irow=0; irowGetNRowLow(); irow++){ - rowX[irow] = fParam->GetPadRowRadiiLow(irow); + Int_t nRows = fkParam->GetNRowLow()+fkParam->GetNRowUp(); + Float_t rowX[200]; + for( Int_t irow=0; irowGetNRowLow(); irow++){ + rowX[irow] = fkParam->GetPadRowRadiiLow(irow); } - for( Int_t irow=0; irowGetNRowUp(); irow++){ - rowX[fParam->GetNRowLow()+irow] = fParam->GetPadRowRadiiUp(irow); - } + for( Int_t irow=0; irowGetNRowUp(); irow++){ + rowX[fkParam->GetNRowLow()+irow] = fkParam->GetPadRowRadiiUp(irow); + } AliHLTTPCCAParam param; - param.Initialize( iSlice, NRows, rowX, alpha, dalpha, + param.Initialize( iSlice, nRows, rowX, alpha, dalpha, inRmin, outRmax, zMin, zMax, padPitch, sigmaZ, bz ); - param.YErrorCorrection() = .33;//1; - param.ZErrorCorrection() = .33;//2; - param.MaxTrackMatchDRow() = 5; - param.TrackConnectionFactor() = 5.; + param.SetHitPickUpFactor( 1. ); + param.SetMaxTrackMatchDRow( 5 ); + param.SetTrackConnectionFactor( 3.5 ); + + AliTPCClusterParam * clparam = AliTPCcalibDB::Instance()->GetClusterParam(); + for( Int_t iRow=0; iRow126) ? 1:2 ); + for( int iyz=0; iyz<2; iyz++ ){ + for( int k=0; k<7; k++ ){ + //std::cout<fParamS0Par[iyz][type][k] - param.fParamS0Par[iyz][type][k]<fParamS0Par[iyz][type][k]); + } + } + } fHLTTracker->Slices()[iSlice].Initialize( param ); } } -Int_t AliTPCtrackerCA::LoadClusters (TTree * tree) +Int_t AliTPCtrackerCA::LoadClusters (TTree * fromTree) { + // load clusters to the local arrays fNClusters = 0; if( fClusters ) delete[] fClusters; fHLTTracker->StartEvent(); - if( fDoHLTPerformance ) fHLTPerformance->StartEvent(); + if( fDoHLTPerformance ) AliHLTTPCCAPerformance::Instance().StartEvent(); - if( !fParam ) return 1; + if( !fkParam ) return 1; // load mc tracks - if( fDoHLTPerformance ){ - if( !gAlice ) return 0; - AliRunLoader *rl = gAlice->GetRunLoader(); - if( !rl ) return 0; + while( fDoHLTPerformance ){ + if( !gAlice ) break; + AliRunLoader *rl = AliRunLoader::Instance();//gAlice->GetRunLoader(); + if( !rl ) break; rl->LoadKinematics(); AliStack *stack = rl->Stack(); - if( !stack ) return 0 ; + if( !stack ) break; - fHLTPerformance->SetNMCTracks( stack->GetNtrack() ); + AliHLTTPCCAPerformance::Instance().SetNMCTracks( stack->GetNtrack() ); for( Int_t itr=0; itrGetNtrack(); itr++ ){ TParticle *part = stack->Particle(itr); - fHLTPerformance->ReadMCTrack( itr, part ); + AliHLTTPCCAPerformance::Instance().ReadMCTrack( itr, part ); + } + + { // check for MC tracks at the TPC entrance + + Bool_t *isTPC = 0; + isTPC = new Bool_t [stack->GetNtrack()]; + for( Int_t i=0; iGetNtrack(); i++ ) isTPC[i] = 0; + rl->LoadTrackRefs(); + TTree *mcTree = rl->TreeTR(); + if( !mcTree ) break; + TBranch *branch=mcTree->GetBranch("TrackReferences"); + if (!branch ) break; + TClonesArray tpcdummy("AliTrackReference",1000), *tpcRefs=&tpcdummy; + branch->SetAddress(&tpcRefs); + Int_t nr=(Int_t)mcTree->GetEntries(); + for (Int_t r=0; rGetEvent(r); + Int_t nref = tpcRefs->GetEntriesFast(); + if (!nref) continue; + AliTrackReference *tpcRef= 0x0; + for (Int_t iref=0; irefUncheckedAt(iref); + if (tpcRef->DetectorId() == AliTrackReference::kTPC) break; + tpcRef = 0x0; + } + if (!tpcRef) continue; + + if( isTPC[tpcRef->Label()] ) continue; + + AliHLTTPCCAPerformance::Instance().ReadMCTPCTrack(tpcRef->Label(), + tpcRef->X(),tpcRef->Y(),tpcRef->Z(), + tpcRef->Px(),tpcRef->Py(),tpcRef->Pz() ); + isTPC[tpcRef->Label()] = 1; + tpcRefs->Clear(); + } + if( isTPC ) delete[] isTPC; } - } + + while( fDoHLTPerformanceClusters ){ + AliTPCLoader *tpcl = (AliTPCLoader*) rl->GetDetectorLoader("TPC"); + if( !tpcl ) break; + if( tpcl->TreeH() == 0x0 ){ + if( tpcl->LoadHits() ) break; + } + if( tpcl->TreeH() == 0x0 ) break; + + AliTPC *tpc = (AliTPC*) gAlice->GetDetector("TPC"); + Int_t nEnt=(Int_t)tpcl->TreeH()->GetEntries(); + Int_t nPoints = 0; + for (Int_t iEnt=0; iEntResetHits(); + tpcl->TreeH()->GetEvent(iEnt); + AliTPChit *phit = (AliTPChit*)tpc->FirstHit(-1); + for ( ; phit; phit=(AliTPChit*)tpc->NextHit() ) nPoints++; + } + AliHLTTPCCAPerformance::Instance().SetNMCPoints( nPoints ); + + for (Int_t iEnt=0; iEntResetHits(); + tpcl->TreeH()->GetEvent(iEnt); + AliTPChit *phit = (AliTPChit*)tpc->FirstHit(-1); + for ( ; phit; phit=(AliTPChit*)tpc->NextHit() ){ + AliHLTTPCCAPerformance::Instance().ReadMCPoint( phit->GetTrack(),phit->X(), phit->Y(),phit->Z(),phit->Time(), phit->fSector%36); + } + } + break; + } + break; + } - TBranch * br = tree->GetBranch("Segment"); + TBranch * br = fromTree->GetBranch("Segment"); if( !br ) return 1; AliTPCClustersRow *clrow = new AliTPCClustersRow; @@ -177,27 +263,27 @@ Int_t AliTPCtrackerCA::LoadClusters (TTree * tree) br->SetAddress(&clrow); // - Int_t NEnt=Int_t(tree->GetEntries()); + Int_t nEnt=Int_t(fromTree->GetEntries()); fNClusters = 0; - for (Int_t i=0; iGetEntry(i); Int_t sec,row; - fParam->AdjustSectorRow(clrow->GetID(),sec,row); + fkParam->AdjustSectorRow(clrow->GetID(),sec,row); fNClusters += clrow->GetArray()->GetEntriesFast(); } fClusters = new AliTPCclusterMI [fNClusters]; fHLTTracker->SetNHits( fNClusters ); - if( fDoHLTPerformance ) fHLTPerformance->SetNHits( fNClusters ); - int ind=0; - for (Int_t i=0; iGetEntry(i); Int_t sec,row; - fParam->AdjustSectorRow(clrow->GetID(),sec,row); - int NClu = clrow->GetArray()->GetEntriesFast(); - Double_t x = fParam->GetPadRowRadii(sec,row); - for (Int_t icl=0; iclAdjustSectorRow(clrow->GetID(),sec,row); + Int_t nClu = clrow->GetArray()->GetEntriesFast(); + Float_t x = fkParam->GetPadRowRadii(sec,row); + for (Int_t icl=0; iclGetDetector()}; transform->Transform(xx,id,0,1); //if (!AliTPCReconstructor::GetRecoParam()->GetBYMirror()){ - if (cluster->GetDetector()%36>17){ - xx[1]*=-1; - } + //if (cluster->GetDetector()%36>17){ + //xx[1]*=-1; + //} //} cluster->SetX(xx[0]); cluster->SetY(xx[1]); cluster->SetZ(xx[2]); - TGeoHMatrix *mat = fParam->GetClusterMatrix(cluster->GetDetector()); + TGeoHMatrix *mat = fkParam->GetClusterMatrix(cluster->GetDetector()); Double_t pos[3]= {cluster->GetX(),cluster->GetY(),cluster->GetZ()}; Double_t posC[3]={cluster->GetX(),cluster->GetY(),cluster->GetZ()}; if (mat) mat->LocalToMaster(pos,posC); @@ -235,20 +321,21 @@ Int_t AliTPCtrackerCA::LoadClusters (TTree * tree) cluster->SetY(posC[1]); cluster->SetZ(posC[2]); - Double_t y = cluster->GetY(); - Double_t z = cluster->GetZ(); + x = cluster->GetX(); + Float_t y = cluster->GetY(); + Float_t z = cluster->GetZ(); if( sec>=36 ){ sec = sec - 36; - row = row + fParam->GetNRowLow(); + row = row + fkParam->GetNRowLow(); } Int_t index = ind++; fClusters[index] = *cluster; fHLTTracker->ReadHit( x, y, z, - TMath::Sqrt(cluster->GetSigmaY2()), TMath::Sqrt(cluster->GetSigmaZ2()), - index, sec, row ); - if( fDoHLTPerformance ) fHLTPerformance->ReadHitLabel(index, lab0, lab1, lab2 ); + TMath::Sqrt(cluster->GetSigmaY2()), TMath::Sqrt(cluster->GetSigmaZ2()), + cluster->GetMax(), index, sec, row ); + if( fDoHLTPerformance ) AliHLTTPCCAPerformance::Instance().ReadHitLabel(index, lab0, lab1, lab2 ); } } delete clrow; @@ -262,65 +349,232 @@ AliCluster * AliTPCtrackerCA::GetCluster(Int_t index) const Int_t AliTPCtrackerCA::Clusters2Tracks( AliESDEvent *event ) { + // reconstruction //cout<<"Start of AliTPCtrackerCA"<FindTracks(); - if( fDoHLTPerformance ) fHLTPerformance->Performance(); + //cout<<"Do performance.."<WriteSettings(geo); + } + geo.close(); + } + + fstream hits; + char name[255]; + sprintf( name,"CAEvents/%i.event.dat",fStatNEvents ); + hits.open(name, ios::out); + if( hits.is_open() ){ + fHLTTracker->WriteEvent(hits); + fstream tracks; + sprintf( name,"CAEvents/%i.tracks.dat",fStatNEvents ); + tracks.open(name, ios::out); + fHLTTracker->WriteTracks(tracks); + } + hits.close(); + if( fDoHLTPerformance ){ + fstream mcevent, mcpoints; + char mcname[255]; + sprintf( mcname,"CAEvents/%i.mcevent.dat",fStatNEvents ); + mcevent.open(mcname, ios::out); + if( mcevent.is_open() ){ + AliHLTTPCCAPerformance::Instance().WriteMCEvent(mcevent); + } + if(1 && fDoHLTPerformanceClusters ){ + sprintf( mcname,"CAEvents/%i.mcpoints.dat",fStatNEvents ); + mcpoints.open(mcname, ios::out); + if( mcpoints.is_open() ){ + AliHLTTPCCAPerformance::Instance().WriteMCPoints(mcpoints); + } + mcpoints.close(); + } + mcevent.close(); + } + } + fStatNEvents++; if( event ){ for( Int_t itr=0; itrNTracks(); itr++ ){ - AliTPCtrack tTPC; + //AliTPCtrack tTPC; + AliTPCseed tTPC; AliHLTTPCCAGBTrack &tCA = fHLTTracker->Tracks()[itr]; - AliHLTTPCCATrackParam &par = tCA.Param(); - - par.GetExtParam( tTPC, tCA.Alpha(), fHLTTracker->Slices()[0].Param().Bz() ); - + AliHLTTPCCATrackParam par = tCA.Param(); + AliHLTTPCCATrackConvertor::GetExtParam( par, tTPC, tCA.Alpha() ); tTPC.SetMass(0.13957); - int nhits = tCA.NHits(); - if( nhits>kMaxRow ) nhits = kMaxRow; + tTPC.SetdEdx( tCA.DeDx() ); + if( TMath::Abs(tTPC.GetSigned1Pt())>1./0.02 ) continue; + Int_t nhits = tCA.NHits(); + Int_t firstHit=0; + if( nhits>160 ){ + firstHit = nhits-160; + nhits=160; + } + tTPC.SetNumberOfClusters(nhits); + + Float_t alpha = tCA.Alpha(); + AliHLTTPCCATrackParam t0 = par; for( Int_t ih=0; ihTrackHits()[tCA.FirstHitRef()+ih]; - Int_t ext_index = fHLTTracker->Hits()[index].ID(); - tTPC.SetClusterIndex(ih, ext_index); + Int_t index = fHLTTracker->TrackHits()[tCA.FirstHitRef()+firstHit+ih]; + AliHLTTPCCAGBHit &h = fHLTTracker->Hits()[index]; + Int_t extIndex = h.ID(); + tTPC.SetClusterIndex(ih, extIndex); + + AliTPCclusterMI *c = &(fClusters[extIndex]); + tTPC.SetClusterPointer(h.IRow(), c ); + AliTPCTrackerPoint &point = *(tTPC.GetTrackPoint(h.IRow())); + { + Int_t iSlice = h.ISlice(); + AliHLTTPCCATracker &slice = fHLTTracker->Slices()[iSlice]; + if( slice.Param().Alpha()!=alpha ){ + if( ! t0.Rotate( slice.Param().Alpha() - alpha, .999 ) ) continue; + alpha = slice.Param().Alpha(); + } + Float_t x = slice.Row(h.IRow()).X(); + if( !t0.TransportToX( x, fHLTTracker->Slices()[0].Param().GetBz(t0),.999 ) ) continue; + Float_t sy2, sz2; + slice.GetErrors2( h.IRow(), t0, sy2, sz2 ); + point.SetSigmaY(c->GetSigmaY2()/sy2); + point.SetSigmaZ(c->GetSigmaZ2()/sz2); + point.SetAngleY(TMath::Abs(t0.GetSinPhi()/t0.GetCosPhi())); + point.SetAngleZ(TMath::Abs(t0.GetDzDs())); + } } - CookLabel(&tTPC,0.1); - { - Double_t xTPC=83.65; - if (tTPC.AliExternalTrackParam::PropagateTo(xTPC,5)) { - Double_t y=tTPC.GetY(); - Double_t ymax=xTPC*TMath::Tan(1.74532920122146606e-01); - if (y > ymax) { - if (tTPC.Rotate(2*1.74532920122146606e-01)) tTPC.AliExternalTrackParam::PropagateTo(xTPC,5); - } else if (y <-ymax) { - if (tTPC.Rotate(-2*1.74532920122146606e-01)) tTPC.AliExternalTrackParam::PropagateTo(xTPC,5); - } - } + tTPC.CookdEdx(0.02,0.6); + + CookLabel(&tTPC,0.1); + + if(1){ // correction like in off-line --- Adding systematic error + + const Double_t *param = AliTPCReconstructor::GetRecoParam()->GetSystematicError(); + Double_t covar[15]; + for (Int_t i=0;i<15;i++) covar[i]=0; + covar[0] = param[0]*param[0]; + covar[2] = param[1]*param[1]; + covar[5] = param[2]*param[2]; + covar[9] = param[3]*param[3]; + Double_t facC = AliTracker::GetBz()*kB2C; + covar[14]= param[4]*param[4]*facC*facC; + tTPC.AddCovariance(covar); } AliESDtrack tESD; tESD.UpdateTrackParams( &(tTPC),AliESDtrack::kTPCin); //tESD.SetStatus( AliESDtrack::kTPCrefit ); //tESD.SetTPCPoints(tTPC.GetPoints()); - //tESD.myTPC = tTPC; + Int_t ndedx = tTPC.GetNCDEDX(0); + Float_t sdedx = tTPC.GetSDEDX(0); + Float_t dedx = tTPC.GetdEdx(); + tESD.SetTPCsignal(dedx, sdedx, ndedx); + //tESD.myTPC = tTPC; + event->AddTrack(&tESD); } } + timer.Stop(); + static double time=0, time1 = 0; + static Int_t ncalls = 0; + time+=timer.CpuTime(); + time1+=timer.RealTime(); + ncalls++; + //cout<<"\n\nCA tracker speed: cpu = "<