X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCcalibTime.cxx;h=3b44ecdc2e74da98fafd529deca079b9de6ad3bd;hb=b9ab8e40afde2d82df7ddccde8c62a2daf00dae4;hp=4dd0aa5bce7ef570c894c3dfc39e53926352573e;hpb=9112627b31114e8fc9515485d3490b323e081ff1;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCcalibTime.cxx b/TPC/AliTPCcalibTime.cxx index 4dd0aa5bce7..3b44ecdc2e7 100644 --- a/TPC/AliTPCcalibTime.cxx +++ b/TPC/AliTPCcalibTime.cxx @@ -96,23 +96,29 @@ Comments to be written here: #include "AliTPCseed.h" #include "AliTrackPointArray.h" #include "AliTracker.h" +#include "AliKFVertex.h" +#include ClassImp(AliTPCcalibTime) AliTPCcalibTime::AliTPCcalibTime() - :AliTPCcalibBase(), + :AliTPCcalibBase(), + fMemoryMode(1), // 0 -do not fill THnSparse with residuals 1- fill only important QA THn 2 - Fill all THnsparse for calibration fLaser(0), // pointer to laser calibration fDz(0), // current delta z fCutMaxD(3), // maximal distance in rfi ditection fCutMaxDz(25), // maximal distance in rfi ditection fCutTheta(0.03), // maximal distan theta fCutMinDir(-0.99), // direction vector products - fCutTracks(100), + fCutTracks(2500), + fArrayLaserA(0), //laser fit parameters C + fArrayLaserC(0), //laser fit parameters A fArrayDz(0), //NEW! Tmap of V drifts for different triggers fAlignITSTPC(0), //alignemnt array ITS TPC match fAlignTRDTPC(0), //alignemnt array TRD TPC match fAlignTOFTPC(0), //alignemnt array TOF TPC match + fTimeKalmanBin(60*15), //time bin width for kalman - 15 minutes default fTimeBins(0), fTimeStart(0), fTimeEnd(0), @@ -139,26 +145,46 @@ AliTPCcalibTime::AliTPCcalibTime() } // for (Int_t i=0;i<5;i++) { + fResHistoTPCCE[i]=0; fResHistoTPCITS[i]=0; fResHistoTPCTRD[i]=0; + fResHistoTPCTOF[i]=0; fResHistoTPCvertex[i]=0; + fTPCVertex[i]=0; + } + for (Int_t i=0;i<12;i++) { + fTPCVertex[i]=0; + } + for (Int_t i=0;i<5;i++) { + fTPCVertexCorrelation[i]=0; + } + static Int_t counter=0; + if (1) { + TTimeStamp s; + Int_t time=s; + AliInfo(Form("Counter Constructor\t%d\t%d",counter,time)); + counter++; } } -AliTPCcalibTime::AliTPCcalibTime(const Text_t *name, const Text_t *title, UInt_t StartTime, UInt_t EndTime, Int_t deltaIntegrationTimeVdrift) +AliTPCcalibTime::AliTPCcalibTime(const Text_t *name, const Text_t *title, UInt_t StartTime, UInt_t EndTime, Int_t deltaIntegrationTimeVdrift, Int_t memoryMode) :AliTPCcalibBase(), + fMemoryMode(memoryMode), // 0 -do not fill THnSparse with residuals 1- fill only important QA THn 2 - Fill all THnsparse for calibration fLaser(0), // pointer to laser calibration fDz(0), // current delta z fCutMaxD(5*0.5356), // maximal distance in rfi ditection fCutMaxDz(40), // maximal distance in rfi ditection fCutTheta(5*0.004644),// maximal distan theta fCutMinDir(-0.99), // direction vector products - fCutTracks(100), + fCutTracks(2500), + fArrayLaserA(new TObjArray(1000)), //laser fit parameters C + fArrayLaserC(new TObjArray(1000)), //laser fit parameters A fArrayDz(0), //Tmap of V drifts for different triggers fAlignITSTPC(0), //alignemnt array ITS TPC match fAlignTRDTPC(0), //alignemnt array TRD TPC match fAlignTOFTPC(0), //alignemnt array TOF TPC match + fTimeKalmanBin(60*15), //time bin width for kalman - 15 minutes default fTimeBins(0), fTimeStart(0), fTimeEnd(0), @@ -184,8 +210,10 @@ AliTPCcalibTime::AliTPCcalibTime(const Text_t *name, const Text_t *title, UInt_t } for (Int_t i=0;i<5;i++) { + fResHistoTPCCE[i]=0; fResHistoTPCITS[i]=0; fResHistoTPCTRD[i]=0; + fResHistoTPCTOF[i]=0; fResHistoTPCvertex[i]=0; } @@ -262,13 +290,27 @@ AliTPCcalibTime::AliTPCcalibTime(const Text_t *name, const Text_t *title, UInt_t fCosmiMatchingHisto[7]=new TH1F("Cosmics matching","p2-isPair",100,-10*0.01134 ,10*0.01134 ); fCosmiMatchingHisto[8]=new TH1F("Cosmics matching","p3-isPair",100,-10*0.004644,10*0.004644); fCosmiMatchingHisto[9]=new TH1F("Cosmics matching","p4-isPair",100,-10*0.03773 ,10*0.03773 ); + for (Int_t i=0;i<12;i++) { + fTPCVertex[i]=0; + } + for (Int_t i=0;i<5;i++) { + fTPCVertexCorrelation[i]=0; + } BookDistortionMaps(); + } AliTPCcalibTime::~AliTPCcalibTime(){ // // Virtual Destructor // + static Int_t counter=0; + if (1) { + TTimeStamp s; + Int_t time=s; + AliInfo(Form("Counter Destructor\t%s\t%d\t%d",GetName(),counter,time)); + counter++; + } for(Int_t i=0;i<3;i++){ if(fHistVdriftLaserA[i]){ delete fHistVdriftLaserA[i]; @@ -293,15 +335,25 @@ AliTPCcalibTime::~AliTPCcalibTime(){ } for (Int_t i=0;i<5;i++) { + delete fResHistoTPCCE[i]; delete fResHistoTPCITS[i]; delete fResHistoTPCTRD[i]; + delete fResHistoTPCTOF[i]; delete fResHistoTPCvertex[i]; + fResHistoTPCCE[i]=0; fResHistoTPCITS[i]=0; fResHistoTPCTRD[i]=0; + fResHistoTPCTOF[i]=0; fResHistoTPCvertex[i]=0; } - + if (fTPCVertex) { + for (Int_t i=0;i<12;i++) delete fTPCVertex[i]; + } + if (fTPCVertexCorrelation) { + for (Int_t i=0;i<5;i++) delete fTPCVertexCorrelation[i]; + } + fAlignITSTPC->SetOwner(kTRUE); fAlignTRDTPC->SetOwner(kTRUE); fAlignTOFTPC->SetOwner(kTRUE); @@ -406,36 +458,12 @@ void AliTPCcalibTime::ProcessLaser(AliESDEvent *event){ TTreeSRedirector *cstream = GetDebugStreamer(); if (cstream){ TTimeStamp tstamp(fTime); - Float_t valuePressure0 = AliTPCcalibDB::GetPressure(tstamp,fRun,0); - Float_t valuePressure1 = AliTPCcalibDB::GetPressure(tstamp,fRun,1); - Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0); - Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1); - Double_t temp0 = AliTPCcalibDB::GetTemperature(tstamp,fRun,0); - Double_t temp1 = AliTPCcalibDB::GetTemperature(tstamp,fRun,1); - Double_t vdcorr = AliTPCcalibDB::Instance()->GetVDriftCorrectionTime(tstamp,fRun,0,1); - TVectorD vecGoofie(20); - AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(fRun); - if (goofieArray){ - for (Int_t isensor=0; isensorNumSensors();isensor++){ - AliDCSSensor *gsensor = goofieArray->GetSensor(isensor); - if (gsensor) vecGoofie[isensor]=gsensor->GetValue(tstamp); - } - } (*cstream)<<"laserInfo"<< "run="<ClassName(); -// shortName+="_MEAN_DRIFT_LASER_"; -// delete curHist; -// curHist=NULL; -// TString name=""; - -// name=shortName; -// name+=event->GetFiredTriggerClasses(); -// name.ToUpper(); -// curHist=(THnSparseF*)fArrayDz->FindObject(name); -// if(!curHist){ -// curHist=new THnSparseF(name,"HistVdrift;time;p/T ratio;Vdrift;run",4,fBinsVdrift,fXminVdrift,fXmaxVdrift); -// fArrayDz->AddLast(curHist); -// } -// curHist->Fill(vecDrift); - -// name=shortName; -// name+="ALL"; -// name.ToUpper(); -// curHist=(THnSparseF*)fArrayDz->FindObject(name); -// if(!curHist){ -// curHist=new THnSparseF(name,"HistVdrift;time;p/T ratio;Vdrift;run",4,fBinsVdrift,fXminVdrift,fXmaxVdrift); -// fArrayDz->AddLast(curHist); -// } -// curHist->Fill(vecDrift); } void AliTPCcalibTime::ProcessCosmic(const AliESDEvent *const event){ @@ -544,7 +559,7 @@ void AliTPCcalibTime::ProcessCosmic(const AliESDEvent *const event){ if (ntracks > fCutTracks) return; if (GetDebugLevel()>20) printf("Hallo world: Im here\n"); - AliESDfriend *esdFriend=static_cast(event->FindListObject("AliESDfriend")); + AliESDfriend *esdFriend=(AliESDfriend*)(((AliESDEvent*)event)->FindListObject("AliESDfriend")); TObjArray tpcSeeds(ntracks); Double_t vtxx[3]={0,0,0}; @@ -647,8 +662,8 @@ void AliTPCcalibTime::ProcessCosmic(const AliESDEvent *const event){ // // Propagate using Magnetic field and correct fo material budget // - AliTracker::PropagateTrackTo(¶m0,dmax+1,0.0005,3,kTRUE); - AliTracker::PropagateTrackTo(¶m1,dmax+1,0.0005,3,kTRUE); + AliTracker::PropagateTrackTo(¶m0,dmax+1,TDatabasePDG::Instance()->GetParticle("e-")->Mass(),3,kTRUE); + AliTracker::PropagateTrackTo(¶m1,dmax+1,TDatabasePDG::Instance()->GetParticle("e-")->Mass(),3,kTRUE); // // Propagate rest to the 0,0 DCA - z should be ignored // @@ -743,22 +758,6 @@ void AliTPCcalibTime::ProcessCosmic(const AliESDEvent *const event){ if (fStreamLevel>0){ TTreeSRedirector *cstream = GetDebugStreamer(); if (cstream){ - TTimeStamp tstamp(fTime); - Float_t valuePressure0 = AliTPCcalibDB::GetPressure(tstamp,fRun,0); - Float_t valuePressure1 = AliTPCcalibDB::GetPressure(tstamp,fRun,1); - Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0); - Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1); - Double_t temp0 = AliTPCcalibDB::GetTemperature(tstamp,fRun,0); - Double_t temp1 = AliTPCcalibDB::GetTemperature(tstamp,fRun,1); - Double_t vdcorr = AliTPCcalibDB::Instance()->GetVDriftCorrectionTime(tstamp,fRun,0,1); - TVectorD vecGoofie(20); - AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(fRun); - if (goofieArray){ - for (Int_t isensor=0; isensorNumSensors();isensor++){ - AliDCSSensor *gsensor = goofieArray->GetSensor(isensor); - if (gsensor) vecGoofie[isensor]=gsensor->GetValue(tstamp); - } - } (*cstream)<<"timeInfo"<< "run="<GetFiredTriggerClasses().Data()); } -void AliTPCcalibTime::ProcessBeam(const AliESDEvent *const /*event*/){ +void AliTPCcalibTime::ProcessBeam(const AliESDEvent *const event){ + // + // + // + const Int_t kMinClusters =80; + const Int_t kMinTracks =2; // minimal number of tracks to define the vertex + const Int_t kMinTracksVertex=30; // minimal number of tracks to define the cumulative vertex + const Double_t kMaxTgl =1.2; // maximal Tgl (z angle) + const Double_t kMinPt =0.2; // minimal pt + const Double_t kMaxD0 =5.; // cut on distance to the primary vertex first guess + const Double_t kMaxZ0 =20; + const Double_t kMaxD =2.5; // cut on distance to the primary vertex + const Double_t kMaxZ =4; // maximal z distance between tracks form the same side + const Double_t kMaxChi2 =15; // maximal chi2 of the TPCvertex + const Double_t kCumulCovarXY=0.003; //increase the error of cumul vertex 30 microns profile + const Double_t kCumulCovarZ=250.; //increase the error of cumul vertex + const Double_t kMaxDvertex = 1.0; // cut to accept the vertex; + // + Int_t flags=0; + const Int_t kBuffSize=100; + static Double_t deltaZ[kBuffSize]={0}; + static Int_t counterZ=0; + static AliKFVertex cumulVertexA, cumulVertexC, cumulVertexAC; // cumulative vertex + AliKFVertex vertexA, vertexC; + + Float_t dca0[2]={0,0}; + Double_t dcaVertex[2]={0,0}; + Int_t ntracks=event->GetNumberOfTracks(); + if (ntracks==0) return; + // + AliESDfriend *esdFriend=(AliESDfriend*)(((AliESDEvent*)event)->FindListObject("AliESDfriend")); + // + // Divide tracks to A and C side tracks - using the cluster indexes + TObjArray tracksA(ntracks); + TObjArray tracksC(ntracks); // - // Not special treatment yet - the same for cosmic and physic event + AliESDVertex *vertexSPD = (AliESDVertex *)event->GetPrimaryVertexSPD(); + AliESDVertex *vertex = (AliESDVertex *)event->GetPrimaryVertex(); + AliESDVertex *vertexTracks = (AliESDVertex *)event->GetPrimaryVertexTracks(); + Double_t vertexZA[10000], vertexZC[10000]; // + Int_t ntracksA= 0; + Int_t ntracksC= 0; + // + for (Int_t itrack=0;itrackGetTrack(itrack); + AliESDfriendTrack *friendTrack = esdFriend->GetTrack(itrack); + if (!friendTrack) continue; + if (TMath::Abs(track->GetTgl())>kMaxTgl) continue; + if (TMath::Abs(track->Pt())GetInnerParam(); + TObject *calibObject=0; + AliTPCseed *seed = 0; + Int_t nA=0, nC=0; + for (Int_t l=0;(calibObject=friendTrack->GetCalibObject(l));++l) if ((seed=dynamic_cast(calibObject))) break; + if (seed) { + for (Int_t irow=159;irow>0;irow--) { + AliTPCclusterMI *cl=seed->GetClusterPointer(irow); + if (!cl) continue; + if ((cl->GetDetector()%36)<18) nA++; + if ((cl->GetDetector()%36)>=18) nC++; + } + if ((nA>kMinClusters || nC>kMinClusters) && (nA*nC==0) ){ + track->GetImpactParameters(dca0[0],dca0[1]); + if (TMath::Abs(dca0[0])>kMaxD0) continue; + if (TMath::Abs(dca0[1])>kMaxZ0) continue; + AliExternalTrackParam pTPCvertex(*trackIn); + if (!AliTracker::PropagateTrackToBxByBz(&pTPCvertex,4.+4.*TMath::Abs(dca0[0]),0.1,2,kTRUE)) continue; + pTPCvertex.PropagateToDCA(vertex,AliTracker::GetBz(), kMaxD, dcaVertex,0); + if (TMath::Abs(dcaVertex[0])>kMaxD) continue; + if (nA>kMinClusters &&nC==0) { tracksA.AddLast(pTPCvertex.Clone()); vertexZA[ntracksA++] = pTPCvertex.GetZ();} + if (nC>kMinClusters &&nA==0) {tracksC.AddLast(pTPCvertex.Clone()); vertexZC[ntracksC++] = pTPCvertex.GetZ();} + } + } + } + Double_t medianZA=TMath::Median(ntracksA, vertexZA); // tracks median + Double_t medianZC=TMath::Median(ntracksC, vertexZC); // tracks median + // + ntracksA= tracksA.GetEntriesFast(); + ntracksC= tracksC.GetEntriesFast(); + if (ntracksA>kMinTracks && ntracksC>kMinTracks){ + deltaZ[counterZ%kBuffSize]=medianZA-medianZC; + counterZ+=1; + Double_t medianDelta=(counterZ>=kBuffSize)? TMath::Median(kBuffSize, deltaZ): TMath::Median(counterZ, deltaZ); + if (TMath::Abs(medianDelta-(medianZA-medianZC))>kMaxZ) flags+=16; + // increse the error of cumulative vertex at the beginning of event + cumulVertexA.Covariance(0,0)+=kCumulCovarXY*kCumulCovarXY; + cumulVertexA.Covariance(1,1)+=kCumulCovarXY*kCumulCovarXY; + cumulVertexA.Covariance(2,2)+=kCumulCovarZ*kCumulCovarZ; + cumulVertexC.Covariance(0,0)+=kCumulCovarXY*kCumulCovarXY; + cumulVertexC.Covariance(1,1)+=kCumulCovarXY*kCumulCovarXY; + cumulVertexC.Covariance(2,2)+=kCumulCovarZ*kCumulCovarZ; + cumulVertexAC.Covariance(0,0)+=kCumulCovarXY*kCumulCovarXY; + cumulVertexAC.Covariance(1,1)+=kCumulCovarXY*kCumulCovarXY; + cumulVertexAC.Covariance(2,2)+=kCumulCovarZ*kCumulCovarZ; + // + for (Int_t iA=0; iAGetZ()-medianZA)>kMaxZ) continue; + AliKFParticle part(*aliTrack,211); + vertexA+=part; + } + for (Int_t iC=0; iCGetZ()-medianZC)>kMaxZ) continue; + AliKFParticle part(*aliTrack,211); + vertexC+=part; + } + // + if (vertexA.GetNDF()kMaxZ) flags+=1; //apply cuts + if (TMath::Abs(vertexC.Z()-medianZC)>kMaxZ) flags+=2; + if (TMath::Abs(vertexA.GetChi2()/vertexA.GetNDF()+vertexC.GetChi2()/vertexC.GetNDF())> kMaxChi2) flags+=4; + // + if (flags==0){ + for (Int_t iA=0; iAGetZ()-medianZA)>kMaxZ) continue; + AliKFParticle part(*aliTrack,211); + cumulVertexA+=part; + cumulVertexAC+=part; + } + for (Int_t iC=0; iCGetZ()-medianZC)>kMaxZ) continue; + AliKFParticle part(*aliTrack,211); + cumulVertexC+=part; + cumulVertexAC+=part; + } + // + if (TMath::Abs(cumulVertexA.X()-vertexA.X())>kMaxDvertex) flags+=64; + if (TMath::Abs(cumulVertexA.Y()-vertexA.Y())>kMaxDvertex) flags+=64; + if (TMath::Abs(cumulVertexA.Z()-vertexA.Z())>kMaxDvertex) flags+=64; + // + if (TMath::Abs(cumulVertexC.X()-vertexC.X())>kMaxDvertex) flags+=64; + if (TMath::Abs(cumulVertexC.Y()-vertexC.Y())>kMaxDvertex) flags+=64; + if (TMath::Abs(cumulVertexC.Z()-vertexC.Z())>kMaxDvertex) flags+=64; + + + if ( flags==0 && cumulVertexC.GetNDF()>kMinTracksVertex&&cumulVertexA.GetNDF()>kMinTracksVertex){ + Double_t cont[2]={0,fTime}; + // + cont[0]= cumulVertexA.X(); + fTPCVertex[0]->Fill(cont); + cont[0]= cumulVertexC.X(); + fTPCVertex[1]->Fill(cont); + cont[0]= 0.5*(cumulVertexA.X()-cumulVertexC.X()); + fTPCVertex[2]->Fill(cont); + cont[0]= 0.5*(cumulVertexA.X()+cumulVertexC.X())-vertexSPD->GetX(); + fTPCVertex[3]->Fill(cont); + // + cont[0]= cumulVertexA.Y(); + fTPCVertex[4]->Fill(cont); + cont[0]= cumulVertexC.Y(); + fTPCVertex[5]->Fill(cont); + cont[0]= 0.5*(cumulVertexA.Y()-cumulVertexC.Y()); + fTPCVertex[6]->Fill(cont); + cont[0]= 0.5*(cumulVertexA.Y()+cumulVertexC.Y())-vertexSPD->GetY(); + fTPCVertex[7]->Fill(cont); + // + // + cont[0]= 0.5*(cumulVertexA.Z()+cumulVertexC.Z()); + fTPCVertex[8]->Fill(cont); + cont[0]= 0.5*(cumulVertexA.Z()-cumulVertexC.Z()); + fTPCVertex[9]->Fill(cont); + cont[0]= 0.5*(cumulVertexA.Z()-cumulVertexC.Z()); + fTPCVertex[10]->Fill(cont); + cont[0]= 0.5*(cumulVertexA.Z()+cumulVertexC.Z())-vertexSPD->GetZ(); + fTPCVertex[11]->Fill(cont); + // + Double_t correl[2]={0,0}; + // + correl[0]=cumulVertexC.Z(); + correl[1]=cumulVertexA.Z(); + fTPCVertexCorrelation[0]->Fill(correl); // fill A side :TPC + correl[0]=cumulVertexA.Z(); + correl[1]=cumulVertexC.Z(); + fTPCVertexCorrelation[1]->Fill(correl); // fill C side :TPC + // + correl[0]=vertexSPD->GetZ(); + correl[1]=cumulVertexA.Z()-correl[0]; + fTPCVertexCorrelation[2]->Fill(correl); // fill A side :ITS + correl[1]=cumulVertexC.Z()-correl[0]; + fTPCVertexCorrelation[3]->Fill(correl); // fill C side :ITS + correl[1]=0.5*(cumulVertexA.Z()+cumulVertexC.Z())-correl[0]; + fTPCVertexCorrelation[4]->Fill(correl); // fill C side :ITS + } + } + TTreeSRedirector *cstream = GetDebugStreamer(); + if (cstream){ + /* + TCut cutChi2= "sqrt(vA.fChi2/vA.fNDF+vC.fChi2/vC.fNDF)<10"; // chi2 Cut e.g 10 + TCut cutXY= "sqrt((vA.fP[0]-vC.fP[0])^2+(vA.fP[0]-vC.fP[1])^2)<5"; // vertex Cut + TCut cutZ= "abs(vA.fP[2]-mZA)<3&&abs(vC.fP[2]-mZC)<5"; // vertex Cut + tree->Draw("sqrt(vA.fChi2/vA.fNDF)","sqrt(vA.fChi2/vA.fNDF)<100","") + + */ + //vertexA.Print(); + //vertexC.Print(); + (*cstream)<<"vertexTPC"<< + "flags="<MakeIterator(); AliTPCcalibTime* cal = 0; - + // while ((cal = (AliTPCcalibTime*)iter->Next())) { if (!cal->InheritsFrom(AliTPCcalibTime::Class())) { Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName()); @@ -903,19 +1116,61 @@ Long64_t AliTPCcalibTime::Merge(TCollection *const li) { } } // - for (Int_t imeas=0; imeas<5; imeas++){ - if (cal->GetResHistoTPCITS(imeas) && cal->GetResHistoTPCITS(imeas)){ - fResHistoTPCITS[imeas]->Add(cal->fResHistoTPCITS[imeas]); - fResHistoTPCvertex[imeas]->Add(cal->fResHistoTPCvertex[imeas]); - fResHistoTPCTRD[imeas]->Add(cal->fResHistoTPCTRD[imeas]); + if (fTPCVertexCorrelation && cal->fTPCVertexCorrelation){ + for (Int_t imeas=0; imeas<5; imeas++){ + if (fTPCVertexCorrelation[imeas] && cal->fTPCVertexCorrelation[imeas]) fTPCVertexCorrelation[imeas]->Add(cal->fTPCVertexCorrelation[imeas]); + } + } + + if (fTPCVertex && cal->fTPCVertex) + for (Int_t imeas=0; imeas<12; imeas++){ + if (fTPCVertex[imeas] && cal->fTPCVertex[imeas]) fTPCVertex[imeas]->Add(cal->fTPCVertex[imeas]); + } + + if (fMemoryMode>0) for (Int_t imeas=0; imeas<5; imeas++){ + if (fMemoryMode>1){ + if ( cal->GetResHistoTPCCE(imeas) && cal->GetResHistoTPCCE(imeas)){ + fResHistoTPCCE[imeas]->Add(cal->fResHistoTPCCE[imeas]); + }else{ + fResHistoTPCCE[imeas]=(THnSparse*)cal->fResHistoTPCCE[imeas]->Clone(); + } } + // + if ((fMemoryMode>0) &&cal->GetResHistoTPCITS(imeas) && cal->GetResHistoTPCITS(imeas)){ + if (fMemoryMode>1 || (imeas%2)==1) fResHistoTPCITS[imeas]->Add(cal->fResHistoTPCITS[imeas]); + if (fMemoryMode>1) fResHistoTPCvertex[imeas]->Add(cal->fResHistoTPCvertex[imeas]); + } + // + if ((fMemoryMode>1) && cal->fResHistoTPCTRD[imeas]){ + if (fResHistoTPCTRD[imeas]) + fResHistoTPCTRD[imeas]->Add(cal->fResHistoTPCTRD[imeas]); + else + fResHistoTPCTRD[imeas]=(THnSparse*)cal->fResHistoTPCTRD[imeas]->Clone(); + } + // + if ((fMemoryMode>1) && cal->fResHistoTPCTOF[imeas]){ + if (fResHistoTPCTOF[imeas]) + fResHistoTPCTOF[imeas]->Add(cal->fResHistoTPCTOF[imeas]); + else + fResHistoTPCTOF[imeas]=(THnSparse*)cal->fResHistoTPCTOF[imeas]->Clone(); + } + // + if (cal->fArrayLaserA){ + fArrayLaserA->Expand(fArrayLaserA->GetEntriesFast()+cal->fArrayLaserA->GetEntriesFast()); + fArrayLaserC->Expand(fArrayLaserC->GetEntriesFast()+cal->fArrayLaserC->GetEntriesFast()); + for (Int_t ical=0; icalfArrayLaserA->GetEntriesFast(); ical++){ + if (cal->fArrayLaserA->UncheckedAt(ical)) fArrayLaserA->AddLast(cal->fArrayLaserA->UncheckedAt(ical)->Clone()); + if (cal->fArrayLaserC->UncheckedAt(ical)) fArrayLaserC->AddLast(cal->fArrayLaserC->UncheckedAt(ical)->Clone()); + } + } + } TObjArray* addArray=cal->GetHistoDrift(); if(!addArray) return 0; TIterator* iterator = addArray->MakeIterator(); iterator->Reset(); THnSparse* addHist=NULL; - while((addHist=(THnSparseF*)iterator->Next())){ + if ((fMemoryMode>1)) while((addHist=(THnSparseF*)iterator->Next())){ if(!addHist) continue; addHist->Print(); THnSparse* localHist=(THnSparseF*)fArrayDz->FindObject(addHist->GetName()); @@ -1063,10 +1318,15 @@ void AliTPCcalibTime::ProcessSame(AliESDtrack *const track, AliESDfriendTrack * // // 0. Select only track crossing the CE // 1. Cut on the track length - // 2. Refit the terack on A and C side separatelly + // 2. Refit the the track on A and C side separatelly // 3. Fill time histograms const Int_t kMinNcl=100; const Int_t kMinNclS=25; // minimul number of clusters on the sides + const Double_t pimass=TDatabasePDG::Instance()->GetParticle("pi+")->Mass(); + const Double_t kMaxDy=1; // maximal distance in y + const Double_t kMaxDsnp=0.05; // maximal distance in snp + const Double_t kMaxDtheta=0.05; // maximal distance in theta + if (!friendTrack->GetTPCOut()) return; // // 0. Select only track crossing the CE @@ -1092,17 +1352,22 @@ void AliTPCcalibTime::ProcessSame(AliESDtrack *const track, AliESDfriendTrack * Double_t xyz[3]={0,0.,0.0}; Double_t bz =0; Int_t nclIn=0,nclOut=0; - trackIn.ResetCovariance(30.); - trackOut.ResetCovariance(30.); + trackIn.ResetCovariance(1000.); + trackOut.ResetCovariance(1000.); // //2.a Refit inner // + Int_t sideIn=0; for (Int_t irow=0;irow<159;irow++) { AliTPCclusterMI *cl=seed->GetClusterPointer(irow); if (!cl) continue; if (cl->GetX()<80) continue; - if (track->GetInnerParam()->GetZ()<0 &&(cl->GetDetector()%36)<18) break; - if (track->GetInnerParam()->GetZ()>0 &&(cl->GetDetector()%36)>=18) break; + if (sideIn==0){ + if (cl->GetDetector()%36<18) sideIn=1; + if (cl->GetDetector()%36>=18) sideIn=-1; + } + if (sideIn== -1 && (cl->GetDetector()%36)<18) break; + if (sideIn== 1 &&(cl->GetDetector()%36)>=18) break; Int_t sector = cl->GetDetector(); Float_t dalpha = TMath::DegToRad()*(sector%18*20.+10.)-trackIn.GetAlpha(); if (TMath::Abs(dalpha)>0.01){ @@ -1111,20 +1376,27 @@ void AliTPCcalibTime::ProcessSame(AliESDtrack *const track, AliESDfriendTrack * Double_t r[3]={cl->GetX(),cl->GetY(),cl->GetZ()}; trackIn.GetXYZ(xyz); bz = AliTracker::GetBz(xyz); + AliTracker::PropagateTrackToBxByBz(&trackIn,r[0],1.,pimass,kFALSE); if (!trackIn.PropagateTo(r[0],bz)) break; nclIn++; trackIn.Update(&r[1],cov); } // //2.b Refit outer - // + // + Int_t sideOut=0; for (Int_t irow=159;irow>0;irow--) { AliTPCclusterMI *cl=seed->GetClusterPointer(irow); if (!cl) continue; if (cl->GetX()<80) continue; - if (cl->GetZ()*track->GetOuterParam()->GetZ()<0) break; - if (friendTrack->GetTPCOut()->GetZ()<0 &&(cl->GetDetector()%36)<18) break; - if (friendTrack->GetTPCOut()->GetZ()>0 &&(cl->GetDetector()%36)>=18) break; + if (sideOut==0){ + if (cl->GetDetector()%36<18) sideOut=1; + if (cl->GetDetector()%36>=18) sideOut=-1; + if (sideIn==sideOut) break; + } + if (sideOut== -1 && (cl->GetDetector()%36)<18) break; + if (sideOut== 1 &&(cl->GetDetector()%36)>=18) break; + // Int_t sector = cl->GetDetector(); Float_t dalpha = TMath::DegToRad()*(sector%18*20.+10.)-trackOut.GetAlpha(); if (TMath::Abs(dalpha)>0.01){ @@ -1133,6 +1405,7 @@ void AliTPCcalibTime::ProcessSame(AliESDtrack *const track, AliESDfriendTrack * Double_t r[3]={cl->GetX(),cl->GetY(),cl->GetZ()}; trackOut.GetXYZ(xyz); bz = AliTracker::GetBz(xyz); + AliTracker::PropagateTrackToBxByBz(&trackOut,r[0],1.,pimass,kFALSE); if (!trackOut.PropagateTo(r[0],bz)) break; nclOut++; trackOut.Update(&r[1],cov); @@ -1141,24 +1414,26 @@ void AliTPCcalibTime::ProcessSame(AliESDtrack *const track, AliESDfriendTrack * Double_t meanX = (trackIn.GetX()+trackOut.GetX())*0.5; trackIn.PropagateTo(meanX,bz); trackOut.PropagateTo(meanX,bz); + if (TMath::Abs(trackIn.GetY()-trackOut.GetY())>kMaxDy) return; + if (TMath::Abs(trackIn.GetSnp()-trackOut.GetSnp())>kMaxDsnp) return; + if (TMath::Abs(trackIn.GetTgl()-trackOut.GetTgl())>kMaxDtheta) return; + if (TMath::Min(nclIn,nclOut)>kMinNclS){ + FillResHistoTPCCE(&trackIn,&trackOut); + } TTreeSRedirector *cstream = GetDebugStreamer(); if (cstream){ TVectorD gxyz(3); trackIn.GetXYZ(gxyz.GetMatrixArray()); TTimeStamp tstamp(fTime); - Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0); - Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1); - Double_t vdcorr = AliTPCcalibDB::Instance()->GetVDriftCorrectionTime(tstamp,fRun,0,1); (*cstream)<<"tpctpc"<< "run="<GetTPCNcls()GetITSclusters(dummycl)IsOn(AliESDtrack::kTPCrefit)) return; - if (!friendTrack->GetITSOut()) return; if (!track->GetInnerParam()) return; if (!track->GetOuterParam()) return; if (track->GetInnerParam()->Pt()GetOuterParam()->GetZ()*track->GetInnerParam()->GetZ()<0) return; - if (TMath::Abs(track->GetInnerParam()->GetZ())GetInnerParam()->GetZ())GetInnerParam()->GetX()>90) return; // AliExternalTrackParam &pTPC=(AliExternalTrackParam &)(*(track->GetInnerParam())); - AliExternalTrackParam pITS(*(friendTrack->GetITSOut())); // ITS standalone if possible - AliExternalTrackParam pITS2(*(friendTrack->GetITSOut())); //TPC-ITS track - pITS2.Rotate(pTPC.GetAlpha()); - pITS2.PropagateTo(pTPC.GetX(),fMagF); + // + AliExternalTrackParam pITS; // ITS standalone if possible + AliExternalTrackParam pITS2; //TPC-ITS track + if (friendTrack->GetITSOut()){ + pITS2=(*(friendTrack->GetITSOut())); //TPC-ITS track - snapshot ITS out + pITS2.Rotate(pTPC.GetAlpha()); + AliTracker::PropagateTrackToBxByBz(&pITS2,pTPC.GetX(),0.1,0.1,kFALSE); + } + AliESDfriendTrack *itsfriendTrack=0; // // try to find standalone ITS track corresponing to the TPC if possible @@ -1254,20 +1530,27 @@ void AliTPCcalibTime::ProcessAlignITS(AliESDtrack *const track, AliESDfriendTra Bool_t hasAlone=kFALSE; Int_t ntracks=event->GetNumberOfTracks(); for (Int_t i=0; iGetTrack(i); - if (trackS->GetTPCNcls()>0) continue; //continue if has TPC info + AliESDtrack * trackITS = event->GetTrack(i); + if (!trackITS) continue; + if (trackITS->GetITSclusters(dummycl)GetTrack(i); if (!itsfriendTrack) continue; if (!itsfriendTrack->GetITSOut()) continue; - if (TMath::Abs(pITS2.GetTgl()-itsfriendTrack->GetITSOut()->GetTgl())> kMaxAngle) continue; + + if (TMath::Abs(pTPC.GetTgl()-itsfriendTrack->GetITSOut()->GetTgl())> kMaxAngle) continue; + if (TMath::Abs(pTPC.GetSigned1Pt()-itsfriendTrack->GetITSOut()->GetSigned1Pt())> kMax1Pt) continue; pITS=(*(itsfriendTrack->GetITSOut())); // pITS.Rotate(pTPC.GetAlpha()); - pITS.PropagateTo(pTPC.GetX(),fMagF); - if (TMath::Abs(pITS2.GetY()-pITS.GetY())> kMaxDy) continue; + AliTracker::PropagateTrackToBxByBz(&pITS,pTPC.GetX(),0.1,0.1,kFALSE); + if (TMath::Abs(pTPC.GetY()-pITS.GetY())> kMaxDy) continue; + if (TMath::Abs(pTPC.GetSnp()-pITS.GetSnp())> kMaxAngle) continue; hasAlone=kTRUE; } - if (!hasAlone) pITS=pITS2; + if (!hasAlone) { + if (track->GetITSclusters(dummycl)kMaxDy) return; if (TMath::Abs(pITS.GetSnp()-pTPC.GetSnp())>kMaxAngle) return; @@ -1275,7 +1558,7 @@ void AliTPCcalibTime::ProcessAlignITS(AliESDtrack *const track, AliESDfriendTra // // 1. Update median and RMS info // - TVectorD vecDelta(4),vecMedian(4), vecRMS(4); + TVectorD vecDelta(5),vecMedian(5), vecRMS(5); TVectorD vecDeltaN(5); Double_t sign=(pITS.GetParameter()[1]>0)? 1.:-1.; vecDelta[4]=0; @@ -1302,8 +1585,8 @@ void AliTPCcalibTime::ProcessAlignITS(AliESDtrack *const track, AliESDfriendTra // // 3. Update alignment // - Int_t htime = fTime/3600; //time in hours - if (fAlignITSTPC->GetEntries()GetEntriesFast()Expand(htime*2+20); } AliRelAlignerKalman* align = (AliRelAlignerKalman*)fAlignITSTPC->At(htime); @@ -1312,6 +1595,7 @@ void AliTPCcalibTime::ProcessAlignITS(AliESDtrack *const track, AliESDfriendTra align=new AliRelAlignerKalman(); align->SetRunNumber(fRun); (*align->GetStateCov())(6,6)=kVdErr*kVdErr; + (*align->GetStateCov())(7,7)=kT0Err*kT0Err; (*align->GetStateCov())(8,8)=kVdYErr*kVdYErr; align->SetOutRejSigma(kOutCut+kOutCut*kN); align->SetRejectOutliers(kFALSE); @@ -1321,11 +1605,16 @@ void AliTPCcalibTime::ProcessAlignITS(AliESDtrack *const track, AliESDfriendTra fAlignITSTPC->AddAt(align,htime); } align->AddTrackParams(&pITS,&pTPC); - align->SetTimeStamp(fTime); + Double_t averageTime = fTime; + if (align->GetTimeStamp()>0&&align->GetNUpdates()>0){ + averageTime=((Double_t(align->GetTimeStamp())*Double_t(align->GetNUpdates())+Double_t(fTime)))/(Double_t(align->GetNUpdates())+1.); + } + align->SetTimeStamp(Int_t(averageTime)); + align->SetRunNumber(fRun ); Float_t dca[2],cov[3]; track->GetImpactParameters(dca,cov); - if (TMath::Abs(dca[0])SetRejectOutliers(kFALSE); TTreeSRedirector *cstream = GetDebugStreamer(); if (cstream && align->GetState() && align->GetState()->GetNrows()>2 ){ - TTimeStamp tstamp(fTime); - Float_t valuePressure0 = AliTPCcalibDB::GetPressure(tstamp,fRun,0); - Float_t valuePressure1 = AliTPCcalibDB::GetPressure(tstamp,fRun,1); - Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0); - Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1); - Double_t temp0 = AliTPCcalibDB::GetTemperature(tstamp,fRun,0); - Double_t temp1 = AliTPCcalibDB::GetTemperature(tstamp,fRun,1); - TVectorD vecGoofie(20); - AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(fRun); - if (goofieArray){ - for (Int_t isensor=0; isensorNumSensors();isensor++){ - AliDCSSensor *gsensor = goofieArray->GetSensor(isensor); - if (gsensor) vecGoofie[isensor]=gsensor->GetValue(tstamp); - } - } TVectorD gpTPC(3), gdTPC(3); TVectorD gpITS(3), gdITS(3); pTPC.GetXYZ(gpTPC.GetMatrixArray()); pTPC.GetDirection(gdTPC.GetMatrixArray()); pITS.GetXYZ(gpITS.GetMatrixArray()); pITS.GetDirection(gdITS.GetMatrixArray()); - Double_t vdcorr = AliTPCcalibDB::Instance()->GetVDriftCorrectionTime(tstamp,fRun,0,1); (*cstream)<<"itstpc"<< "run="<GetTimeStamp() %d, align->GetNUpdates() %d \n", align->GetTimeStamp(), align->GetNUpdates()); + } + align->SetTimeStamp((Int_t)averageTime); + + //printf("fTime %d, averageTime %d \n", fTime, (Int_t)averageTime); + align->SetRunNumber(fRun ); - FillResHistoTPCTRD(&pTPC,&pTRD); + Float_t dca[2],cov[3]; + track->GetImpactParameters(dca,cov); + if (TMath::Abs(dca[0])GetNUpdates(); align->SetOutRejSigma(kOutCut+kOutCut*kN/Double_t(nupdates)); align->SetRejectOutliers(kFALSE); TTreeSRedirector *cstream = GetDebugStreamer(); if (cstream && align->GetState() && align->GetState()->GetNrows()>2 ){ - TTimeStamp tstamp(fTime); - Float_t valuePressure0 = AliTPCcalibDB::GetPressure(tstamp,fRun,0); - Float_t valuePressure1 = AliTPCcalibDB::GetPressure(tstamp,fRun,1); - Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0); - Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1); - Double_t temp0 = AliTPCcalibDB::GetTemperature(tstamp,fRun,0); - Double_t temp1 = AliTPCcalibDB::GetTemperature(tstamp,fRun,1); - TVectorD vecGoofie(20); - AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(fRun); - if (goofieArray){ - for (Int_t isensor=0; isensorNumSensors();isensor++){ - AliDCSSensor *gsensor = goofieArray->GetSensor(isensor); - if (gsensor) vecGoofie[isensor]=gsensor->GetValue(tstamp); - } - } TVectorD gpTPC(3), gdTPC(3); TVectorD gpTRD(3), gdTRD(3); pTPC.GetXYZ(gpTPC.GetMatrixArray()); pTPC.GetDirection(gdTPC.GetMatrixArray()); pTRD.GetXYZ(gpTRD.GetMatrixArray()); pTRD.GetDirection(gdTRD.GetMatrixArray()); - Double_t vdcorr = AliTPCcalibDB::Instance()->GetVDriftCorrectionTime(tstamp,fRun,0,1); (*cstream)<<"trdtpc"<< "run="<Mass(); Int_t npoints = points->GetNPoints(); @@ -1619,7 +1882,7 @@ void AliTPCcalibTime::ProcessAlignTOF(AliESDtrack *const track, AliESDfriendTra // if (track->GetTPCNcls()GetOuterParam()->GetZ()*track->GetInnerParam()->GetZ()<0) return; + if (friendTrack->GetTPCOut()->GetZ()*track->GetInnerParam()->GetZ()<0) return; // if (TMath::Abs(pTOF.GetY()-pTPC.GetY()) >kMaxDy) return; if (TMath::Abs(pTOF.GetSnp()-pTPC.GetSnp())>kMaxAngle) return; @@ -1627,7 +1890,7 @@ void AliTPCcalibTime::ProcessAlignTOF(AliESDtrack *const track, AliESDfriendTra // // 1. Update median and RMS info // - TVectorD vecDelta(4),vecMedian(4), vecRMS(4); + TVectorD vecDelta(5),vecMedian(5), vecRMS(5); TVectorD vecDeltaN(5); Double_t sign=(pTOF.GetParameter()[1]>0)? 1.:-1.; vecDelta[4]=0; @@ -1656,8 +1919,9 @@ void AliTPCcalibTime::ProcessAlignTOF(AliESDtrack *const track, AliESDfriendTra // // 3. Update alignment // - Int_t htime = fTime/3600; //time in hours - if (fAlignTOFTPC->GetEntries()GetEntriesFast()Expand(htime*2+20); } AliRelAlignerKalman* align = (AliRelAlignerKalman*)fAlignTOFTPC->At(htime); @@ -1666,6 +1930,7 @@ void AliTPCcalibTime::ProcessAlignTOF(AliESDtrack *const track, AliESDfriendTra align=new AliRelAlignerKalman(); align->SetRunNumber(fRun); (*align->GetStateCov())(6,6)=kVdErr*kVdErr; + (*align->GetStateCov())(7,7)=kT0Err*kT0Err; (*align->GetStateCov())(8,8)=kVdYErr*kVdYErr; align->SetOutRejSigma(kOutCut+kOutCut*kN); align->SetRejectOutliers(kFALSE); @@ -1674,7 +1939,21 @@ void AliTPCcalibTime::ProcessAlignTOF(AliESDtrack *const track, AliESDfriendTra fAlignTOFTPC->AddAt(align,htime); } align->AddTrackParams(&pTOF,&pTPC); - align->SetTimeStamp(fTime); + Float_t dca[2],cov[3]; + track->GetImpactParameters(dca,cov); + if (TMath::Abs(dca[0])SetTimeStamp(fTime); + Double_t averageTime = fTime; + if (align->GetTimeStamp()>0 && align->GetNUpdates()>0) { + averageTime = (((Double_t)fTime) + ((Double_t)align->GetTimeStamp())*align->GetNUpdates()) / (align->GetNUpdates() + 1.); + //printf("align->GetTimeStamp() %d, align->GetNUpdates() %d \n", align->GetTimeStamp(), align->GetNUpdates()); + } + align->SetTimeStamp((Int_t)averageTime); + + //printf("fTime %d, averageTime %d \n", fTime, (Int_t)averageTime); + align->SetRunNumber(fRun ); // Int_t nupdates=align->GetNUpdates(); @@ -1682,43 +1961,18 @@ void AliTPCcalibTime::ProcessAlignTOF(AliESDtrack *const track, AliESDfriendTra align->SetRejectOutliers(kFALSE); TTreeSRedirector *cstream = GetDebugStreamer(); if (cstream && align->GetState() && align->GetState()->GetNrows()>2 ){ - TTimeStamp tstamp(fTime); - Float_t valuePressure0 = AliTPCcalibDB::GetPressure(tstamp,fRun,0); - Float_t valuePressure1 = AliTPCcalibDB::GetPressure(tstamp,fRun,1); - Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,0); - Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1); - Double_t temp0 = AliTPCcalibDB::GetTemperature(tstamp,fRun,0); - Double_t temp1 = AliTPCcalibDB::GetTemperature(tstamp,fRun,1); - TVectorD vecGoofie(20); - AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(fRun); - if (goofieArray){ - for (Int_t isensor=0; isensorNumSensors();isensor++){ - AliDCSSensor *gsensor = goofieArray->GetSensor(isensor); - if (gsensor) vecGoofie[isensor]=gsensor->GetValue(tstamp); - } - } TVectorD gpTPC(3), gdTPC(3); TVectorD gpTOF(3), gdTOF(3); pTPC.GetXYZ(gpTPC.GetMatrixArray()); pTPC.GetDirection(gdTPC.GetMatrixArray()); pTOF.GetXYZ(gpTOF.GetMatrixArray()); pTOF.GetDirection(gdTOF.GetMatrixArray()); - Double_t vdcorr = AliTPCcalibDB::Instance()->GetVDriftCorrectionTime(tstamp,fRun,0,1); (*cstream)<<"toftpc"<< "run="<GetAxis(ivar2)->SetName(axisName[ivar2].Data()); - fResHistoTPCITS[ivar]->GetAxis(ivar2)->SetTitle(axisTitle[ivar2].Data()); - fResHistoTPCTRD[ivar]->GetAxis(ivar2)->SetName(axisName[ivar2].Data()); - fResHistoTPCTRD[ivar]->GetAxis(ivar2)->SetTitle(axisTitle[ivar2].Data()); - fResHistoTPCvertex[ivar]->GetAxis(ivar2)->SetName(axisName[ivar2].Data()); - fResHistoTPCvertex[ivar]->GetAxis(ivar2)->SetTitle(axisTitle[ivar2].Data()); + for (Int_t ivar2=0;ivar2<5;ivar2++){ + fResHistoTPCCE[ivar]->GetAxis(ivar2)->SetName(axisName[ivar2].Data()); + fResHistoTPCCE[ivar]->GetAxis(ivar2)->SetTitle(axisTitle[ivar2].Data()); + if (ivar2<4){ + fResHistoTPCITS[ivar]->GetAxis(ivar2)->SetName(axisName[ivar2].Data()); + fResHistoTPCITS[ivar]->GetAxis(ivar2)->SetTitle(axisTitle[ivar2].Data()); + fResHistoTPCTRD[ivar]->GetAxis(ivar2)->SetName(axisName[ivar2].Data()); + fResHistoTPCTRD[ivar]->GetAxis(ivar2)->SetTitle(axisTitle[ivar2].Data()); + fResHistoTPCvertex[ivar]->GetAxis(ivar2)->SetName(axisName[ivar2].Data()); + fResHistoTPCvertex[ivar]->GetAxis(ivar2)->SetTitle(axisTitle[ivar2].Data()); + } } } + // + // Book vertex: time histograms + // + Int_t binsVertex[2]={500, fTimeBins}; + Double_t aminVertex[2]={-5,fTimeStart}; + Double_t amaxVertex[2]={5, fTimeEnd}; + const char* hnames[12]={"TPCXAside", "TPCXCside","TPCXACdiff","TPCXAPCdiff", + "TPCYAside", "TPCYCside","TPCYACdiff","TPCYAPCdiff", + "TPCZAPCside", "TPCZAMCside","TPCZACdiff","TPCZAPCdiff"}; + const char* anames[12]={"x (cm) - A side ", "x (cm) - C side","#Delta_{x} (cm) - TPC-A-C","#Delta_{x} (cm) - TPC-Common", + "y (cm) - A side ", "y (cm) - C side","#Delta_{x} (cm) - TPC-A-C","#Delta_{y} (cm) - TPC-Common", + "z (cm)", "#Delta_{Z} (cm) A-C side","#Delta_{x} (cm) - TPC-A-C","#Delta_{Z} (cm) TPC-common"}; + for (Int_t ihis=0; ihis<12; ihis++) { + if (ihis>=8) aminVertex[0]=-20.; + if (ihis>=8) amaxVertex[0]=20.; + fTPCVertex[ihis]=new THnSparseF(hnames[ihis],hnames[ihis],2,binsVertex,aminVertex,amaxVertex); + fTPCVertex[ihis]->GetAxis(1)->SetTitle("Time"); + fTPCVertex[ihis]->GetAxis(0)->SetTitle(anames[ihis]); + } + + Int_t binsVertexC[2]={40, 300}; + Double_t aminVertexC[2]={-20,-30}; + Double_t amaxVertexC[2]={20,30}; + const char* hnamesC[5]={"TPCA_TPC","TPCC_TPC","TPCA_ITS","TPCC_ITS","TPC_ITS"}; + for (Int_t ihis=0; ihis<5; ihis++) { + fTPCVertexCorrelation[ihis]=new THnSparseF(hnamesC[ihis],hnamesC[ihis],2,binsVertexC,aminVertexC,amaxVertexC); + fTPCVertexCorrelation[ihis]->GetAxis(1)->SetTitle("z (cm)"); + fTPCVertexCorrelation[ihis]->GetAxis(0)->SetTitle("z (cm)"); + } } +void AliTPCcalibTime::FillResHistoTPCCE(const AliExternalTrackParam * pTPCIn, const AliExternalTrackParam * pTPCOut ){ + // + // fill residual histograms pTPCOut-pTPCin - trac crossing CE + // Histogram + // + if (fMemoryMode<2) return; + Double_t histoX[5]; + Double_t xyz[3]; + pTPCIn->GetXYZ(xyz); + Double_t phi= TMath::ATan2(xyz[1],xyz[0]); + histoX[1]= pTPCIn->GetTgl(); + histoX[2]= phi; + histoX[3]= pTPCIn->GetSnp(); + histoX[4]= pTPCIn->GetX(); + AliExternalTrackParam lout(*pTPCOut); + lout.Rotate(pTPCIn->GetAlpha()); + lout.PropagateTo(pTPCIn->GetX(),fMagF); + // + for (Int_t ihisto=0; ihisto<5; ihisto++){ + histoX[0]=lout.GetParameter()[ihisto]-pTPCIn->GetParameter()[ihisto]; + fResHistoTPCCE[ihisto]->Fill(histoX); + } +} void AliTPCcalibTime::FillResHistoTPCITS(const AliExternalTrackParam * pTPCIn, const AliExternalTrackParam * pITSOut ){ // // fill residual histograms pTPCIn-pITSOut @@ -1838,13 +2167,17 @@ void AliTPCcalibTime::FillResHistoTPC(const AliESDtrack * pTrack){ // fill residual histograms pTPC - vertex // Histogram is filled only for primary tracks // + if (fMemoryMode<2) return; Double_t histoX[4]; const AliExternalTrackParam * pTPCIn = pTrack->GetInnerParam(); - const AliExternalTrackParam * pTPCvertex = pTrack->GetTPCInnerParam(); + AliExternalTrackParam pTPCvertex(*(pTrack->GetInnerParam())); // AliExternalTrackParam lits(*pTrack); - lits.Rotate(pTPCvertex->GetAlpha()); - lits.PropagateTo(pTPCvertex->GetX(),fMagF); + if (TMath::Abs(pTrack->GetY())>3) return; // beam pipe + pTPCvertex.Rotate(lits.GetAlpha()); + //pTPCvertex.PropagateTo(pTPCvertex->GetX(),fMagF); + AliTracker::PropagateTrackToBxByBz(&pTPCvertex,lits.GetX(),0.1,2,kFALSE); + AliTracker::PropagateTrackToBxByBz(&pTPCvertex,lits.GetX(),0.1,0.1,kFALSE); Double_t xyz[3]; pTPCIn->GetXYZ(xyz); Double_t phi= TMath::ATan2(xyz[1],xyz[0]); @@ -1854,8 +2187,9 @@ void AliTPCcalibTime::FillResHistoTPC(const AliESDtrack * pTrack){ // Float_t dca[2], cov[3]; pTrack->GetImpactParametersTPC(dca,cov); - for (Int_t ihisto=0; ihisto<2; ihisto++){ - histoX[0]=pTPCvertex->GetParameter()[ihisto]-lits.GetParameter()[ihisto]; + for (Int_t ihisto=0; ihisto<5; ihisto++){ + histoX[0]=pTPCvertex.GetParameter()[ihisto]-lits.GetParameter()[ihisto]; + // if (ihisto<2) histoX[0]=dca[ihisto]; fResHistoTPCvertex[ihisto]->Fill(histoX); } } @@ -1865,6 +2199,7 @@ void AliTPCcalibTime::FillResHistoTPCTRD(const AliExternalTrackParam * pT // // fill resuidual histogram TPCout-TRDin // + if (fMemoryMode<2) return; Double_t histoX[4]; Double_t xyz[3]; pTPCOut->GetXYZ(xyz); @@ -1873,9 +2208,39 @@ void AliTPCcalibTime::FillResHistoTPCTRD(const AliExternalTrackParam * pT histoX[2]= phi; histoX[3]= pTPCOut->GetSnp(); // + AliExternalTrackParam ltrd(*pTRDIn); + ltrd.Rotate(pTPCOut->GetAlpha()); + // ltrd.PropagateTo(pTPCOut->GetX(),fMagF); + AliTracker::PropagateTrackToBxByBz(<rd,pTPCOut->GetX(),0.1,0.1,kFALSE); + for (Int_t ihisto=0; ihisto<5; ihisto++){ - histoX[0]=pTPCOut->GetParameter()[ihisto]-pTRDIn->GetParameter()[ihisto]; + histoX[0]=pTPCOut->GetParameter()[ihisto]-ltrd.GetParameter()[ihisto]; fResHistoTPCTRD[ihisto]->Fill(histoX); } } + +void AliTPCcalibTime::FillResHistoTPCTOF(const AliExternalTrackParam * pTPCOut, const AliExternalTrackParam * pTOFIn ){ + // + // fill resuidual histogram TPCout-TOFin + // track propagated to the TOF position + if (fMemoryMode<2) return; + Double_t histoX[4]; + Double_t xyz[3]; + + AliExternalTrackParam ltpc(*pTPCOut); + ltpc.Rotate(pTOFIn->GetAlpha()); + AliTracker::PropagateTrackToBxByBz(<pc,pTOFIn->GetX(),0.1,0.1,kFALSE); + // + ltpc.GetXYZ(xyz); + Double_t phi= TMath::ATan2(xyz[1],xyz[0]); + histoX[1]= ltpc.GetTgl(); + histoX[2]= phi; + histoX[3]= ltpc.GetSnp(); + // + for (Int_t ihisto=0; ihisto<2; ihisto++){ + histoX[0]=ltpc.GetParameter()[ihisto]-pTOFIn->GetParameter()[ihisto]; + fResHistoTPCTOF[ihisto]->Fill(histoX); + } + +}