X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCcalibDButil.cxx;h=37f7c9f0002dce80ba4d434e58adaba52f85e7a8;hb=56b51ad9d25579100d1371343d813fd0d1cb8305;hp=e1bc734b198a5b9cf01515a96c4a8db288655a58;hpb=a9f487a17ebb5b08d9bfeecb8e5acd8cf081d2ac;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCcalibDButil.cxx b/TPC/AliTPCcalibDButil.cxx index e1bc734b198..37f7c9f0002 100644 --- a/TPC/AliTPCcalibDButil.cxx +++ b/TPC/AliTPCcalibDButil.cxx @@ -40,6 +40,7 @@ #include #include #include +#include #include "AliTPCcalibDB.h" #include "AliTPCCalPad.h" #include "AliTPCCalROC.h" @@ -477,6 +478,90 @@ void AliTPCcalibDButil::ProcessNoiseData(TVectorD &vNoiseMean, TVectorD &vNoiseM } } +//_____________________________________________________________________________________ +void AliTPCcalibDButil::ProcessQAData(TVectorD &vQaOcc, TVectorD &vQaQtot, + TVectorD &vQaQmax) +{ + // + // process QA data + // + // vQaOcc/Qtot/Qmax contains the Mean occupancy/Qtot/Qmax for each sector + // + + + const UInt_t infoSize = 72; + //reset counters to error number + vQaOcc.ResizeTo(infoSize); + vQaOcc.Zero(); + vQaQtot.ResizeTo(infoSize); + vQaQtot.Zero(); + vQaQmax.ResizeTo(infoSize); + vQaQmax.Zero(); + //counter + //retrieve pulser and ALTRO data + + if (!fDataQA) { + + AliInfo("No QA data"); + return; + } + if (fDataQA->GetEventCounter()<=0) { + + AliInfo("No QA data"); + return; // no data processed + } + // + fDataQA->Analyse(); + + TVectorD normOcc(infoSize); + TVectorD normQ(infoSize); + + for (UInt_t isec=0;isecGetNoThreshold()->GetCalROC(isec); + AliTPCCalROC* nclusterROC = fDataQA->GetNLocalMaxima()->GetCalROC(isec); + AliTPCCalROC* qROC = fDataQA->GetMeanCharge()->GetCalROC(isec); + AliTPCCalROC* qmaxROC = fDataQA->GetMaxCharge()->GetCalROC(isec); + if (!occupancyROC) continue; + if (!nclusterROC) continue; + if (!qROC) continue; + if (!qmaxROC) continue; + + const UInt_t nchannels=occupancyROC->GetNchannels(); + + printf("Nchannels %d\n", nchannels); + + for (UInt_t ichannel=0;ichannelGetValue(ichannel); + ++normOcc[isec]; + + Float_t nClusters = nclusterROC->GetValue(ichannel); + normQ[isec] += nClusters; + vQaQtot[isec]+=nClusters*qROC->GetValue(ichannel); + vQaQmax[isec]+=nClusters*qmaxROC->GetValue(ichannel); + } + } + + //calculate mean values + for (UInt_t isec=0;isec0) vQaOcc[isec] /= normOcc[isec]; + else vQaOcc[isec] = 0; + + if (normQ[isec]>0) { + vQaQtot[isec] /= normQ[isec]; + vQaQmax[isec] /= normQ[isec]; + }else { + + vQaQtot[isec] = 0; + vQaQmax[isec] = 0; + } + } +} + //_____________________________________________________________________________________ void AliTPCcalibDButil::ProcessPulser(TVectorD &vMeanTime) { @@ -1140,11 +1225,11 @@ void AliTPCcalibDButil::UpdateRefDataFromOCDB() entry=GetRefEntry(cdbPath.Data()); if (entry){ entry->SetOwner(kTRUE); - fDataQA=dynamic_cast(entry->GetObject()); - if (!fDataQA){ + fRefDataQA=dynamic_cast(entry->GetObject()); + if (!fRefDataQA){ AliError(Form("Could not get object from entry '%s'\nPlease check!!!",entry->GetId().GetPath().Data())); } else { - fRefDataQA=(AliTPCdataQA*)fDataQA->Clone(); + fRefDataQA=(AliTPCdataQA*)fRefDataQA->Clone(); } delete entry; } @@ -1269,7 +1354,7 @@ Int_t AliTPCcalibDButil::GetCurrentReferenceRun(const char* type) const { if (!fCurrentRefMap) return -2; TObjString *str=dynamic_cast(fCurrentRefMap->GetValue(type)); if (!str) return -2; - return (const Int_t)str->GetString().Atoi(); + return (Int_t)str->GetString().Atoi(); } //_____________________________________________________________________________________ Int_t AliTPCcalibDButil::GetReferenceRun(const char* type) const{ @@ -1279,7 +1364,7 @@ Int_t AliTPCcalibDButil::GetReferenceRun(const char* type) const{ if (!fRefMap) return -1; TObjString *str=dynamic_cast(fRefMap->GetValue(type)); if (!str) return -1; - return (const Int_t)str->GetString().Atoi(); + return (Int_t)str->GetString().Atoi(); } //_____________________________________________________________________________________ AliTPCCalPad *AliTPCcalibDButil::CreateCEOutlyerMap( Int_t & noutliersCE, AliTPCCalPad * const ceOut, Float_t minSignal, Float_t cutTrmsMin, Float_t cutTrmsMax, Float_t cutMaxDistT){ @@ -1607,17 +1692,27 @@ Int_t AliTPCcalibDButil::GetNearest(TGraph *graph, Double_t xref, Double_t &dx, // // find the closest point to xref in x direction // return dx and value + dx = 0; + y = 0; + + if(!graph) return 0; + if(graph->GetN() < 1) return 0; + Int_t index=0; index = TMath::BinarySearch(graph->GetN(), graph->GetX(),xref); if (index<0) index=0; - if (index>=graph->GetN()-1) index=graph->GetN()-2; - if (xref-graph->GetX()[index]>graph->GetX()[index]-xref) index++; - dx = xref-graph->GetX()[index]; + if(graph->GetN()==1) { + dx = xref-graph->GetX()[index]; + } + else { + if (index>=graph->GetN()-1) index=graph->GetN()-2; + if (xref-graph->GetX()[index]>graph->GetX()[index]-xref) index++; + dx = xref-graph->GetX()[index]; + } y = graph->GetY()[index]; return index; } - Double_t AliTPCcalibDButil::GetTriggerOffsetTPC(Int_t run, Int_t timeStamp, Double_t deltaT, Double_t deltaTLaser, Int_t valType){ // // Get the correction of the trigger offset @@ -1721,7 +1816,7 @@ Double_t AliTPCcalibDButil::GetVDriftTPC(Double_t &dist, Int_t run, Int_t timeS AliTPCcalibDButil::GetNearest(cosmicAll,timeStamp,dist,grY); Double_t t0= AliTPCcalibDButil::GetTriggerOffsetTPC(run,timeStamp, deltaT, deltaTLaser,valType); - Double_t vcosmic= AliTPCcalibDButil::EvalGraphConst(cosmicAll, timeStamp); + Double_t vcosmic = AliTPCcalibDButil::EvalGraphConst(cosmicAll, timeStamp); if (timeStamp>cosmicAll->GetX()[cosmicAll->GetN()-1]) vcosmic=cosmicAll->GetY()[cosmicAll->GetN()-1]; if (timeStampGetX()[0]) vcosmic=cosmicAll->GetY()[0]; return vcosmic-t0; @@ -1816,7 +1911,7 @@ Bool_t AliTPCcalibDButil::CreateGUIRefTree(const char* filename) Double_t AliTPCcalibDButil::GetVDriftTPCLaserTracks(Double_t &dist, Int_t run, Int_t timeStamp, Double_t deltaT, Int_t side){ // - // Get the correction of the drift velocity using the laser tracks calbration + // Get the correction of the drift velocity using the offline laser tracks calbration // // run - run number // timeStamp - tim stamp in seconds @@ -1824,6 +1919,56 @@ Double_t AliTPCcalibDButil::GetVDriftTPCLaserTracks(Double_t &dist, Int_t run, // side - 0 - A side, 1 - C side, 2 - mean from both sides // Note in case no data form both A and C side - the value from active side used TObjArray *array =AliTPCcalibDB::Instance()->GetTimeVdriftSplineRun(run); + + return GetVDriftTPCLaserTracksCommon(dist, timeStamp, deltaT, side, array); +} + +Double_t AliTPCcalibDButil::GetVDriftTPCLaserTracksOnline(Double_t &dist, Int_t /*run*/, Int_t timeStamp, Double_t deltaT, Int_t side){ + // + // Get the correction of the drift velocity using the online laser tracks calbration + // + // run - run number + // timeStamp - tim stamp in seconds + // deltaT - integration period to calculate time0 offset + // side - 0 - A side, 1 - C side, 2 - mean from both sides + // Note in case no data form both A and C side - the value from active side used + TObjArray *array =AliTPCcalibDB::Instance()->GetCEfitsDrift(); + + Double_t dv = GetVDriftTPCLaserTracksCommon(dist, timeStamp, deltaT, side, array); + AliTPCParam *param =AliTPCcalibDB::Instance()->GetParameters(); + if (!param) return 0; + + //the drift velocity is hard wired in the AliTPCCalibCE class, since online there is no access to OCDB + dv*=param->GetDriftV()/2.61301900000000000e+06; + if (dv>1e-20) dv=1/dv-1; + else return 0; + // T/P correction + TObjArray* cearray =AliTPCcalibDB::Instance()->GetCEData(); + + AliTPCSensorTempArray *temp = (AliTPCSensorTempArray*)cearray->FindObject("TempMap"); + AliDCSSensor *press = (AliDCSSensor*)cearray->FindObject("CavernAtmosPressure"); + + Double_t corrPTA=0; + Double_t corrPTC=0; + + if (temp&&press) { + AliTPCCalibVdrift corr(temp,press,0); + corrPTA=corr.GetPTRelative(timeStamp,0); + corrPTC=corr.GetPTRelative(timeStamp,1); + } + + if (side==0) dv -= corrPTA; + if (side==1) dv -= corrPTC; + if (side==2) dv -= (corrPTA+corrPTC)/2; + + return dv; +} + +Double_t AliTPCcalibDButil::GetVDriftTPCLaserTracksCommon(Double_t &dist, Int_t timeStamp, Double_t deltaT, + Int_t side, TObjArray * const array){ + // + // common drift velocity retrieval for online and offline method + // TGraphErrors *grlaserA=0; TGraphErrors *grlaserC=0; Double_t vlaserA=0, vlaserC=0; @@ -1831,12 +1976,12 @@ Double_t AliTPCcalibDButil::GetVDriftTPCLaserTracks(Double_t &dist, Int_t run, grlaserA=(TGraphErrors*)array->FindObject("GRAPH_MEAN_DRIFT_LASER_ALL_A"); grlaserC=(TGraphErrors*)array->FindObject("GRAPH_MEAN_DRIFT_LASER_ALL_C"); Double_t deltaY; - if (grlaserA) { + if (grlaserA && grlaserA->GetN()>0) { AliTPCcalibDButil::GetNearest(grlaserA,timeStamp,dist,deltaY); if (TMath::Abs(dist)>deltaT) vlaserA= deltaY; else vlaserA = AliTPCcalibDButil::EvalGraphConst(grlaserA,timeStamp); } - if (grlaserC) { + if (grlaserC && grlaserC->GetN()>0) { AliTPCcalibDButil::GetNearest(grlaserC,timeStamp,dist,deltaY); if (TMath::Abs(dist)>deltaT) vlaserC= deltaY; else vlaserC = AliTPCcalibDButil::EvalGraphConst(grlaserC,timeStamp); @@ -1872,6 +2017,7 @@ Double_t AliTPCcalibDButil::GetVDriftTPCCE(Double_t &dist,Int_t run, Int_t time Double_t gry=0; Double_t corrA=0, corrC=0; Double_t timeA=0, timeC=0; + const Double_t kEpsilon = 0.00001; TGraph *graphA = (TGraph*)arrT->At(72); TGraph *graphC = (TGraph*)arrT->At(73); if (!graphA && !graphC) return 0.; @@ -1880,6 +2026,7 @@ Double_t AliTPCcalibDButil::GetVDriftTPCCE(Double_t &dist,Int_t run, Int_t time timeA = AliTPCcalibDButil::EvalGraphConst(graphA,timeStamp); Int_t mtime =TMath::Nint((graphA->GetX()[0]+graphA->GetX()[graphA->GetN()-1])*0.5); ltime0A = GetLaserTime0(run,mtime,TMath::Nint(deltaT),0); + if(ltime0A < kEpsilon) return 0; if (driftCalib) corrPTA = driftCalib->GetPTRelative(timeStamp,0); corrA = (param->GetZLength(36)/(timeA*param->GetTSample()*(1.-ltime0A)-param->GetL1Delay()-0*param->GetZSigma()/param->GetDriftV()))/param->GetDriftV()-1; corrA-=corrPTA; @@ -1889,7 +2036,8 @@ Double_t AliTPCcalibDButil::GetVDriftTPCCE(Double_t &dist,Int_t run, Int_t time timeC=AliTPCcalibDButil::EvalGraphConst(graphC,timeStamp); Int_t mtime=TMath::Nint((graphC->GetX()[0]+graphC->GetX()[graphC->GetN()-1])*0.5); ltime0C = GetLaserTime0(run,mtime,TMath::Nint(deltaT),0); - if (driftCalib) corrPTC = driftCalib->GetPTRelative(timeStamp,0); + if(ltime0C < kEpsilon) return 0; +if (driftCalib) corrPTC = driftCalib->GetPTRelative(timeStamp,0); corrC = (param->GetZLength(54)/(timeC*param->GetTSample()*(1.-ltime0C)-param->GetL1Delay()-0*param->GetZSigma()/param->GetDriftV()))/param->GetDriftV()-1; corrC-=corrPTC; } @@ -1911,6 +2059,7 @@ Double_t AliTPCcalibDButil::GetVDriftTPCITS(Double_t &dist, Int_t run, Int_t ti TGraphErrors *graph=0; dist=0; if (!array) return 0; + //array->ls(); graph = (TGraphErrors*)array->FindObject("ALIGN_ITSB_TPC_DRIFTVD"); if (!graph) return 0; Double_t deltaY; @@ -2211,12 +2360,39 @@ Double_t AliTPCcalibDButil::EvalGraphConst(TGraph * const graph, Double_t xref){ printf("AliTPCcalibDButil::EvalGraphConst: 0 pointer\n"); return 0; } + if (graph->GetN()<1){ - printf("AliTPCcalibDButil::EvalGraphConst: Empty graph"); + printf("AliTPCcalibDButil::EvalGraphConst: Empty graph \n"); return 0; } + + if (xrefGetX()[0]) return graph->GetY()[0]; if (xref>graph->GetX()[graph->GetN()-1]) return graph->GetY()[graph->GetN()-1]; + + // printf("graph->Eval(graph->GetX()[0]) %f, graph->Eval(xref) %f \n",graph->Eval(graph->GetX()[0]), graph->Eval(xref)); + + if(graph->GetN()==1) + return graph->Eval(graph->GetX()[0]); + + + return graph->Eval(xref); +} + +Double_t AliTPCcalibDButil::EvalGraphConst(AliSplineFit *graph, Double_t xref){ + // + // Use constant interpolation outside of range also for spline fits + // + if (!graph) { + printf("AliTPCcalibDButil::EvalGraphConst: 0 pointer\n"); + return 0; + } + if (graph->GetKnots()<1){ + printf("AliTPCcalibDButil::EvalGraphConst: Empty graph"); + return 0; + } + if (xrefGetX()[0]) return graph->GetY0()[0]; + if (xref>graph->GetX()[graph->GetKnots()-1]) return graph->GetY0()[graph->GetKnots()-1]; return graph->Eval( xref); } @@ -2374,7 +2550,8 @@ void AliTPCcalibDButil::FilterCE(Double_t deltaT, Double_t cutAbs, Double_t cutS for (Int_t i=0; i<72;i++){ TGraph *graph= (TGraph*)arrT->At(i); - if (!graph) continue; + if (!graph) continue; + graph->Sort(); if (graph->GetN()AddAt(0,i); delete graph; // delete empty graph @@ -2422,7 +2599,8 @@ void AliTPCcalibDButil::FilterCE(Double_t deltaT, Double_t cutAbs, Double_t cutS Double_t median = (isec%36<18) ? medianA: medianC; Double_t rms = (isec%36<18) ? rmsA: rmsC; Int_t naccept=0; - for (Int_t ipoint=kMinPoints-1; ipointGetN();ipoint++){ + // for (Int_t ipoint=kMinPoints-1; ipointGetN();ipoint++){ //not neccessary to remove first points + for (Int_t ipoint=0; ipointGetN();ipoint++){ if (TMath::Abs(graph->GetY()[ipoint]-median)>cutAbs) continue; if (TMath::Abs(graph->GetY()[ipoint]-median)>cutSigma*rms) continue; vecX[naccept]= graph->GetX()[ipoint]; @@ -2544,9 +2722,18 @@ void AliTPCcalibDButil::FilterTracks(Int_t run, Double_t cutSigma, TTreeSRedirec arrT->AddAt(0,i); continue; } - TGraphErrors *graph2= FilterGraphMedianErr(graph,cutSigma,medianY); - if (!graph2) { - delete graph; arrT->AddAt(0,i); continue; + TGraphErrors *graph2 = NULL; + if(graph->GetN()<10) { + graph2 = new TGraphErrors(graph->GetN(),graph->GetX(),graph->GetY(),graph->GetEX(),graph->GetEY()); + if (!graph2) { + delete graph; arrT->AddAt(0,i); continue; + } + } + else { + graph2= FilterGraphMedianErr(graph,cutSigma,medianY); + if (!graph2) { + delete graph; arrT->AddAt(0,i); continue; + } } if (graph2->GetN()<1) { delete graph; arrT->AddAt(0,i); continue; @@ -2825,7 +3012,8 @@ TMatrixD* AliTPCcalibDButil::MakeStatRelKalman(TObjArray * const array, Float_t (*valArray[ipar])[naccept]=state[ipar]; naccept++; } - if (naccept<2) return 0; + //if (naccept<2) return 0; + if (naccept<1) return 0; TMatrixD *pstat=new TMatrixD(9,3); TMatrixD &stat=*pstat; for (Int_t ipar=0; ipar<9; ipar++){ @@ -2906,16 +3094,32 @@ TObjArray *AliTPCcalibDButil::SmoothRelKalman(TObjArray * const arrayP, TObjArra if (arrayP->GetEntries()<=0) return 0; if (!arrayM) return 0; if (arrayM->GetEntries()<=0) return 0; + Int_t entries = arrayP->GetEntriesFast(); TObjArray *array = new TObjArray(arrayP->GetEntriesFast()); + for (Int_t i=0; iUncheckedAt(i); AliRelAlignerKalman * kalmanM = (AliRelAlignerKalman *) arrayM->UncheckedAt(i); if (!kalmanP) continue; if (!kalmanM) continue; - AliRelAlignerKalman *kalman = new AliRelAlignerKalman(*kalmanP); - kalman->Merge(kalmanM); + + AliRelAlignerKalman *kalman = NULL; + if(kalmanP->GetRunNumber() != 0 && kalmanM->GetRunNumber() != 0) { + kalman = new AliRelAlignerKalman(*kalmanP); + kalman->Merge(kalmanM); + } + else if (kalmanP->GetRunNumber() == 0) { + kalman = new AliRelAlignerKalman(*kalmanM); + } + else if (kalmanM->GetRunNumber() == 0) { + kalman = new AliRelAlignerKalman(*kalmanP); + } + else + continue; + array->AddAt(kalman,i); } + return array; }