X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=TPC%2FAliTPCtrackerMI.cxx;h=1a30123b6fa689828d8bfc1901604470d30a8b99;hp=8438c6f1443a0792ba63a195c587a8f7bc8189e8;hb=17abbffbcdd31fdd5c4d2680b01ece1c2726e8cc;hpb=60e55aee9905a1a5e66dce1cd084737911e78b04 diff --git a/TPC/AliTPCtrackerMI.cxx b/TPC/AliTPCtrackerMI.cxx index 8438c6f1443..1a30123b6fa 100644 --- a/TPC/AliTPCtrackerMI.cxx +++ b/TPC/AliTPCtrackerMI.cxx @@ -67,7 +67,7 @@ // // The tracker itself can be debugged - the information about tracks can be stored in several // phases of the reconstruction // To enable storage of the TPC tracks in the ESD friend track -// use AliTPCReconstructor::SetStreamLevel(n); where nis bigger 0 +// use AliTPCReconstructor::SetStreamLevel(n); // // The debug level - different procedure produce tree for numerical debugging // To enable them set AliTPCReconstructor::SetStreamLevel(n); where nis bigger 1 @@ -95,12 +95,14 @@ // There are several places in the code which can be numerically debuged // This code is keeped in order to enable code development and to check the calibration implementtion // -// 1. ErrParam stream (Log level 9) - dump information about +// 1. ErrParam stream - dump information about // 1.a) cluster // 2.a) cluster error estimate // 3.a) cluster shape estimate // // +// Debug streamer levels: +// //------------------------------------------------------- @@ -111,6 +113,7 @@ #include #include #include +#include #include "AliLog.h" #include "AliComplexCluster.h" #include "AliESDEvent.h" @@ -131,12 +134,11 @@ #include "AliTPCtrackerMI.h" #include "TStopwatch.h" #include "AliTPCReconstructor.h" -#include "AliPID.h" -#include "TTreeStream.h" #include "AliAlignObj.h" #include "AliTrackPointArray.h" #include "TRandom.h" #include "AliTPCcalibDB.h" +#include "AliTPCcalibDButil.h" #include "AliTPCTransform.h" #include "AliTPCClusterParam.h" @@ -196,12 +198,18 @@ AliTPCtrackerMI::AliTPCtrackerMI() fNtracks(0), fSeeds(0), fIteration(0), - fParam(0), + fkParam(0), fDebugStreamer(0) { // // default constructor // + for (Int_t irow=0; irow<200; irow++){ + fXRow[irow]=0; + fYMax[irow]=0; + fPadLength[irow]=0; + } + } //_____________________________________________________________________ @@ -222,7 +230,7 @@ Int_t AliTPCtrackerMI::UpdateTrack(AliTPCseed * track, Int_t accept){ track->SetRow((i&0x00ff0000)>>16); track->SetSector(sec); // Int_t index = i&0xFFFF; - if (sec>=fParam->GetNInnerSector()) track->SetRow(track->GetRow()+fParam->GetNRowLow()); + if (sec>=fkParam->GetNInnerSector()) track->SetRow(track->GetRow()+fkParam->GetNRowLow()); track->SetClusterIndex2(track->GetRow(), i); //track->fFirstPoint = row; //if ( track->fLastPointfLastPoint =row; @@ -289,39 +297,46 @@ Int_t AliTPCtrackerMI::AcceptCluster(AliTPCseed * seed, AliTPCclusterMI * cluste // // decide according desired precision to accept given // cluster for tracking + Double_t yt=0,zt=0; + seed->GetProlongation(cluster->GetX(),yt,zt); Double_t sy2=ErrY2(seed,cluster); Double_t sz2=ErrZ2(seed,cluster); Double_t sdistancey2 = sy2+seed->GetSigmaY2(); Double_t sdistancez2 = sz2+seed->GetSigmaZ2(); - - Double_t rdistancey2 = (seed->GetCurrentCluster()->GetY()-seed->GetY())* - (seed->GetCurrentCluster()->GetY()-seed->GetY())/sdistancey2; - Double_t rdistancez2 = (seed->GetCurrentCluster()->GetZ()-seed->GetZ())* - (seed->GetCurrentCluster()->GetZ()-seed->GetZ())/sdistancez2; + Double_t dy=seed->GetCurrentCluster()->GetY()-yt; + Double_t dz=seed->GetCurrentCluster()->GetZ()-zt; + Double_t rdistancey2 = (seed->GetCurrentCluster()->GetY()-yt)* + (seed->GetCurrentCluster()->GetY()-yt)/sdistancey2; + Double_t rdistancez2 = (seed->GetCurrentCluster()->GetZ()-zt)* + (seed->GetCurrentCluster()->GetZ()-zt)/sdistancez2; Double_t rdistance2 = rdistancey2+rdistancez2; //Int_t accept =0; - if (AliTPCReconstructor::StreamLevel()>5 && seed->GetNumberOfClusters()>20) { + if (AliTPCReconstructor::StreamLevel()>2 && seed->GetNumberOfClusters()>20) { Float_t rmsy2 = seed->GetCurrentSigmaY2(); Float_t rmsz2 = seed->GetCurrentSigmaZ2(); Float_t rmsy2p30 = seed->GetCMeanSigmaY2p30(); Float_t rmsz2p30 = seed->GetCMeanSigmaZ2p30(); Float_t rmsy2p30R = seed->GetCMeanSigmaY2p30R(); Float_t rmsz2p30R = seed->GetCMeanSigmaZ2p30R(); - - AliExternalTrackParam param(*seed); + AliExternalTrackParam param(*seed); static TVectorD gcl(3),gtr(3); Float_t gclf[3]; param.GetXYZ(gcl.GetMatrixArray()); cluster->GetGlobalXYZ(gclf); gcl[0]=gclf[0]; gcl[1]=gclf[1]; gcl[2]=gclf[2]; + - if (AliTPCReconstructor::StreamLevel()>0) { + if (AliTPCReconstructor::StreamLevel()>2) { (*fDebugStreamer)<<"ErrParam"<< "Cl.="<16) return 3; + //return 0; // temporary + if (rdistance2>32) return 3; if ((rdistancey2>9. || rdistancez2>9.) && cluster->GetType()==0) @@ -357,6 +376,7 @@ Int_t AliTPCtrackerMI::AcceptCluster(AliTPCseed * seed, AliTPCclusterMI * cluste + //_____________________________________________________________________________ AliTPCtrackerMI::AliTPCtrackerMI(const AliTPCParam *par): AliTracker(), @@ -376,7 +396,7 @@ AliTracker(), fNtracks(0), fSeeds(0), fIteration(0), - fParam(0), + fkParam(0), fDebugStreamer(0) { //--------------------------------------------------------------------- @@ -389,7 +409,7 @@ AliTracker(), for (i=0; iGetNRowLow(); Int_t nrowup = par->GetNRowUp(); @@ -430,15 +450,22 @@ AliTPCtrackerMI::AliTPCtrackerMI(const AliTPCtrackerMI &t): fNtracks(0), fSeeds(0), fIteration(0), - fParam(0), + fkParam(0), fDebugStreamer(0) { //------------------------------------ // dummy copy constructor //------------------------------------------------------------------ fOutput=t.fOutput; + for (Int_t irow=0; irow<200; irow++){ + fXRow[irow]=0; + fYMax[irow]=0; + fPadLength[irow]=0; + } + } -AliTPCtrackerMI & AliTPCtrackerMI::operator=(const AliTPCtrackerMI& /*r*/){ +AliTPCtrackerMI & AliTPCtrackerMI::operator=(const AliTPCtrackerMI& /*r*/) +{ //------------------------------ // dummy //-------------------------------------------------------------- @@ -459,12 +486,13 @@ AliTPCtrackerMI::~AliTPCtrackerMI() { } -void AliTPCtrackerMI::FillESD(TObjArray* arr) +void AliTPCtrackerMI::FillESD(const TObjArray* arr) { // // //fill esds using updated tracks - if (fEvent){ + if (!fEvent) return; + // write tracks to the event // store index of the track Int_t nseed=arr->GetEntriesFast(); @@ -479,9 +507,9 @@ void AliTPCtrackerMI::FillESD(TObjArray* arr) "Tr0.="<PropagateTo(fParam->GetInnerRadiusLow()); + // pt->PropagateTo(fkParam->GetInnerRadiusLow()); if (pt->GetKinkIndex(0)<=0){ //don't propagate daughter tracks - pt->PropagateTo(fParam->GetInnerRadiusLow()); + pt->PropagateTo(fkParam->GetInnerRadiusLow()); } if (( pt->GetPoints()[2]- pt->GetPoints()[0])>5 && pt->GetPoints()[3]>0.8){ @@ -579,22 +607,39 @@ void AliTPCtrackerMI::FillESD(TObjArray* arr) continue; } } - } - printf("Number of filled ESDs-\t%d\n",fEvent->GetNumberOfTracks()); + // >> account for suppressed tracks in the kink indices (RS) + int nESDtracks = fEvent->GetNumberOfTracks(); + for (int it=nESDtracks;it--;) { + AliESDtrack* esdTr = fEvent->GetTrack(it); + if (!esdTr || !esdTr->GetKinkIndex(0)) continue; + for (int ik=0;ik<3;ik++) { + int knkId=0; + if (!(knkId=esdTr->GetKinkIndex(ik))) break; // no more kinks for this track + AliESDkink* kink = fEvent->GetKink(TMath::Abs(knkId)-1); + if (!kink) { + AliError(Form("ESDTrack%d refers to non-existing kink %d",it,TMath::Abs(knkId)-1)); + continue; + } + kink->SetIndex(it, knkId<0 ? 0:1); // update track index of the kink: mother at 0, daughter at 1 + } + } + // << account for suppressed tracks in the kink indices (RS) + AliInfo(Form("Number of filled ESDs-\t%d\n",fEvent->GetNumberOfTracks())); + } -Double_t AliTPCtrackerMI::ErrY2(AliTPCseed* seed, AliTPCclusterMI * cl){ +Double_t AliTPCtrackerMI::ErrY2(AliTPCseed* seed, const AliTPCclusterMI * cl){ // // // Use calibrated cluster error from OCDB // AliTPCClusterParam * clparam = AliTPCcalibDB::Instance()->GetClusterParam(); // - Float_t z = TMath::Abs(fParam->GetZLength(0)-TMath::Abs(seed->GetZ())); + Float_t z = TMath::Abs(fkParam->GetZLength(0)-TMath::Abs(seed->GetZ())); Int_t ctype = cl->GetType(); Int_t type = (cl->GetRow()<63) ? 0: (cl->GetRow()>126) ? 1:2; Double_t angle = seed->GetSnp()*seed->GetSnp(); @@ -642,7 +687,7 @@ Double_t AliTPCtrackerMI::ErrY2(AliTPCseed* seed, AliTPCclusterMI * cl){ // gnoise1 = 0.0004/padlength; // Float_t nel = 0.268*amp; // Float_t nprim = 0.155*amp; -// ggg1[i] = fParam->GetDiffT()*fParam->GetDiffT()*(2+0.001*nel/(padlength*padlength))/nel; +// ggg1[i] = fkParam->GetDiffT()*fkParam->GetDiffT()*(2+0.001*nel/(padlength*padlength))/nel; // glandau1[i] = (2.+0.12*nprim)*0.5* (2.+nprim*nprim*0.001/(padlength*padlength))/nprim; // if (glandau1[i]>1) glandau1[i]=1; // glandau1[i]*=padlength*padlength/12.; @@ -652,7 +697,7 @@ Double_t AliTPCtrackerMI::ErrY2(AliTPCseed* seed, AliTPCclusterMI * cl){ // gnoise2 = 0.0004/padlength; // nel = 0.3*amp; // nprim = 0.133*amp; -// ggg2[i] = fParam->GetDiffT()*fParam->GetDiffT()*(2+0.0008*nel/(padlength*padlength))/nel; +// ggg2[i] = fkParam->GetDiffT()*fkParam->GetDiffT()*(2+0.0008*nel/(padlength*padlength))/nel; // glandau2[i] = (2.+0.12*nprim)*0.5*(2.+nprim*nprim*0.001/(padlength*padlength))/nprim; // if (glandau2[i]>1) glandau2[i]=1; // glandau2[i]*=padlength*padlength/12.; @@ -663,7 +708,7 @@ Double_t AliTPCtrackerMI::ErrY2(AliTPCseed* seed, AliTPCclusterMI * cl){ // gnoise3 = 0.0004/padlength; // nel = 0.3*amp; // nprim = 0.133*amp; -// ggg3[i] = fParam->GetDiffT()*fParam->GetDiffT()*(2+0.0008*nel/(padlength*padlength))/nel; +// ggg3[i] = fkParam->GetDiffT()*fkParam->GetDiffT()*(2+0.0008*nel/(padlength*padlength))/nel; // glandau3[i] = (2.+0.12*nprim)*0.5*(2.+nprim*nprim*0.001/(padlength*padlength))/nprim; // if (glandau3[i]>1) glandau3[i]=1; // glandau3[i]*=padlength*padlength/12.; @@ -680,7 +725,7 @@ Double_t AliTPCtrackerMI::ErrY2(AliTPCseed* seed, AliTPCclusterMI * cl){ // return 1.; // } // Float_t snoise2; -// Float_t z = TMath::Abs(fParam->GetZLength(0)-TMath::Abs(seed->GetZ())); +// Float_t z = TMath::Abs(fkParam->GetZLength(0)-TMath::Abs(seed->GetZ())); // Int_t ctype = cl->GetType(); // Float_t padlength= GetPadPitchLength(seed->GetRow()); // Double_t angle2 = seed->GetSnp()*seed->GetSnp(); @@ -737,14 +782,14 @@ Double_t AliTPCtrackerMI::ErrY2(AliTPCseed* seed, AliTPCclusterMI * cl){ -Double_t AliTPCtrackerMI::ErrZ2(AliTPCseed* seed, AliTPCclusterMI * cl){ +Double_t AliTPCtrackerMI::ErrZ2(AliTPCseed* seed, const AliTPCclusterMI * cl){ // // // Use calibrated cluster error from OCDB // AliTPCClusterParam * clparam = AliTPCcalibDB::Instance()->GetClusterParam(); // - Float_t z = TMath::Abs(fParam->GetZLength(0)-TMath::Abs(seed->GetZ())); + Float_t z = TMath::Abs(fkParam->GetZLength(0)-TMath::Abs(seed->GetZ())); Int_t ctype = cl->GetType(); Int_t type = (cl->GetRow()<63) ? 0: (cl->GetRow()>126) ? 1:2; // @@ -798,7 +843,7 @@ Double_t AliTPCtrackerMI::ErrZ2(AliTPCseed* seed, AliTPCclusterMI * cl){ // gnoise1 = 0.0004/padlength; // Float_t nel = 0.268*amp; // Float_t nprim = 0.155*amp; -// ggg1[i] = fParam->GetDiffT()*fParam->GetDiffT()*(2+0.001*nel/(padlength*padlength))/nel; +// ggg1[i] = fkParam->GetDiffT()*fkParam->GetDiffT()*(2+0.001*nel/(padlength*padlength))/nel; // glandau1[i] = (2.+0.12*nprim)*0.5* (2.+nprim*nprim*0.001/(padlength*padlength))/nprim; // if (glandau1[i]>1) glandau1[i]=1; // glandau1[i]*=padlength*padlength/12.; @@ -808,7 +853,7 @@ Double_t AliTPCtrackerMI::ErrZ2(AliTPCseed* seed, AliTPCclusterMI * cl){ // gnoise2 = 0.0004/padlength; // nel = 0.3*amp; // nprim = 0.133*amp; -// ggg2[i] = fParam->GetDiffT()*fParam->GetDiffT()*(2+0.0008*nel/(padlength*padlength))/nel; +// ggg2[i] = fkParam->GetDiffT()*fkParam->GetDiffT()*(2+0.0008*nel/(padlength*padlength))/nel; // glandau2[i] = (2.+0.12*nprim)*0.5*(2.+nprim*nprim*0.001/(padlength*padlength))/nprim; // if (glandau2[i]>1) glandau2[i]=1; // glandau2[i]*=padlength*padlength/12.; @@ -819,7 +864,7 @@ Double_t AliTPCtrackerMI::ErrZ2(AliTPCseed* seed, AliTPCclusterMI * cl){ // gnoise3 = 0.0004/padlength; // nel = 0.3*amp; // nprim = 0.133*amp; -// ggg3[i] = fParam->GetDiffT()*fParam->GetDiffT()*(2+0.0008*nel/(padlength*padlength))/nel; +// ggg3[i] = fkParam->GetDiffT()*fkParam->GetDiffT()*(2+0.0008*nel/(padlength*padlength))/nel; // glandau3[i] = (2.+0.12*nprim)*0.5*(2.+nprim*nprim*0.001/(padlength*padlength))/nprim; // if (glandau3[i]>1) glandau3[i]=1; // glandau3[i]*=padlength*padlength/12.; @@ -836,7 +881,7 @@ Double_t AliTPCtrackerMI::ErrZ2(AliTPCseed* seed, AliTPCclusterMI * cl){ // return 1.; // } // Float_t snoise2; -// Float_t z = TMath::Abs(fParam->GetZLength(0)-TMath::Abs(seed->GetZ())); +// Float_t z = TMath::Abs(fkParam->GetZLength(0)-TMath::Abs(seed->GetZ())); // Int_t ctype = cl->GetType(); // Float_t padlength= GetPadPitchLength(seed->GetRow()); // // @@ -922,7 +967,7 @@ void AliTPCtrackerMI::RotateToLocal(AliTPCseed *seed) //_____________________________________________________________________________ Double_t AliTPCtrackerMI::F1old(Double_t x1,Double_t y1, Double_t x2,Double_t y2, - Double_t x3,Double_t y3) + Double_t x3,Double_t y3) const { //----------------------------------------------------------------- // Initial approximation of the track curvature @@ -943,7 +988,7 @@ Double_t AliTPCtrackerMI::F1old(Double_t x1,Double_t y1, //_____________________________________________________________________________ Double_t AliTPCtrackerMI::F1(Double_t x1,Double_t y1, Double_t x2,Double_t y2, - Double_t x3,Double_t y3) + Double_t x3,Double_t y3) const { //----------------------------------------------------------------- // Initial approximation of the track curvature @@ -954,7 +999,7 @@ Double_t AliTPCtrackerMI::F1(Double_t x1,Double_t y1, y2 -=y1; // Double_t det = x3*y2-x2*y3; - if (det==0) { + if (TMath::Abs(det)<1e-10){ return 100; } // @@ -969,7 +1014,7 @@ Double_t AliTPCtrackerMI::F1(Double_t x1,Double_t y1, Double_t AliTPCtrackerMI::F2(Double_t x1,Double_t y1, Double_t x2,Double_t y2, - Double_t x3,Double_t y3) + Double_t x3,Double_t y3) const { //----------------------------------------------------------------- // Initial approximation of the track curvature @@ -980,7 +1025,7 @@ Double_t AliTPCtrackerMI::F2(Double_t x1,Double_t y1, y2 -=y1; // Double_t det = x3*y2-x2*y3; - if (det==0) { + if (TMath::Abs(det)<1e-10) { return 100; } // @@ -999,7 +1044,7 @@ Double_t AliTPCtrackerMI::F2(Double_t x1,Double_t y1, //_____________________________________________________________________________ Double_t AliTPCtrackerMI::F2old(Double_t x1,Double_t y1, Double_t x2,Double_t y2, - Double_t x3,Double_t y3) + Double_t x3,Double_t y3) const { //----------------------------------------------------------------- // Initial approximation of the track curvature times center of curvature @@ -1018,7 +1063,7 @@ Double_t AliTPCtrackerMI::F2old(Double_t x1,Double_t y1, //_____________________________________________________________________________ Double_t AliTPCtrackerMI::F3(Double_t x1,Double_t y1, Double_t x2,Double_t y2, - Double_t z1,Double_t z2) + Double_t z1,Double_t z2) const { //----------------------------------------------------------------- // Initial approximation of the tangent of the track dip angle @@ -1029,7 +1074,7 @@ Double_t AliTPCtrackerMI::F3(Double_t x1,Double_t y1, Double_t AliTPCtrackerMI::F3n(Double_t x1,Double_t y1, Double_t x2,Double_t y2, - Double_t z1,Double_t z2, Double_t c) + Double_t z1,Double_t z2, Double_t c) const { //----------------------------------------------------------------- // Initial approximation of the tangent of the track dip angle @@ -1049,7 +1094,7 @@ Double_t AliTPCtrackerMI::F3n(Double_t x1,Double_t y1, return angle2; } -Bool_t AliTPCtrackerMI::GetProlongation(Double_t x1, Double_t x2, Double_t x[5], Double_t &y, Double_t &z) +Bool_t AliTPCtrackerMI::GetProlongation(Double_t x1, Double_t x2, Double_t x[5], Double_t &y, Double_t &z) const {//----------------------------------------------------------------- // This function find proloncation of a track to a reference plane x=x2. //----------------------------------------------------------------- @@ -1060,8 +1105,8 @@ Bool_t AliTPCtrackerMI::GetProlongation(Double_t x1, Double_t x2, Double_t x[5 return kFALSE; } - Double_t c1=x[4]*x1 - x[2], r1=sqrt((1.-c1)*(1.+c1)); - Double_t c2=x[4]*x2 - x[2], r2=sqrt((1.-c2)*(1.+c2)); + Double_t c1=x[4]*x1 - x[2], r1=TMath::Sqrt((1.-c1)*(1.+c1)); + Double_t c2=x[4]*x2 - x[2], r2=TMath::Sqrt((1.-c2)*(1.+c2)); y = x[0]; z = x[1]; @@ -1084,7 +1129,7 @@ Bool_t AliTPCtrackerMI::GetProlongation(Double_t x1, Double_t x2, Double_t x[5 return kTRUE; } -Int_t AliTPCtrackerMI::LoadClusters (TTree *tree) +Int_t AliTPCtrackerMI::LoadClusters (TTree *const tree) { // // @@ -1093,11 +1138,11 @@ Int_t AliTPCtrackerMI::LoadClusters (TTree *tree) } -Int_t AliTPCtrackerMI::LoadClusters(TObjArray *arr) +Int_t AliTPCtrackerMI::LoadClusters(const TObjArray *arr) { // // load clusters to the memory - AliTPCClustersRow *clrow = 0x0; + AliTPCClustersRow *clrow = new AliTPCClustersRow("AliTPCclusterMI"); Int_t lower = arr->LowerBound(); Int_t entries = arr->GetEntriesFast(); @@ -1108,7 +1153,7 @@ Int_t AliTPCtrackerMI::LoadClusters(TObjArray *arr) // Int_t sec,row; - fParam->AdjustSectorRow(clrow->GetID(),sec,row); + fkParam->AdjustSectorRow(clrow->GetID(),sec,row); for (Int_t icl=0; iclGetArray()->GetEntriesFast(); icl++){ Transform((AliTPCclusterMI*)(clrow->GetArray()->At(icl))); @@ -1137,6 +1182,7 @@ Int_t AliTPCtrackerMI::LoadClusters(TObjArray *arr) for (Int_t j=0;jGetN2();++j) tpcrow->SetCluster2(j,*(AliTPCclusterMI*)(clrow->GetArray()->At(j))); } + clrow->GetArray()->Clear("C"); } // delete clrow; @@ -1145,7 +1191,7 @@ Int_t AliTPCtrackerMI::LoadClusters(TObjArray *arr) return 0; } -Int_t AliTPCtrackerMI::LoadClusters(TClonesArray *arr) +Int_t AliTPCtrackerMI::LoadClusters(const TClonesArray *arr) { // // load clusters to the memory from one @@ -1186,11 +1232,11 @@ Int_t AliTPCtrackerMI::LoadClusters(TClonesArray *arr) Int_t left=0; if (secSetClass("AliTPCclusterMI"); - clrow->SetArray(0); - clrow->GetArray()->ExpandCreateFast(10000); + AliTPCClustersRow *clrow= new AliTPCClustersRow("AliTPCclusterMI"); // // TTree * tree = fClustersArray.GetTree(); @@ -1223,7 +1266,7 @@ Int_t AliTPCtrackerMI::LoadClusters() br->GetEntry(i); // Int_t sec,row; - fParam->AdjustSectorRow(clrow->GetID(),sec,row); + fkParam->AdjustSectorRow(clrow->GetID(),sec,row); for (Int_t icl=0; iclGetArray()->GetEntriesFast(); icl++){ Transform((AliTPCclusterMI*)(clrow->GetArray()->At(icl))); } @@ -1319,10 +1362,13 @@ void AliTPCtrackerMI::Transform(AliTPCclusterMI * cluster){ // // // - AliTPCTransform *transform = AliTPCcalibDB::Instance()->GetTransform() ; + AliTPCcalibDB * calibDB = AliTPCcalibDB::Instance(); + AliTPCTransform *transform = calibDB->GetTransform() ; if (!transform) { AliFatal("Tranformations not in calibDB"); + return; } + transform->SetCurrentRecoParam((AliTPCRecoParam*)AliTPCReconstructor::GetRecoParam()); Double_t x[3]={cluster->GetRow(),cluster->GetPad(),cluster->GetTimeBin()}; Int_t i[1]={cluster->GetDetector()}; transform->Transform(x,i,0,1); @@ -1333,7 +1379,7 @@ void AliTPCtrackerMI::Transform(AliTPCclusterMI * cluster){ // // in debug mode check the transformation // - if (AliTPCReconstructor::StreamLevel()>1) { + if (AliTPCReconstructor::StreamLevel()>2) { Float_t gx[3]; cluster->GetGlobalXYZ(gx); Int_t event = (fEvent==NULL)? 0: fEvent->GetEventNumberInFile(); @@ -1353,22 +1399,23 @@ void AliTPCtrackerMI::Transform(AliTPCclusterMI * cluster){ cluster->SetY(x[1]); cluster->SetZ(x[2]); // The old stuff: - // // // - //if (!fParam->IsGeoRead()) fParam->ReadGeoMatrices(); - TGeoHMatrix *mat = fParam->GetClusterMatrix(cluster->GetDetector()); - //TGeoHMatrix mat; - 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); - else{ - // chack Loading of Geo matrices from GeoManager - TEMPORARY FIX - } - cluster->SetX(posC[0]); - cluster->SetY(posC[1]); - cluster->SetZ(posC[2]); + //if (!fkParam->IsGeoRead()) fkParam->ReadGeoMatrices(); + if (AliTPCReconstructor::GetRecoParam()->GetUseSectorAlignment() && (!calibDB->HasAlignmentOCDB())){ + TGeoHMatrix *mat = fkParam->GetClusterMatrix(cluster->GetDetector()); + //TGeoHMatrix mat; + 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); + else{ + // chack Loading of Geo matrices from GeoManager - TEMPORARY FIX + } + cluster->SetX(posC[0]); + cluster->SetY(posC[1]); + cluster->SetZ(posC[2]); + } } //_____________________________________________________________________________ @@ -1636,7 +1683,7 @@ Int_t AliTPCtrackerMI::FollowToNext(AliTPCseed& t, Int_t nr) { else { if (IsFindable(t)) - // if (TMath::Abs(z)<(AliTPCReconstructor::GetCtgRange()*x+10) && TMath::Abs(z)GetZLength(0) && (TMath::Abs(t.GetSnp())GetZLength(0) && (TMath::Abs(t.GetSnp())>24; // Int_t row = (index&0x00ff0000)>>16; Float_t xyz[3]; - // xyz[0] = fParam->GetPadRowRadii(sector,row); + // xyz[0] = fkParam->GetPadRowRadii(sector,row); xyz[0] = cl->GetX(); xyz[1] = cl->GetY(); xyz[2] = cl->GetZ(); Float_t sin,cos; - fParam->AdjustCosSin(sector,cos,sin); + fkParam->AdjustCosSin(sector,cos,sin); Float_t x = cos*xyz[0]-sin*xyz[1]; Float_t y = cos*xyz[1]+sin*xyz[0]; Float_t cov[6]; Float_t sigmaY2 = 0.027*cl->GetSigmaY2(); - if (sector < fParam->GetNInnerSector()) sigmaY2 *= 2.07; + if (sector < fkParam->GetNInnerSector()) sigmaY2 *= 2.07; Float_t sigmaZ2 = 0.066*cl->GetSigmaZ2(); - if (sector < fParam->GetNInnerSector()) sigmaZ2 *= 1.77; + if (sector < fkParam->GetNInnerSector()) sigmaZ2 *= 1.77; cov[0] = sin*sin*sigmaY2; cov[1] = -sin*cos*sigmaY2; cov[2] = 0.; @@ -1713,13 +1760,13 @@ Bool_t AliTPCtrackerMI::GetTrackPoint(Int_t index, AliTrackPoint &p ) const p.SetXYZ(x,y,xyz[2],cov); AliGeomManager::ELayerID iLayer; Int_t idet; - if (sector < fParam->GetNInnerSector()) { + if (sector < fkParam->GetNInnerSector()) { iLayer = AliGeomManager::kTPC1; idet = sector; } else { iLayer = AliGeomManager::kTPC2; - idet = sector - fParam->GetNInnerSector(); + idet = sector - fkParam->GetNInnerSector(); } UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,idet); p.SetVolumeID(volid); @@ -2119,7 +2166,7 @@ void AliTPCtrackerMI::SignShared(TObjArray * arr) for (Int_t i=0; iUncheckedAt(i); if (!pt) continue; - for (Int_t j=0;j<=12;j++){ + for (Int_t j=0;j<12;j++){ pt->SetOverlapLabel(j,0); } } @@ -2210,13 +2257,8 @@ void AliTPCtrackerMI::RemoveUsed2(TObjArray * arr, Float_t factor1, Float_t fac if (!pt) continue; // if (quality[trackindex]<0){ - if (pt) { delete arr->RemoveAt(trackindex); - } - else{ - arr->RemoveAt(trackindex); - } - continue; + continue; } // // @@ -2236,7 +2278,7 @@ void AliTPCtrackerMI::RemoveUsed2(TObjArray * arr, Float_t factor1, Float_t fac // if (Float_t(shared+1)/Float_t(found+1)>factor){ if (pt->GetKinkIndexes()[0]!=0) continue; //don't remove tracks - part of the kinks - if( AliTPCReconstructor::StreamLevel()>15){ + if( AliTPCReconstructor::StreamLevel()>3){ TTreeSRedirector &cstream = *fDebugStreamer; cstream<<"RemoveUsed"<< "iter="<GetNumberOfClusters()<50&&(found-0.5*shared)GetKinkIndexes()[0]!=0) continue; //don't remove tracks - part of the kinks - if( AliTPCReconstructor::StreamLevel()>15){ + if( AliTPCReconstructor::StreamLevel()>3){ TTreeSRedirector &cstream = *fDebugStreamer; cstream<<"RemoveShort"<< "iter="<GetEntries(); + for (Int_t i=0; iUncheckedAt(i); + if (!pt) { + continue; + } + Bool_t isKink=pt->GetKinkIndex(0)!=0; + for (Int_t j=0; j<160; ++j) { + Int_t index=pt->GetClusterIndex2(j); + if (index<0) continue; + AliTPCclusterMI *c= pt->GetClusterPointer(j); + if (!c) continue; + if (isKink) c->Use(100); // kink + c->Use(10); // by default usage 10 + } + } + // + + for (Int_t sec=0;secGetNRows();row++){ + AliTPCclusterMI *cl = fInnerSec[sec][row].GetClusters1(); + for (Int_t icl =0;icl< fInnerSec[sec][row].GetN1();icl++){ + Float_t gx[3]; cl[icl].GetGlobalXYZ(gx); + (*fDebugStreamer)<<"clDump"<< + "iter="<GetNRows();row++){ + AliTPCclusterMI *cl = fOuterSec[sec][row].GetClusters1(); + for (Int_t icl =0;icl< fOuterSec[sec][row].GetN1();icl++){ + Float_t gx[3]; cl[icl].GetGlobalXYZ(gx); + (*fDebugStreamer)<<"clDump"<< + "iter="<GetTimeGainSplinesRun(event->GetRunNumber()); + + AliTPCTransform *transform = AliTPCcalibDB::Instance()->GetTransform() ; + if (!transform) { + AliFatal("Tranformations not in RefitInward"); + return 0; + } + transform->SetCurrentRecoParam((AliTPCRecoParam*)AliTPCReconstructor::GetRecoParam()); + const AliTPCRecoParam * recoParam = AliTPCcalibDB::Instance()->GetTransform()->GetCurrentRecoParam(); + + TGraphErrors * graphMultDependenceDeDx = 0x0; + if (recoParam && recoParam->GetUseMultiplicityCorrectionDedx() && gainCalibArray) { + if (recoParam->GetUseTotCharge()) { + graphMultDependenceDeDx = (TGraphErrors *) gainCalibArray->FindObject("TGRAPHERRORS_MEANQTOT_MULTIPLICITYDEPENDENCE_BEAM_ALL"); + } else { + graphMultDependenceDeDx = (TGraphErrors *) gainCalibArray->FindObject("TGRAPHERRORS_MEANQMAX_MULTIPLICITYDEPENDENCE_BEAM_ALL"); + } + } + // ReadSeeds(event,2); fIteration=2; //PrepareForProlongation(fSeeds,1); @@ -2560,7 +2705,7 @@ Int_t AliTPCtrackerMI::RefitInward(AliESDEvent *event) SignShared(&arraySeed); // FindCurling(fSeeds, event,2); // find multi found tracks FindSplitted(fSeeds, event,2); // find multi found tracks - if (AliTPCReconstructor::StreamLevel()>2) FindMultiMC(fSeeds, fEvent,2); // find multi found tracks + if (AliTPCReconstructor::StreamLevel()>5) FindMultiMC(fSeeds, fEvent,2); // find multi found tracks Int_t ntracks=0; Int_t nseed = fSeeds->GetEntriesFast(); @@ -2574,7 +2719,7 @@ Int_t AliTPCtrackerMI::RefitInward(AliESDEvent *event) AliExternalTrackParam paramIn; AliExternalTrackParam paramOut; Int_t ncl = seed->RefitTrack(seed,¶mIn,¶mOut); - if (AliTPCReconstructor::StreamLevel()>0) { + if (AliTPCReconstructor::StreamLevel()>2) { (*fDebugStreamer)<<"RecoverIn"<< "seed.="<2) FindMultiMC(fSeeds, fEvent,1); // find multi found tracks + if (AliTPCReconstructor::StreamLevel()>5) FindMultiMC(fSeeds, fEvent,1); // find multi found tracks // Int_t nseed = fSeeds->GetEntriesFast(); @@ -2663,7 +2815,7 @@ Int_t AliTPCtrackerMI::PropagateBack(AliESDEvent *event) AliExternalTrackParam paramIn; AliExternalTrackParam paramOut; Int_t ncl = seed->RefitTrack(seed,¶mIn,¶mOut); - if (AliTPCReconstructor::StreamLevel()>0) { + if (AliTPCReconstructor::StreamLevel()>2) { (*fDebugStreamer)<<"RecoverBack"<< "seed.="<GetAlpha(), shift=fSectors->GetAlphaShift(); Double_t cs=cos(alpha), sn=sin(alpha); - // + // + // Double_t x1 =fOuterSec->GetX(i1); + //Double_t xx2=fOuterSec->GetX(i2); + Double_t x1 =GetXrow(i1); Double_t xx2=GetXrow(i2); @@ -3052,78 +3209,82 @@ void AliTPCtrackerMI::MakeSeeds3(TObjArray * arr, Int_t sec, Int_t i1, Int_t i2, c[13]=f30*sy1*f40+f32*sy2*f42; c[14]=f40*sy1*f40+f42*sy2*f42+f43*sy3*f43; + // if (!BuildSeed(kr1[is],kcl,0,x1,x2,x3,x,c)) continue; UInt_t index=kr1.GetIndex(is); - AliTPCseed track(x1, ns*alpha+shift, x, c, index); + seed->~AliTPCseed(); // this does not set the pointer to 0... + AliTPCseed *track=new(seed) AliTPCseed(x1, ns*alpha+shift, x, c, index); - track.SetIsSeeding(kTRUE); - track.SetSeed1(i1); - track.SetSeed2(i2); - track.SetSeedType(3); + track->SetIsSeeding(kTRUE); + track->SetSeed1(i1); + track->SetSeed2(i2); + track->SetSeedType(3); //if (dsec==0) { - FollowProlongation(track, (i1+i2)/2,1); + FollowProlongation(*track, (i1+i2)/2,1); Int_t foundable,found,shared; - track.GetClusterStatistic((i1+i2)/2,i1, found, foundable, shared, kTRUE); - if ((found<0.55*foundable) || shared>0.5*found || (track.GetSigmaY2()+track.GetSigmaZ2())>0.5){ + track->GetClusterStatistic((i1+i2)/2,i1, found, foundable, shared, kTRUE); + if ((found<0.55*foundable) || shared>0.5*found || (track->GetSigmaY2()+track->GetSigmaZ2())>0.5){ + seed->Reset(); + seed->~AliTPCseed(); continue; } //} nin++; - FollowProlongation(track, i2,1); + FollowProlongation(*track, i2,1); //Int_t rc = 1; - track.SetBConstrain(1); + track->SetBConstrain(1); // track->fLastPoint = i1+fInnerSec->GetNRows(); // first cluster in track position - track.SetLastPoint(i1); // first cluster in track position - track.SetFirstPoint(track.GetLastPoint()); + track->SetLastPoint(i1); // first cluster in track position + track->SetFirstPoint(track->GetLastPoint()); - if (track.GetNumberOfClusters()<(i1-i2)*0.5 || - track.GetNumberOfClusters() < track.GetNFoundable()*0.6 || - track.GetNShared()>0.4*track.GetNumberOfClusters() ) { + if (track->GetNumberOfClusters()<(i1-i2)*0.5 || + track->GetNumberOfClusters() < track->GetNFoundable()*0.6 || + track->GetNShared()>0.4*track->GetNumberOfClusters() ) { + seed->Reset(); + seed->~AliTPCseed(); continue; } nout1++; // Z VERTEX CONDITION Double_t zv, bz=GetBz(); - if ( !track.GetZAt(0.,bz,zv) ) continue; + if ( !track->GetZAt(0.,bz,zv) ) continue; if (TMath::Abs(zv-z3)>cuts[2]) { - FollowProlongation(track, TMath::Max(i2-20,0)); - if ( track.GetZAt(0.,bz,zv) ) continue; + FollowProlongation(*track, TMath::Max(i2-20,0)); + if ( !track->GetZAt(0.,bz,zv) ) continue; if (TMath::Abs(zv-z3)>cuts[2]){ - // If track do not point to the primary vertex, but sufficientlu long - //try to refit it without constrain - // - // - FollowProlongation(track, TMath::Max(i2-40,0)); - if ( !track.GetZAt(0.,bz,zv) ) continue; - if (TMath::Abs(zv-z3)>cuts[2] &&(track.GetNumberOfClusters() > track.GetNFoundable()*0.7)){ + FollowProlongation(*track, TMath::Max(i2-40,0)); + if ( !track->GetZAt(0.,bz,zv) ) continue; + if (TMath::Abs(zv-z3)>cuts[2] &&(track->GetNumberOfClusters() > track->GetNFoundable()*0.7)){ // make seed without constrain - AliTPCseed * track2 = MakeSeed(&track,0.2,0.5,1.); + AliTPCseed * track2 = MakeSeed(track,0.2,0.5,1.); FollowProlongation(*track2, i2,1); track2->SetBConstrain(kFALSE); track2->SetSeedType(1); - arr->AddLast(track2->Clone()); + arr->AddLast(track2); + seed->Reset(); + seed->~AliTPCseed(); continue; } else{ - //seed->Reset(); - //seed->~AliTPCseed(); + seed->Reset(); + seed->~AliTPCseed(); continue; - + } } } - track.SetSeedType(0); - arr->AddLast(track.Clone()); - //seed = new AliTPCseed; + track->SetSeedType(0); + arr->AddLast(track); + seed = new AliTPCseed; nout2++; // don't consider other combinations - if (track.GetNumberOfClusters() > track.GetNFoundable()*0.8) + if (track->GetNumberOfClusters() > track->GetNFoundable()*0.8) break; } } @@ -3131,7 +3292,7 @@ void AliTPCtrackerMI::MakeSeeds3(TObjArray * arr, Int_t sec, Int_t i1, Int_t i2, if (fDebug>3){ Info("MakeSeeds3","\nSeeding statistic:\t%d\t%d\t%d\t%d\t%d\t%d",nin0,nin1,nin2,nin,nout1,nout2); } - // delete seed; + delete seed; } @@ -3388,7 +3549,7 @@ void AliTPCtrackerMI::MakeSeeds5(TObjArray * arr, Int_t sec, Int_t i1, Int_t i2, } if (fDebug>3){ - Info("MakeSeeds5","\nSeeding statiistic:\t%d\t%d\t%d\t%d\t%d\t%d",nin0,nin1,nin2,nin,nout1,nout2,nout3); + Info("MakeSeeds5","\nSeeding statiistic:\t%d\t%d\t%d\t%d\t%d\t%d\t%d",nin0,nin1,nin2,nin,nout1,nout2,nout3); } delete seed; } @@ -3652,7 +3813,7 @@ void AliTPCtrackerMI::MakeSeeds2(TObjArray * arr, Int_t sec, Int_t i1, Int_t i2, } -AliTPCseed *AliTPCtrackerMI::MakeSeed(AliTPCseed *track, Float_t r0, Float_t r1, Float_t r2) +AliTPCseed *AliTPCtrackerMI::MakeSeed(AliTPCseed *const track, Float_t r0, Float_t r1, Float_t r2) { // // @@ -3784,7 +3945,7 @@ AliTPCseed *AliTPCtrackerMI::MakeSeed(AliTPCseed *track, Float_t r0, Float_t r1, } -AliTPCseed *AliTPCtrackerMI::ReSeed(AliTPCseed *track, Float_t r0, Float_t r1, Float_t r2) +AliTPCseed *AliTPCtrackerMI::ReSeed(const AliTPCseed *track, Float_t r0, Float_t r1, Float_t r2) { // // @@ -3802,8 +3963,8 @@ AliTPCseed *AliTPCtrackerMI::ReSeed(AliTPCseed *track, Float_t r0, Float_t r1, F ipos[2] = TMath::Min(int(r2*nclusters),nclusters-1); // last point // // - Double_t xyz[3][3]; - Int_t row[3],sec[3]={0,0,0}; + Double_t xyz[3][3]={{0}}; + Int_t row[3]={0},sec[3]={0,0,0}; // // find track row position at given ratio of the length Int_t index=-1; @@ -4051,7 +4212,7 @@ AliTPCseed *AliTPCtrackerMI::ReSeed(AliTPCseed *track,Int_t r0, Bool_t forward) -void AliTPCtrackerMI::FindMultiMC(TObjArray * array, AliESDEvent */*esd*/, Int_t iter) +void AliTPCtrackerMI::FindMultiMC(const TObjArray * array, AliESDEvent */*esd*/, Int_t iter) { // // find multi tracks - THIS FUNCTION IS ONLY FOR DEBUG PURPOSES @@ -4180,7 +4341,7 @@ void AliTPCtrackerMI::FindMultiMC(TObjArray * array, AliESDEvent */*esd*/, Int_ } } // - if (AliTPCReconstructor::StreamLevel()>0) { + if (AliTPCReconstructor::StreamLevel()>5) { TTreeSRedirector &cstream = *fDebugStreamer; cstream<<"Multi"<< "iter="<1) { AliInfo("Time for curling tracks removal DEBUGGING MC"); timer.Print(); @@ -4229,44 +4392,38 @@ void AliTPCtrackerMI::FindMultiMC(TObjArray * array, AliESDEvent */*esd*/, Int_ } -void AliTPCtrackerMI::FindSplitted(TObjArray * array, AliESDEvent */*esd*/, Int_t iter) -{ - // - // - // Two reasons to have multiple find tracks - // 1. Curling tracks can be find more than once - // 2. Splitted tracks - // a.) Multiple seeding to increase tracking efficiency - (~ 100% reached) - // b.) Edge effect on the sector boundaries - // - // This function tries to find tracks closed in the parametric space - // - // cut logic if distance is bigger than cut continue - Do Nothing - const Float_t kMaxdTheta = 0.05; // maximal distance in theta - const Float_t kMaxdPhi = 0.05; // maximal deistance in phi - const Float_t kdelta = 40.; //delta r to calculate track distance - // - // const Float_t kMaxDist0 = 1.; // maximal distance 0 - //const Float_t kMaxDist1 = 0.3; // maximal distance 1 - cut if track in separate rows - // - /* - TCut csec("csec","abs(Tr0.fRelativeSector-Tr1.fRelativeSector)<2"); - TCut cdtheta("cdtheta","abs(dtheta)<0.05"); - */ - // + +void AliTPCtrackerMI::FindSplitted(TObjArray * array, AliESDEvent */*esd*/, Int_t /*iter*/){ // + // Find Splitted tracks and remove the one with worst quality + // Corresponding debug streamer to tune selections - "Splitted2" + // Algorithm: + // 0. Sort tracks according quility + // 1. Propagate the tracks to the reference radius + // 2. Double_t loop to select close tracks (only to speed up process) + // 3. Calculate cluster overlap ratio - and remove the track if bigger than a threshold + // 4. Delete temporary parameters + // + const Double_t xref=GetXrow(63); // reference radius -IROC/OROC boundary + // rough cuts + const Double_t kCutP1=10; // delta Z cut 10 cm + const Double_t kCutP2=0.15; // delta snp(fi) cut 0.15 + const Double_t kCutP3=0.15; // delta tgl(theta) cut 0.15 + const Double_t kCutAlpha=0.15; // delta alpha cut + Int_t firstpoint = 0; + Int_t lastpoint = 160; // Int_t nentries = array->GetEntriesFast(); - AliHelix *helixes = new AliHelix[nentries]; - Float_t *xm = new Float_t[nentries]; + AliExternalTrackParam *params = new AliExternalTrackParam[nentries]; // // TStopwatch timer; timer.Start(); // - //Sort tracks according quality - // + //0. Sort tracks according quality + //1. Propagate the ext. param to reference radius Int_t nseed = array->GetEntriesFast(); + if (nseed<=0) return; Float_t * quality = new Float_t[nseed]; Int_t * indexes = new Int_t[nseed]; for (Int_t i=0; iGetNumberOfClusters(); //prefer high momenta tracks if overlaps - quality[i] *= TMath::Sqrt(TMath::Abs(pt->Pt())+0.5); + quality[i] *= TMath::Sqrt(TMath::Abs(pt->Pt())+0.5); + params[i]=(*pt); + AliTracker::PropagateTrackToBxByBz(&(params[i]),xref,pt->GetMass(),5.,kTRUE); + AliTracker::PropagateTrackToBxByBz(&(params[i]),xref,pt->GetMass(),1.,kTRUE); } TMath::Sort(nseed,quality,indexes); - - - // - // Find track COG in x direction - point with best defined parameters - // - for (Int_t i=0;iAt(i); - if (!track) continue; - track->SetCircular(0); - new (&helixes[i]) AliHelix(*track); - Int_t ncl=0; - xm[i]=0; - for (Int_t icl=0; icl<160; icl++){ - AliTPCclusterMI * cl = track->GetClusterPointer(icl); - if (cl) { - xm[i]+=cl->GetX(); - ncl++; - } - } - if (ncl>0) xm[i]/=Float_t(ncl); - } // - for (Int_t is0=0;is0At(i0); - if (!track0) continue; - if (track0->GetKinkIndexes()[0]!=0) continue; - Float_t xc0 = helixes[i0].GetHelix(6); - Float_t yc0 = helixes[i0].GetHelix(7); - Float_t fi0 = TMath::ATan2(yc0,xc0); - - for (Int_t is1=is0+1;is1At(i1); - if (!track1) continue; + // 3. Loop over pair of tracks + // + for (Int_t i0=0; i0UncheckedAt(index0))) continue; + AliTPCseed *s1 = (AliTPCseed*)array->UncheckedAt(index0); + if (!s1->IsActive()) continue; + AliExternalTrackParam &par0=params[index0]; + for (Int_t i1=i0+1; i1UncheckedAt(index1))) continue; + AliTPCseed *s2 = (AliTPCseed*)array->UncheckedAt(index1); + if (!s2->IsActive()) continue; + if (s2->GetKinkIndexes()[0]!=0) + if (s2->GetKinkIndexes()[0] == -s1->GetKinkIndexes()[0]) continue; + AliExternalTrackParam &par1=params[index1]; + if (TMath::Abs(par0.GetParameter()[3]-par1.GetParameter()[3])>kCutP3) continue; + if (TMath::Abs(par0.GetParameter()[1]-par1.GetParameter()[1])>kCutP1) continue; + if (TMath::Abs(par0.GetParameter()[2]-par1.GetParameter()[2])>kCutP2) continue; + Double_t dAlpha= TMath::Abs(par0.GetAlpha()-par1.GetAlpha()); + if (dAlpha>TMath::Pi()) dAlpha-=TMath::Pi(); + if (TMath::Abs(dAlpha)>kCutAlpha) continue; // - if (TMath::Abs(track0->GetRelativeSector()-track1->GetRelativeSector())>1) continue; - if (track1->GetKinkIndexes()[0]>0 &&track0->GetKinkIndexes()[0]<0) continue; - if (track1->GetKinkIndexes()[0]!=0) continue; - - Float_t dtheta = TMath::Abs(track0->GetTgl()-track1->GetTgl())GetTgl()+track1->GetTgl())? track0->GetTgl()-track1->GetTgl():track0->GetTgl()+track1->GetTgl(); - if (TMath::Abs(dtheta)>kMaxdTheta) continue; - // - Float_t xc1 = helixes[i1].GetHelix(6); - Float_t yc1 = helixes[i1].GetHelix(7); - Float_t fi1 = TMath::ATan2(yc1,xc1); + Int_t sumShared=0; + Int_t nall0=0; + Int_t nall1=0; + Int_t firstShared=lastpoint, lastShared=firstpoint; + Int_t firstRow=lastpoint, lastRow=firstpoint; // - Float_t dfi = fi0-fi1; - if (dfi>1.5*TMath::Pi()) dfi-=TMath::Pi(); // take care about edge effect - if (dfi<-1.5*TMath::Pi()) dfi+=TMath::Pi(); // - if (TMath::Abs(dfi)>kMaxdPhi&&helixes[i0].GetHelix(4)*helixes[i1].GetHelix(4)<0){ - // - // if short tracks with undefined sign - fi1 = -TMath::ATan2(yc1,-xc1); - dfi = fi0-fi1; + for (Int_t i=firstpoint;iGetClusterIndex2(i)>0) nall0++; + if (s2->GetClusterIndex2(i)>0) nall1++; + if (s1->GetClusterIndex2(i)>0 && s2->GetClusterIndex2(i)>0) { + if (ilastRow) lastRow=i; + } + if ( (s1->GetClusterIndex2(i))==(s2->GetClusterIndex2(i)) && s1->GetClusterIndex2(i)>0) { + if (ilastShared) lastShared=i; + sumShared++; + } + } + Double_t ratio0 = Float_t(sumShared)/Float_t(TMath::Min(nall0+1,nall1+1)); + Double_t ratio1 = Float_t(sumShared)/Float_t(TMath::Max(nall0+1,nall1+1)); + + if( AliTPCReconstructor::StreamLevel()>1){ + TTreeSRedirector &cstream = *fDebugStreamer; + Int_t n0=s1->GetNumberOfClusters(); + Int_t n1=s2->GetNumberOfClusters(); + Int_t n0F=s1->GetNFoundable(); + Int_t n1F=s2->GetNFoundable(); + Int_t lab0=s1->GetLabel(); + Int_t lab1=s2->GetLabel(); + + cstream<<"Splitted2"<< + "iter="<kMaxdPhi) continue; - // - // - Float_t sum =0; - Float_t sums=0; - Float_t sum0=0; - Float_t sum1=0; - for (Int_t icl=0; icl<160; icl++){ - Int_t index0=track0->GetClusterIndex2(icl); - Int_t index1=track1->GetClusterIndex2(icl); - Bool_t used0 = (index0>0 && !(index0&0x8000)); - Bool_t used1 = (index1>0 && !(index1&0x8000)); - // - if (used0) sum0++; // used cluster0 - if (used1) sum1++; // used clusters1 - if (used0&&used1) sum++; - if (index0==index1 && used0 && used1) sums++; - } - - // - if (sums<10) continue; - if (sum<40) continue; - if (sums/Float_t(TMath::Min(sum0,sum1))<0.5) continue; - // - Double_t dist[5][4]; // distance at X - Double_t mdist[4]={0,0,0,0}; // mean distance on range +-delta - - // - // - track0->GetDistance(track1,xm[i0],dist[0],AliTracker::GetBz()); - for (Int_t i=0;i<3;i++) mdist[i]+=TMath::Abs(dist[0][i]); - track0->GetDistance(track1,xm[i1],dist[1],AliTracker::GetBz()); - for (Int_t i=0;i<3;i++) mdist[i]+=TMath::Abs(dist[1][i]); - // - track0->GetDistance(track1,TMath::Min(xm[i1],xm[i0])-kdelta,dist[2],AliTracker::GetBz()); - for (Int_t i=0;i<3;i++) mdist[i]+=TMath::Abs(dist[2][i]); - track0->GetDistance(track1,TMath::Max(xm[i1],xm[i0])+kdelta,dist[3],AliTracker::GetBz()); - for (Int_t i=0;i<3;i++) mdist[i]+=TMath::Abs(dist[3][i]); - // - track0->GetDistance(track1,(xm[i1]+xm[i0])*0.5,dist[4],AliTracker::GetBz()); - for (Int_t i=0;i<3;i++) mdist[i]+=TMath::Abs(dist[4][i]); - for (Int_t i=0;i<3;i++) mdist[i]*=0.2; // + // remove track with lower quality // - Int_t lab0=track0->GetLabel(); - Int_t lab1=track1->GetLabel(); - if( AliTPCReconstructor::StreamLevel()>5){ - TTreeSRedirector &cstream = *fDebugStreamer; - cstream<<"Splitted"<< - "iter="<AliTPCReconstructor::GetRecoParam()->GetCutSharedClusters(0) || + ratio1>AliTPCReconstructor::GetRecoParam()->GetCutSharedClusters(1)){ + // + // + // + delete array->RemoveAt(index1); } - delete array->RemoveAt(i1); } - } - delete [] helixes; - delete [] xm; + } + // + // 4. Delete temporary array + // + delete [] params; delete [] quality; delete [] indexes; - AliInfo("Time for splitted tracks removal"); - timer.Print(); + } -void AliTPCtrackerMI::FindCurling(TObjArray * array, AliESDEvent */*esd*/, Int_t iter) +void AliTPCtrackerMI::FindCurling(const TObjArray * array, AliESDEvent */*esd*/, Int_t iter) { // // find Curling tracks @@ -4489,7 +4607,8 @@ void AliTPCtrackerMI::FindCurling(TObjArray * array, AliESDEvent */*esd*/, Int_ // TStopwatch timer; timer.Start(); - Double_t phase[2][2],radius[2]; + Double_t phase[2][2]={{0,0},{0,0}},radius[2]={0,0}; + // // Find tracks // @@ -4585,7 +4704,7 @@ void AliTPCtrackerMI::FindCurling(TObjArray * array, AliESDEvent */*esd*/, Int_ track0->SetCircular(track0->GetCircular()+2); } } - if (AliTPCReconstructor::StreamLevel()>1){ + if (AliTPCReconstructor::StreamLevel()>2){ // //debug stream to tune "fine" cuts Int_t lab0=track0->GetLabel(); @@ -4701,7 +4820,7 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESDEvent *esd) Int_t ncandidates =0; Int_t nall =0; Int_t ntracks=0; - Double_t phase[2][2],radius[2]; + Double_t phase[2][2]={{0,0},{0,0}},radius[2]={0,0}; // // Find circling track @@ -4942,8 +5061,8 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESDEvent *esd) Float_t x[3] = { kink->GetPosition()[0],kink->GetPosition()[1],kink->GetPosition()[2]}; Int_t index[4]; - fParam->Transform0to1(x,index); - fParam->Transform1to2(x,index); + fkParam->Transform0to1(x,index); + fkParam->Transform1to2(x,index); row0 = GetRowNumber(x[0]); if (kink->GetR()<100) continue; @@ -5022,6 +5141,30 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESDEvent *esd) kink->SetShapeFactor(shapesum/sum); } // esd->AddKink(kink); + // + // kink->SetMother(paramm); + //kink->SetDaughter(paramd); + + Double_t chi2P2 = paramm.GetParameter()[2]-paramd.GetParameter()[2]; + chi2P2*=chi2P2; + chi2P2/=paramm.GetCovariance()[5]+paramd.GetCovariance()[5]; + Double_t chi2P3 = paramm.GetParameter()[3]-paramd.GetParameter()[3]; + chi2P3*=chi2P3; + chi2P3/=paramm.GetCovariance()[9]+paramd.GetCovariance()[9]; + // + if (AliTPCReconstructor::StreamLevel()>1) { + (*fDebugStreamer)<<"kinkLpt"<< + "chi2P2="<GetKinkAngleCutChi2(0)){ + continue; + } + // kinks->AddLast(kink); kink = new AliKink; ncandidates++; @@ -5104,7 +5247,8 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESDEvent *esd) AliKink * kink0 = (AliKink*) kinks->At(indexes[ikink0]); if (!kink0) continue; // - for (Int_t ikink1=0;ikink1At(indexes[ikink0]); if (!kink0) continue; AliKink * kink1 = (AliKink*) kinks->At(indexes[ikink1]); if (!kink1) continue; @@ -5157,6 +5301,7 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESDEvent *esd) shared[kink0->GetIndex(0)]= kTRUE; shared[kink0->GetIndex(1)]= kTRUE; delete kinks->RemoveAt(indexes[ikink0]); + break; } else{ shared[kink1->GetIndex(0)]= kTRUE; @@ -5317,369 +5462,12 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESDEvent *esd) kinks->Delete(); delete kinks; - printf("Ncandidates=\t%d\t%d\t%d\t%d\n",esd->GetNumberOfKinks(),ncandidates,ntracks,nall); + AliInfo(Form("Ncandidates=\t%d\t%d\t%d\t%d\n",esd->GetNumberOfKinks(),ncandidates,ntracks,nall)); timer.Print(); } -void AliTPCtrackerMI::FindV0s(TObjArray * array, AliESDEvent *esd) -{ - // - // find V0s - // - // - TObjArray *tpcv0s = new TObjArray(100000); - Int_t nentries = array->GetEntriesFast(); - AliHelix *helixes = new AliHelix[nentries]; - Int_t *sign = new Int_t[nentries]; - Float_t *alpha = new Float_t[nentries]; - Float_t *z0 = new Float_t[nentries]; - Float_t *dca = new Float_t[nentries]; - Float_t *sdcar = new Float_t[nentries]; - Float_t *cdcar = new Float_t[nentries]; - Float_t *pulldcar = new Float_t[nentries]; - Float_t *pulldcaz = new Float_t[nentries]; - Float_t *pulldca = new Float_t[nentries]; - Bool_t *isPrim = new Bool_t[nentries]; - const AliESDVertex * primvertex = esd->GetVertex(); - Double_t zvertex = primvertex->GetZv(); - // - // nentries = array->GetEntriesFast(); - // - for (Int_t i=0;iAt(i); - if (!track) continue; - track->GetV0Indexes()[0] = 0; //rest v0 indexes - track->GetV0Indexes()[1] = 0; //rest v0 indexes - track->GetV0Indexes()[2] = 0; //rest v0 indexes - // - alpha[i] = track->GetAlpha(); - new (&helixes[i]) AliHelix(*track); - Double_t xyz[3]; - helixes[i].Evaluate(0,xyz); - sign[i] = (track->GetC()>0) ? -1:1; - Double_t x,y,z; - x=160; - z0[i]=1000; - if (track->GetProlongation(0,y,z)) z0[i] = z; - dca[i] = track->GetD(0,0); - // - // dca error parrameterezation + pulls - // - sdcar[i] = TMath::Sqrt(0.150*0.150+(100*track->GetC())*(100*track->GetC())); - if (TMath::Abs(track->GetTgl())>1) sdcar[i]*=2.5; - cdcar[i] = TMath::Exp((TMath::Abs(track->GetC())-0.0106)*525.3); - pulldcar[i] = (dca[i]-cdcar[i])/sdcar[i]; - pulldcaz[i] = (z0[i]-zvertex)/sdcar[i]; - pulldca[i] = TMath::Sqrt(pulldcar[i]*pulldcar[i]+pulldcaz[i]*pulldcaz[i]); - if (track->TPCrPID(1)+track->TPCrPID(2)+track->TPCrPID(3)>0.5) { - if (pulldca[i]<3.) isPrim[i]=kTRUE; //pion, muon and Kaon 3 sigma cut - } - if (track->TPCrPID(4)>0.5) { - if (pulldca[i]<0.5) isPrim[i]=kTRUE; //proton 0.5 sigma cut - } - if (track->TPCrPID(0)>0.4) { - isPrim[i]=kFALSE; //electron no sigma cut - } - } - // - // - TStopwatch timer; - timer.Start(); - Int_t ncandidates =0; - Int_t nall =0; - Int_t ntracks=0; - Double_t phase[2][2],radius[2]; - // - // Finf V0s loop - // - // - // // - Float_t fprimvertex[3]={GetX(),GetY(),GetZ()}; - AliV0 vertex; - Double_t cradius0 = 10*10; - Double_t cradius1 = 200*200; - Double_t cdist1=3.; - Double_t cdist2=4.; - Double_t cpointAngle = 0.95; - // - Double_t delta[2]={10000,10000}; - for (Int_t i =0;iAt(i); - if (!track0) continue; - if (AliTPCReconstructor::StreamLevel()>1){ - TTreeSRedirector &cstream = *fDebugStreamer; - cstream<<"Tracks"<< - "Tr0.="<GetSigned1Pt()<0) continue; - if (track0->GetKinkIndex(0)>0||isPrim[i]) continue; //daughter kink - // - if (TMath::Abs(helixes[i].GetHelix(4))<0.000000001) continue; - ntracks++; - // debug output - - - for (Int_t j =0;jAt(j); - if (!track1) continue; - if (track1->GetKinkIndex(0)>0 || isPrim[j]) continue; //daughter kink - if (sign[j]*sign[i]>0) continue; - if (TMath::Abs(helixes[j].GetHelix(4))<0.000001) continue; - if (track0->GetCircular()+track1->GetCircular()>1) continue; //circling -returning track - nall++; - // - // DCA to prim vertex cut - // - // - delta[0]=10000; - delta[1]=10000; - - Int_t npoints = helixes[i].GetRPHIintersections(helixes[j], phase, radius,cdist2); - if (npoints<1) continue; - Int_t iclosest=0; - // cuts on radius - if (npoints==1){ - if (radius[0]cradius1) continue; - helixes[i].LinearDCA(helixes[j],phase[0][0],phase[0][1],radius[0],delta[0]); - if (delta[0]>cdist1) continue; - } - else{ - if (TMath::Max(radius[0],radius[1])cradius1) continue; - helixes[i].LinearDCA(helixes[j],phase[0][0],phase[0][1],radius[0],delta[0]); - helixes[i].LinearDCA(helixes[j],phase[1][0],phase[1][1],radius[1],delta[1]); - if (delta[1]cdist1) continue; - } - helixes[i].ParabolicDCA(helixes[j],phase[iclosest][0],phase[iclosest][1],radius[iclosest],delta[iclosest]); - if (radius[iclosest]cradius1 || delta[iclosest]>cdist1) continue; - // - Double_t pointAngle = helixes[i].GetPointAngle(helixes[j],phase[iclosest],fprimvertex); - if (pointAngleTPCrPID(0)>0.3&&track1->TPCrPID(0)>0.3&&vertex.GetAnglep()[2]<0.15) isGamma=kTRUE; // gamma conversion candidate - Double_t pointAngle2 = vertex.GetV0CosineOfPointingAngle(); - //continue; - if (vertex.GetV0CosineOfPointingAngle()2&&(!isGamma)) continue; // point angle cut - if (vertex.GetDcaV0Daughters()>2&&(!isGamma)) continue;//Bo: // point angle cut - Float_t sigmae = 0.15*0.15; - if (vertex.GetRr()<80) - sigmae += (sdcar[i]*sdcar[i]+sdcar[j]*sdcar[j])*(1.-vertex.GetRr()/80.)*(1.-vertex.GetRr()/80.); - sigmae+= TMath::Sqrt(sigmae); - //Bo: if (vertex.GetDist2()/sigmae>3.&&(!isGamma)) continue; - if (vertex.GetDcaV0Daughters()/sigmae>3.&&(!isGamma)) continue; - Float_t densb0=0,densb1=0,densa0=0,densa1=0; - Int_t row0 = GetRowNumber(vertex.GetRr()); - if (row0>15){ - //Bo: if (vertex.GetDist2()>0.2) continue; - if (vertex.GetDcaV0Daughters()>0.2) continue; - densb0 = track0->Density2(0,row0-5); - densb1 = track1->Density2(0,row0-5); - if (densb0>0.3|| densb1>0.3) continue; //clusters before vertex - densa0 = track0->Density2(row0+5,row0+40); - densa1 = track1->Density2(row0+5,row0+40); - if ((densa0<0.4|| densa1<0.4)&&(!isGamma)) continue; //missing clusters after vertex - } - else{ - densa0 = track0->Density2(0,40); //cluster density - densa1 = track1->Density2(0,40); //cluster density - if ((vertex.GetRr()<80&&densa0+densa1<1.)&&(!isGamma)) continue; - } -//Bo: vertex.SetLab(0,track0->GetLabel()); -//Bo: vertex.SetLab(1,track1->GetLabel()); - vertex.SetChi2After((densa0+densa1)*0.5); - vertex.SetChi2Before((densb0+densb1)*0.5); - vertex.SetIndex(0,i); - vertex.SetIndex(1,j); -//Bo: vertex.SetStatus(1); // TPC v0 candidate - vertex.SetOnFlyStatus(2);//Bo: // TPC v0 candidate -//Bo: vertex.SetRp(track0->TPCrPIDs()); -//Bo: vertex.SetRm(track1->TPCrPIDs()); - tpcv0s->AddLast(new AliESDv0(vertex)); - ncandidates++; - { - Int_t eventNr = esd->GetEventNumberInFile(); // This is most likely NOT the event number you'd like to use. It has nothing to do with the 'real' event number - Double_t radiusm= (delta[0]1) { - Int_t lab0=track0->GetLabel(); - Int_t lab1=track1->GetLabel(); - Char_t c0=track0->GetCircular(); - Char_t c1=track1->GetCircular(); - TTreeSRedirector &cstream = *fDebugStreamer; - cstream<<"V0"<< - "Event="<At(i); - quality[i] = 1./(1.00001-v0->GetV0CosineOfPointingAngle()); //base point angle - // quality[i] /= (0.5+v0->GetDist2()); - // quality[i] *= v0->GetChi2After(); //density factor - - Int_t index0 = v0->GetIndex(0); - Int_t index1 = v0->GetIndex(1); - //Bo: Double_t minpulldca = TMath::Min(2.+pulldca[v0->GetIndex(0)],(2.+pulldca[v0->GetIndex(1)]) ); //pull - Double_t minpulldca = TMath::Min(2.+pulldca[index0],(2.+pulldca[index1]) );//Bo: - - - - AliTPCseed * track0 = (AliTPCseed*)array->At(index0); - AliTPCseed * track1 = (AliTPCseed*)array->At(index1); - if (track0->TPCrPID(0)>0.3&&track1->TPCrPID(0)>0.3&&v0->GetAnglep()[2]<0.15) quality[i]+=1000000; // gamma conversion candidate - if (track0->TPCrPID(4)>0.9||(track1->TPCrPID(4)>0.9&&minpulldca>4)) quality[i]*=10; // lambda candidate candidate - } - - TMath::Sort(ncandidates,quality,indexes,kTRUE); - // - // - for (Int_t i=0;iAt(indexes[i]); - if (!v0) continue; - Int_t index0 = v0->GetIndex(0); - Int_t index1 = v0->GetIndex(1); - AliTPCseed * track0 = (AliTPCseed*)array->At(index0); - AliTPCseed * track1 = (AliTPCseed*)array->At(index1); - if (!track0||!track1) { - printf("Bug\n"); - continue; - } - Bool_t accept =kTRUE; //default accept - Int_t *v0indexes0 = track0->GetV0Indexes(); - Int_t *v0indexes1 = track1->GetV0Indexes(); - // - Int_t order0 = (v0indexes0[0]!=0) ? 1:0; - Int_t order1 = (v0indexes1[0]!=0) ? 1:0; - if (v0indexes0[1]!=0) order0 =2; - if (v0indexes1[1]!=0) order1 =2; - // - if (v0indexes0[2]!=0) {order0=3; accept=kFALSE;} - if (v0indexes0[2]!=0) {order1=3; accept=kFALSE;} - // - AliESDv0 * v02 = v0; - if (accept){ - //Bo: v0->SetOrder(0,order0); - //Bo: v0->SetOrder(1,order1); - //Bo: v0->SetOrder(1,order0+order1); - v0->SetOnFlyStatus(kTRUE); - Int_t index = esd->AddV0(v0); - v02 = esd->GetV0(index); - v0indexes0[order0]=index; - v0indexes1[order1]=index; - naccepted++; - } - { - Int_t eventNr = esd->GetEventNumberInFile(); // This is most likely NOT the event number you'd like to use. It has nothing to do with the 'real' event number - if (AliTPCReconstructor::StreamLevel()>1) { - Int_t lab0=track0->GetLabel(); - Int_t lab1=track1->GetLabel(); - TTreeSRedirector &cstream = *fDebugStreamer; - cstream<<"V02"<< - "Event="<1) { + (*fDebugStreamer)<<"kinkHpt"<< + "chi2P2="<GetKinkAngleCutChi2(0)){ + delete seed0; + delete seed1; + return 0; + } + + row0 = GetRowNumber(kink.GetR()); kink.SetTPCRow0(row0); kink.SetLabel(CookLabel(seed0,0.5,0,row0),0); @@ -5967,9 +5780,12 @@ Int_t AliTPCtrackerMI::CheckKinkPoint(AliTPCseed*seed,AliTPCseed &mother, AliTP daughter = param1[index]; daughter.SetLabel(kink.GetLabel(1)); param0[index].Reset(kTRUE); - FollowProlongation(param0[index],0); + FollowProlongation(param0[index],0); mother = param0[index]; mother.SetLabel(kink.GetLabel(0)); + if ( chi2P2+chi2P3GetKinkAngleCutChi2(1)){ + mother=*seed; + } delete seed0; delete seed1; // @@ -6044,14 +5860,16 @@ Int_t AliTPCtrackerMI::ReadSeeds(const TFile *inp) { return 0; } -Int_t AliTPCtrackerMI::Clusters2Tracks (AliESDEvent *esd) +Int_t AliTPCtrackerMI::Clusters2Tracks (AliESDEvent *const esd) { // + if (fSeeds) DeleteSeeds(); fEvent = esd; Clusters2Tracks(); if (!fSeeds) return 1; FillESD(fSeeds); + if (AliTPCReconstructor::StreamLevel()>3) DumpClusters(0,fSeeds); return 0; // } @@ -6094,10 +5912,10 @@ Int_t AliTPCtrackerMI::Clusters2Tracks() { RemoveUsed2(fSeeds,0.85,0.85,0); if (AliTPCReconstructor::GetRecoParam()->GetDoKinks()) FindKinks(fSeeds,fEvent); //FindCurling(fSeeds, fEvent,0); - if (AliTPCReconstructor::StreamLevel()>2) FindMultiMC(fSeeds, fEvent,-1); // find multi found tracks + if (AliTPCReconstructor::StreamLevel()>5) FindMultiMC(fSeeds, fEvent,-1); // find multi found tracks RemoveUsed2(fSeeds,0.5,0.4,20); FindSplitted(fSeeds, fEvent,0); // find multi found tracks - if (AliTPCReconstructor::StreamLevel()>2) FindMultiMC(fSeeds, fEvent,0); // find multi found tracks + if (AliTPCReconstructor::StreamLevel()>5) FindMultiMC(fSeeds, fEvent,0); // find multi found tracks // // // // refit short tracks @@ -6267,6 +6085,9 @@ TObjArray * AliTPCtrackerMI::Tracking() TObjArray * seeds = new TObjArray; TObjArray * arr=0; + Int_t fLastSeedRowSec=AliTPCReconstructor::GetRecoParam()->GetLastSeedRowSec(); + Int_t gapPrim = AliTPCReconstructor::GetRecoParam()->GetSeedGapPrim(); + Int_t gapSec = AliTPCReconstructor::GetRecoParam()->GetSeedGapSec(); Int_t gap =20; Float_t cuts[4]; @@ -6280,7 +6101,7 @@ TObjArray * AliTPCtrackerMI::Tracking() // //find primaries cuts[0]=0.0066; - for (Int_t delta = 0; delta<18; delta+=6){ + for (Int_t delta = 0; delta<18; delta+=gapPrim){ // cuts[0]=0.0070; cuts[1] = 1.5; @@ -6305,7 +6126,7 @@ TObjArray * AliTPCtrackerMI::Tracking() //find primaries cuts[0]=0.0077; - for (Int_t delta = 20; delta<120; delta+=10){ + for (Int_t delta = 20; delta<120; delta+=gapPrim){ // // seed high pt tracks cuts[0]=0.0060; @@ -6358,9 +6179,22 @@ TObjArray * AliTPCtrackerMI::Tracking() SumTracks(seeds,arr); SignClusters(seeds,fnumber,fdensity); // + arr = Tracking(4,nup-5,nup-5-gap,cuts,-1); + SumTracks(seeds,arr); + SignClusters(seeds,fnumber,fdensity); + // + arr = Tracking(4,nup-7,nup-7-gap,cuts,-1); + SumTracks(seeds,arr); + SignClusters(seeds,fnumber,fdensity); + // + // + arr = Tracking(4,nup-9,nup-9-gap,cuts,-1); + SumTracks(seeds,arr); + SignClusters(seeds,fnumber,fdensity); + // - for (Int_t delta = 3; delta<30; delta+=5){ + for (Int_t delta = 9; delta<30; delta+=gapSec){ // cuts[0] = 0.3; cuts[1] = 1.5; @@ -6383,10 +6217,9 @@ TObjArray * AliTPCtrackerMI::Tracking() fdensity = 2.; cuts[0]=0.0080; - Int_t fLastSeedRowSec=AliTPCReconstructor::GetRecoParam()->GetLastSeedRowSec(); // find secondaries - for (Int_t delta = 30; deltaGetNRowLow()>rfirst+1) ) + if ( (fSectors ==fInnerSec) || (t.GetFirstPoint()-fkParam->GetNRowLow()>rfirst+1) ) FollowProlongation(t, rfirst+1); } @@ -6532,7 +6365,7 @@ void AliTPCtrackerMI::ParallelTracking(TObjArray * arr, Int_t rfirst, Int_t rla if (!pt) continue; if (nr==80) pt->UpdateReference(); if (!pt->IsActive()) continue; - // if ( (fSectors ==fOuterSec) && (pt->fFirstPoint-fParam->GetNRowLow())fFirstPoint-fkParam->GetNRowLow())GetRelativeSector()>17) { continue; } @@ -6543,7 +6376,7 @@ void AliTPCtrackerMI::ParallelTracking(TObjArray * arr, Int_t rfirst, Int_t rla AliTPCseed *pt=(AliTPCseed*)arr->UncheckedAt(i); if (!pt) continue; if (!pt->IsActive()) continue; - // if ((fSectors ==fOuterSec) && (pt->fFirstPoint-fParam->GetNRowLow())fFirstPoint-fkParam->GetNRowLow())GetRelativeSector()>17) { continue; } @@ -6552,7 +6385,7 @@ void AliTPCtrackerMI::ParallelTracking(TObjArray * arr, Int_t rfirst, Int_t rla } } -void AliTPCtrackerMI::PrepareForBackProlongation(TObjArray * arr,Float_t fac) const +void AliTPCtrackerMI::PrepareForBackProlongation(TObjArray *const arr,Float_t fac) const { // // @@ -6574,7 +6407,7 @@ void AliTPCtrackerMI::PrepareForBackProlongation(TObjArray * arr,Float_t fac) co Float_t angle2 = pt->GetAlpha(); if (TMath::Abs(angle1-angle2)>0.001){ - pt->Rotate(angle1-angle2); + if (!pt->Rotate(angle1-angle2)) return; //angle2 = pt->GetAlpha(); //pt->fRelativeSector = pt->GetAlpha()/fInnerSec->GetAlpha(); //if (pt->GetAlpha()<0) @@ -6588,7 +6421,7 @@ void AliTPCtrackerMI::PrepareForBackProlongation(TObjArray * arr,Float_t fac) co } -void AliTPCtrackerMI::PrepareForProlongation(TObjArray * arr, Float_t fac) const +void AliTPCtrackerMI::PrepareForProlongation(TObjArray *const arr, Float_t fac) const { // // @@ -6607,7 +6440,7 @@ void AliTPCtrackerMI::PrepareForProlongation(TObjArray * arr, Float_t fac) const } -Int_t AliTPCtrackerMI::PropagateBack(TObjArray * arr) +Int_t AliTPCtrackerMI::PropagateBack(TObjArray *const arr) { // // make back propagation @@ -6638,7 +6471,7 @@ Int_t AliTPCtrackerMI::PropagateBack(TObjArray * arr) } -Int_t AliTPCtrackerMI::PropagateForward2(TObjArray * arr) +Int_t AliTPCtrackerMI::PropagateForward2(TObjArray *const arr) { // // make forward propagation @@ -6686,7 +6519,7 @@ Int_t AliTPCtrackerMI::PropagateForward() -Int_t AliTPCtrackerMI::PropagateBack(AliTPCseed * pt, Int_t row0, Int_t row1) +Int_t AliTPCtrackerMI::PropagateBack(AliTPCseed *const pt, Int_t row0, Int_t row1) { // // make back propagation, in between row0 and row1 @@ -6723,24 +6556,29 @@ void AliTPCtrackerMI::GetShape(AliTPCseed * seed, Int_t row) // // AliTPCClusterParam * clparam = AliTPCcalibDB::Instance()->GetClusterParam(); - Float_t zdrift = TMath::Abs((fParam->GetZLength(0)-TMath::Abs(seed->GetZ()))); - Int_t type = (seed->GetSector() < fParam->GetNSector()/2) ? 0: (row>126) ? 1:2; + Float_t zdrift = TMath::Abs((fkParam->GetZLength(0)-TMath::Abs(seed->GetZ()))); + Int_t type = (seed->GetSector() < fkParam->GetNSector()/2) ? 0: (row>126) ? 1:2; Double_t angulary = seed->GetSnp(); - angulary = angulary*angulary/(1.-angulary*angulary); + + if (TMath::Abs(angulary)>AliTPCReconstructor::GetMaxSnpTracker()) { + angulary = TMath::Sign(AliTPCReconstructor::GetMaxSnpTracker(),angulary); + } + + angulary = angulary*angulary/((1.-angulary)*(1.+angulary)); Double_t angularz = seed->GetTgl()*seed->GetTgl()*(1.+angulary); Double_t sigmay = clparam->GetRMS0(0,type,zdrift,TMath::Sqrt(TMath::Abs(angulary))); Double_t sigmaz = clparam->GetRMS0(1,type,zdrift,TMath::Sqrt(TMath::Abs(angularz))); seed->SetCurrentSigmaY2(sigmay*sigmay); seed->SetCurrentSigmaZ2(sigmaz*sigmaz); - // Float_t sd2 = TMath::Abs((fParam->GetZLength(0)-TMath::Abs(seed->GetZ())))*fParam->GetDiffL()*fParam->GetDiffL(); -// // Float_t padlength = fParam->GetPadPitchLength(seed->fSector); + // Float_t sd2 = TMath::Abs((fkParam->GetZLength(0)-TMath::Abs(seed->GetZ())))*fkParam->GetDiffL()*fkParam->GetDiffL(); +// // Float_t padlength = fkParam->GetPadPitchLength(seed->fSector); // Float_t padlength = GetPadPitchLength(row); // // -// Float_t sresy = (seed->GetSector() < fParam->GetNSector()/2) ? 0.2 :0.3; +// Float_t sresy = (seed->GetSector() < fkParam->GetNSector()/2) ? 0.2 :0.3; // seed->SetCurrentSigmaY2(sd2+padlength*padlength*angulary/12.+sresy*sresy); // // -// Float_t sresz = fParam->GetZSigma(); +// Float_t sresz = fkParam->GetZSigma(); // seed->SetCurrentSigmaZ2(sd2+padlength*padlength*angularz*angularz*(1+angulary)/12.+sresz*sresz); /* Float_t wy = GetSigmaY(seed); @@ -6817,14 +6655,14 @@ void AliTPCtrackerMI::CookLabel(AliKalmanTrack *tk, Float_t wrong) const { if (TMath::Abs(c->GetLabel(1)) == lab || TMath::Abs(c->GetLabel(2)) == lab ) max++; } - - if ((1.- Float_t(max)/noc) > wrong) lab=-lab; + if (noc<=0) { lab=-1; return;} + if ((1.- Float_t(max)/(noc)) > wrong) lab=-lab; else { Int_t tail=Int_t(0.10*noc); max=0; Int_t ind=0; - for (i=1; i<=160&&indGetLabel(1)) == lab || TMath::Abs(c->GetLabel(2)) == lab ) max++; } - - if ((1.- Float_t(max)/noc) > wrong) lab=-lab; + if (noc<=0) { lab=-1; return -1;} + if ((1.- Float_t(max)/(noc)) > wrong) lab=-lab; else { Int_t tail=Int_t(0.10*noc); max=0; Int_t ind=0; - for (i=1; i<=160&&indGetTrackPoint(iter); - if (point) { + // Change to cluster pointers to see if we have a cluster at given padrow + cluster = t->GetClusterPointer(iter); + if (cluster) { t->SetClusterMapBit(iter, kTRUE); + point = t->GetTrackPoint(iter); if (point->IsShared()) t->SetSharedMapBit(iter,kTRUE); else @@ -6976,7 +6817,7 @@ Bool_t AliTPCtrackerMI::IsFindable(AliTPCseed & track){ Float_t z = track.GetZ(); if (TMath::Abs(z)<(AliTPCReconstructor::GetCtgRange()*track.GetX()+kDeltaZ) && - TMath::Abs(z)GetZLength(0) && + TMath::Abs(z)GetZLength(0) && (TMath::Abs(track.GetSnp())GetSystematicError(); + Double_t *covarIn= (Double_t*)seed->GetCovariance(); Double_t covar[15]; for (Int_t i=0;i<15;i++) covar[i]=0; // 0 @@ -7002,5 +6844,20 @@ void AliTPCtrackerMI::AddCovariance(AliTPCseed * seed){ covar[9] = param[3]*param[3]; Double_t facC = AliTracker::GetBz()*kB2C; covar[14]= param[4]*param[4]*facC*facC; + // + covar[1]=TMath::Sqrt((covar[0]*covar[2]))*covarIn[1]/TMath::Sqrt((covarIn[0]*covarIn[2])); + // + covar[3]=TMath::Sqrt((covar[0]*covar[5]))*covarIn[3]/TMath::Sqrt((covarIn[0]*covarIn[5])); + covar[4]=TMath::Sqrt((covar[2]*covar[5]))*covarIn[4]/TMath::Sqrt((covarIn[2]*covarIn[5])); + // + covar[6]=TMath::Sqrt((covar[0]*covar[9]))*covarIn[6]/TMath::Sqrt((covarIn[0]*covarIn[9])); + covar[7]=TMath::Sqrt((covar[2]*covar[9]))*covarIn[7]/TMath::Sqrt((covarIn[2]*covarIn[9])); + covar[8]=TMath::Sqrt((covar[5]*covar[9]))*covarIn[8]/TMath::Sqrt((covarIn[5]*covarIn[9])); + // + covar[10]=TMath::Sqrt((covar[0]*covar[14]))*covarIn[10]/TMath::Sqrt((covarIn[0]*covarIn[14])); + covar[11]=TMath::Sqrt((covar[2]*covar[14]))*covarIn[11]/TMath::Sqrt((covarIn[2]*covarIn[14])); + covar[12]=TMath::Sqrt((covar[5]*covar[14]))*covarIn[12]/TMath::Sqrt((covarIn[5]*covarIn[14])); + covar[13]=TMath::Sqrt((covar[9]*covar[14]))*covarIn[13]/TMath::Sqrt((covarIn[9]*covarIn[14])); + // seed->AddCovariance(covar); }