// Store results in the summary trees
// OCDB configuration
-gSystem->AddIncludePath("-I$ALICE_ROOT/TPC");
-.L $ALICE_ROOT/TPC/AliTPCcalibSummary.cxx+
+Example usage:
-AliTPCcalibSummary calib;
-calib.Procces("run.list",run0,run1);
+gSystem->Load("libANALYSIS");
+gSystem->Load("libTPCcalib");
+Int_t irun=119037;
+gROOT->LoadMacro("$ALICE_ROOT/TPC/scripts/OCDBscan/ConfigOCDB.C");
+ConfigOCDB(irun)
+
+AliTPCcalibSummary *calibSummary = new AliTPCcalibSummary;
+calibSummary->ProcessRun(irun);
+delete calibSummary;
*/
#include "TGraphErrors.h"
#include <AliCTPTimeParams.h>
#include <AliTPCcalibSummary.h>
+#include <TStatToolkit.h>
+#include <TCut.h>
//
//
//
fDButil->UpdateFromCalibDB();
fDButil->SetReferenceRun(irun);
fDButil->UpdateRefDataFromOCDB();
+ fCalibDB->CreateGUITree("calPads.root");
+ fDButil->CreateGUIRefTree("calPadsRef.root");
//
AliDCSSensorArray *arrHV=fCalibDB->GetVoltageSensors(irun);
if (!arrHV) continue;
fDButil->UpdateFromCalibDB();
fDButil->SetReferenceRun(irun);
fDButil->UpdateRefDataFromOCDB();
+ fCalibDB->CreateGUITree("calPads.root");
+ fDButil->CreateGUIRefTree("calPadsRef.root");
+
//
AliSplineFit *fitVdrift=0x0;
Int_t startTimeGRP=0, stopTimeGRP=0;
AliTPCTempMap * tempMap = new AliTPCTempMap(tempArray);
AliDCSSensorArray* goofieArray = fCalibDB->GetGoofieSensors(irun);
//
- Int_t dtime = TMath::Max((endTime-startTime)/20,10*60);
+ Int_t dtime = TMath::Max((endTime-startTime)/20,10);
//
//Goofie statistical data
//
Float_t bz=AliTPCcalibDB::GetBz(irun);
Char_t l3pol=AliTPCcalibDB::GetL3Polarity(irun);
//
+ //QA data processing
+ //
+ TVectorD vQaOcc;
+ TVectorD vQaQtot;
+ TVectorD vQaQmax;
+ fDButil->ProcessQAData(vQaOcc, vQaQtot, vQaQmax);
+ //
//calibration Pulser data processing
//
Int_t nOffChannels=0;
}
//
TVectorD voltagesIROC(36);
- TVectorD voltagesOROC(36);
+ TVectorD voltagesOROC(36);
for(Int_t j=1; j<36; j++) voltagesIROC[j-1] = fCalibDB->GetChamberHighVoltage(irun, j,itime);
for(Int_t j=36; j<72; j++) voltagesOROC[j-36] = fCalibDB->GetChamberHighVoltage(irun, j,itime);
Double_t voltIROC = TMath::Median(36, voltagesIROC.GetMatrixArray());
ProcessDrift(irun, itime);
ProcessDriftCE(irun,itime);
ProcessDriftAll(irun,itime);
- ProcessKryptonTime(irun,itime);
+ // ProcessKryptonTime(irun,itime);
ProcessCTP(irun,itime);
ProcessAlign(irun,itime);
ProcessGain(irun,itime);
+ //ProcessDriftCERef();
+ //ProcessPulserRef();
+ ProcessCurrent(irun,itime);
(*fPcstream)<<"dcs"<<
"rmsNoise.="<<&vNoiseRMS<<
"rmsNoiseSen.="<<&vNoiseRMSSenRegions<<
"zeroNoise="<<nonMaskedZero<<
- "nNaN="<<nNaN<<
+ "nNaN="<<nNaN<<
+ //QA data
+ "occQA.=" << &vQaOcc <<
+ "qQA.=" << &vQaQtot <<
+ "qmaxQA.=" << &vQaQmax <<
//pulser data
"timePulser.=" << &vTimePulser <<
"nOffPulser="<<nOffChannels<<
// test of utils
static Double_t vdriftCEA=0, vdriftCEC=0, vdriftCEM=0;
static Double_t vdriftLTA=0, vdriftLTC=0, vdriftLTM=0;
+ static Double_t vdriftLTAon=0, vdriftLTCon=0, vdriftLTMon=0;
static Double_t vdriftITS=0;
static Double_t vdriftP=0;
- static Double_t dcea=0, dcec=0, dcem=0, dla=0,dlc=0,dlm=0,dp=0;
+ static Double_t dcea=0, dcec=0, dcem=0, dla=0,dlc=0,dlm=0, dlaon=0,dlcon=0,dlmon=0, dp=0;
static Double_t dits=0;
static Double_t ltime0A;
static Double_t ltime0C;
vdriftLTC= fDButil->GetVDriftTPCLaserTracks(dlc,run,timeStamp,36000,1);
vdriftLTM= fDButil->GetVDriftTPCLaserTracks(dlm,run,timeStamp,36000,2);
//
+ vdriftLTAon= fDButil->GetVDriftTPCLaserTracksOnline(dlaon,run,timeStamp,36000,0);
+ vdriftLTCon= fDButil->GetVDriftTPCLaserTracksOnline(dlcon,run,timeStamp,36000,1);
+ vdriftLTMon= fDButil->GetVDriftTPCLaserTracksOnline(dlmon,run,timeStamp,36000,2);
+ //
vdriftITS= fDButil->GetVDriftTPCITS(dits, run,timeStamp);
//
ltime0A = fDButil->GetLaserTime0(run,timeStamp,36000,0);
"dla="<<dla<<
"dlc="<<dlc<<
"dlm="<<dlm<<
+ "vdriftLTAon="<<vdriftLTAon<< // drift velocity laser tracks and CE from online algorithm
+ "vdriftLTCon="<<vdriftLTCon<<
+ "vdriftLTMon="<<vdriftLTMon<<
+ "dlaOn="<<dlaon<<
+ "dlcOn="<<dlcon<<
+ "dlmOn="<<dlmon<<
//
//
"vdriftITS="<<vdriftITS<<
krErr[isec]=0;
gr=(TGraphErrors*)krArray->At(isec);
if (gr) {
- krMean[isec]=gr->Eval(timeStamp);
+ krMean[isec]=AliTPCcalibDButil::EvalGraphConst(gr,timeStamp);
AliTPCcalibDButil::GetNearest(gr, timeStamp,deltaT,gry);
krDist[isec]=deltaT;
}
if (72+isec<krArray->GetEntries()) {
gr=(TGraphErrors*)krArray->At(72+isec);
- if (gr) krErr[isec]=gr->Eval(timeStamp);
+ if (gr) krErr[isec]=AliTPCcalibDButil::EvalGraphConst(gr,timeStamp);
}
}
krMean[72]= TMath::Median(36,krMean.GetMatrixArray());
//
static Float_t gainCosmic = 0;
static Float_t gainMIP = 0;
+ static Float_t attachMIP = 0;
+ static Double_t dMIP=0;
+ Double_t dummy=0;
TObjArray * gainSplines = fCalibDB->GetTimeGainSplinesRun(irun);
if (gainSplines) {
TGraphErrors * graphMIP = (TGraphErrors *) gainSplines->FindObject("TGRAPHERRORS_MEAN_GAIN_BEAM_ALL");
TGraphErrors * graphCosmic = (TGraphErrors *) gainSplines->FindObject("TGRAPHERRORS_MEAN_GAIN_COSMIC_ALL");
+ TGraphErrors * graphAttach = (TGraphErrors *) gainSplines->FindObject("TGRAPHERRORS_MEAN_ATTACHMENT_BEAM_ALL");
if (graphMIP) gainMIP = AliTPCcalibDButil::EvalGraphConst(graphMIP,timeStamp);
if (graphCosmic) gainCosmic = AliTPCcalibDButil::EvalGraphConst(graphCosmic,timeStamp);
+ if (graphAttach) attachMIP = AliTPCcalibDButil::EvalGraphConst(graphAttach,timeStamp);
+ if (graphMIP) AliTPCcalibDButil::GetNearest(graphMIP, timeStamp, dMIP,dummy);
}
// time dependence of gain
(*fPcstream)<<"dcs"<<
"gainMIP="<<gainMIP<<
+ "attachMIP="<<attachMIP<<
+ "dMIP="<<dMIP<<
"gainCosmic="<<gainCosmic;
}
}
values[9*idet+ipar]=0;
errs[9*idet+ipar]=0;
- if (gr) values[9*idet+ipar]=gr->Eval(timeStamp);
+ if (gr) values[9*idet+ipar]=AliTPCcalibDButil::EvalGraphConst(gr,timeStamp);
(*fPcstream)<<"dcs"<<
Form("%s=",grName.Data())<<values[9*idet+ipar];
(*fPcstream)<<"align"<<
}
+void AliTPCcalibSummary::ProcessDriftCERef(){
+ //
+ // Get fit of residuals if CE in respect with reference
+ // data
+ //
+ static TVectorD sec(72);
+ static TVectorD vec0(72);
+ static TVectorD vecLy(72);
+ static TVectorD vecLx(72);
+ static TVectorD vecChi2(72);
+ static TVectorD vecN(72);
+ //
+ static TVectorD vecA0(72);
+ static TVectorD vecALy(72);
+ static TVectorD vecALx(72);
+ static TVectorD vecAChi2(72);
+ //
+ static TVectorD vecASide(4);
+ static TVectorD vecCSide(4);
+ static Bool_t isCalc=kFALSE;
+
+ TFile f("calPads.root");
+ TFile fref("calPadsRef.root");
+ TTree * tree = (TTree*)f.Get("calPads");
+ TTree * treeRef = (TTree*)fref.Get("calPads");
+ tree->AddFriend(treeRef,"R");
+ tree->SetAlias("inCE","((CEQmean.fElements>35)&&abs(CETmean.fElements)<1.5&&abs(CETrms.fElements/1.2-1)<0.2)"); // outlyerTrms
+ tree->SetAlias("inCER","((R.CEQmean.fElements>35)&&abs(R.CETmean.fElements)<1.5&&abs(R.CETrms.fElements/1.2-1)<0.2)"); // outlyerTrms
+ //
+ if (!isCalc){
+ // make fits only once
+ TStatToolkit toolkit;
+ Double_t chi2=0;
+ Int_t npoints=0;
+ TVectorD param;
+ TMatrixD covar;
+ tree->SetAlias("dt","CETmean.fElements-R.CETmean.fElements");
+ TCut cutAll ="inCE&&inCER&&abs(CETmean.fElements-R.CETmean.fElements)<0.5";
+ TString fstringG=""; // global part
+ fstringG+="ly.fElements++";
+ fstringG+="(lx.fElements-134.)++";
+ for (Int_t isec=0; isec<72; isec++){
+ TStatToolkit::FitPlane(tree,"0.264*dt", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
+ if (npoints<3) continue;
+ printf("Sector=%d\n",isec);
+ vec0[isec]=param[0];
+ vecLy[isec]=param[1];
+ vecLx[isec]=param[2];
+ sec[isec]=isec;
+ vecN[isec]=npoints;
+ vecChi2[isec]=TMath::Sqrt(chi2/npoints);
+
+ TStatToolkit::FitPlane(tree,"0.264*CETmean.fElements", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
+ if (npoints<3) continue;
+ printf("Sector=%d\n",isec);
+ vecA0[isec]=param[0];
+ vecALy[isec]=param[1];
+ vecALx[isec]=param[2];
+ vecAChi2[isec]=TMath::Sqrt(chi2/npoints);
+ }
+ isCalc=kTRUE;
+ //
+ TString fstringRef=""; // global fit
+ fstringRef+="gx.fElements++";
+ fstringRef+="gy.fElements++";
+ fstringRef+="lx.fElements++";
+ TStatToolkit::FitPlane(tree,"0.264*dt", fstringG.Data(),"(sector%36)<18"+cutAll, chi2,npoints,vecASide,covar,-1,0, 10000000, kFALSE);
+ TStatToolkit::FitPlane(tree,"0.264*dt", fstringG.Data(),"(sector%36)>=18"+cutAll, chi2,npoints,vecCSide,covar,-1,0, 10000000, kFALSE);
+
+ }
+ (*fPcstream)<<"dcs"<< // CE information
+ "CETSector.="<<&sec<< // sector numbers
+ "CETRefA.="<<&vecASide<< // diff to reference A side
+ "CETRefC.="<<&vecCSide<< // diff to reference C side
+ // // fit in respect to reference data
+ "CETRef0.="<<&vec0<< // offset change
+ "CETRefY.="<<&vecLy<< // slope y change - rad
+ "CETRefX.="<<&vecLx<< // slope x change - rad
+ "CETRefChi2.="<<&vecChi2<< // chi2 (rms in cm)
+ "CETRefN.="<<&vecN<< //number of accepted points
+ // // fit in respect per mean per side
+ "CET0.="<<&vecA0<< // offset change
+ "CETY.="<<&vecALy<< // slope y change - rad
+ "CETX.="<<&vecALx<< // slope x change - rad
+ "CETChi2.="<<&vecAChi2; // chi2 (rms in cm)
+}
+
+void AliTPCcalibSummary::ProcessPulserRef(){
+ //
+ // Get fit of residuals if Pulser in respect with reference
+ // data
+ //
+ static TVectorD sec(72);
+ static TVectorD vec0(72);
+ static TVectorD vecLy(72);
+ static TVectorD vecLx(72);
+ static TVectorD vecChi2(72);
+ static TVectorD vecN(72);
+ //
+ static TVectorD vecA0(72);
+ static TVectorD vecALy(72);
+ static TVectorD vecALx(72);
+ static TVectorD vecAChi2(72);
+ static Bool_t isCalc=kFALSE;
+
+ TFile f("calPads.root");
+ TFile fref("calPadsRef.root");
+ TTree * tree = (TTree*)f.Get("calPads");
+ TTree * treeRef = (TTree*)fref.Get("calPads");
+ tree->AddFriend(treeRef,"R");
+
+ tree->SetAlias("inPulser","(abs(PulserTmean.fElements-PulserTmean_Median)<1.5&&abs(PulserTrms.fElements-PulserTrms_Median)<0.2)"); // outlyerTrms
+ tree->SetAlias("inPulserR","(abs(R.PulserTmean.fElements-R.PulserTmean_Median)<1.5&&abs(R.PulserTrms.fElements-R.PulserTrms_Median)<0.2)"); // outlyerTrms
+ //
+ if (!isCalc){
+ // make fits only once
+ TStatToolkit toolkit;
+ Double_t chi2=0;
+ Int_t npoints=0;
+ TVectorD param;
+ TMatrixD covar;
+ tree->SetAlias("dt","PulserTmean.fElements-R.PulserTmean.fElements");
+ TCut cutAll ="inPulser&&inPulserR";
+ TString fstringG=""; // global part
+ fstringG+="ly.fElements++";
+ fstringG+="(lx.fElements-134.)++";
+ for (Int_t isec=0; isec<72; isec++){
+ TStatToolkit::FitPlane(tree,"dt", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
+ if (npoints<3) continue;
+ printf("Setor=%d\n",isec);
+ vec0[isec]=param[0];
+ vecLy[isec]=param[1];
+ vecLx[isec]=param[2];
+ sec[isec]=isec;
+ vecN[isec]=npoints;
+
+ TStatToolkit::FitPlane(tree,"PulserTmean.fElements", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
+ if (npoints<3) continue;
+ printf("Setor=%d\n",isec);
+ vecA0[isec]=param[0];
+ vecALy[isec]=param[1];
+ vecALx[isec]=param[2];
+ vecAChi2[isec]=TMath::Sqrt(chi2/npoints);
+ }
+
+ isCalc=kTRUE;
+ }
+ (*fPcstream)<<"dcs"<< // Pulser information
+ "PulserTSector.="<<&sec<< // sector numbers
+ // // fit in respect to reference
+ "PulserTRef0.="<<&vec0<< // offset change
+ "PulserTRefY.="<<&vecLy<< // slope y change - rad
+ "PulserTRefX.="<<&vecLx<< // slope x change - rad
+ "PulserTRefChi2.="<<&vecChi2<< // chi2 (rms in cm)
+ "PulserTRefN.="<<&vecN<< //number of accepted points
+ // // fit in respect per mean per side
+ "PulserT0.="<<&vecA0<< // offset change
+ "PulserTY.="<<&vecALy<< // slope y change - rad
+ "PulserTX.="<<&vecALx<< // slope x change - rad
+ "PulserTChi2.="<<&vecAChi2; // chi2 (rms in cm)
+}
+
+void AliTPCcalibSummary::ProcessCurrent(Int_t irun, Int_t itime){
+ //
+ // Dump current
+ //
+ //variables to export
+ //
+ static TObjArray *currentArray=new TObjArray(72); // current graphs
+ static TObjArray *currentArray2=new TObjArray(72); // current graphs to export
+ //
+ static TVectorD currentIROC(36); // current snapshots
+ static TVectorD currentOROC(36);
+ static TVectorF sector(72); //
+ static Double_t medcurIROC = 0;
+ static Double_t medcurOROC = 0;
+ //
+ static TVectorF minROC(72); // current mean +-5 minutes
+ static TVectorF maxROC(72);
+ static TVectorF meanROC(72);
+ static TVectorF medianROC(72);
+ static Double_t meanIIROC=0;
+ static Double_t meanIOROC=0;
+ static Double_t medianIIROC=0;
+ static Double_t medianIOROC=0;
+ //
+ AliDCSSensorArray* voltageArray = AliTPCcalibDB::Instance()->GetVoltageSensors(irun);
+ //
+ for(Int_t j=1; j<36; j++) currentIROC[j-1] = fCalibDB->GetChamberHighVoltage(irun, j,itime,-1,kTRUE);
+ for(Int_t j=36; j<72; j++) currentOROC[j-36] = fCalibDB->GetChamberHighVoltage(irun, j,itime,-1,kTRUE);
+ medcurIROC = TMath::Median(36, currentIROC.GetMatrixArray());
+ medcurOROC = TMath::Median(36, currentOROC.GetMatrixArray());
+
+
+ if (currentArray->At(0)==0){
+ for (Int_t isec=0; isec<72; isec++){
+ TString sensorName="";
+ const char* sideName=(isec%36<18) ? "A":"C";
+ if (isec<36){
+ //IROC
+ sensorName=Form("TPC_ANODE_I_%s%02d_IMEAS",sideName,isec%18);
+ }else{
+ //OROC
+ sensorName=Form("TPC_ANODE_O_%s%02d_0_IMEAS",sideName,isec%18);
+ }
+
+ AliDCSSensor *sensor = 0;
+ if (voltageArray) sensor= voltageArray->GetSensor(sensorName);
+ TGraph *gr=0;
+ if (!sensor) gr=new TGraph(1);
+ else{
+ if (!sensor->GetGraph()) gr=new TGraph(1);
+ else{
+ gr=sensor->GetGraph();
+ Double_t startTime=sensor->GetStartTime();
+ Double_t * time = new Double_t[gr->GetN()];
+ for (Int_t ip=0; ip<gr->GetN(); ip++){ time[ip]= (gr->GetX()[ip]*3600.)+startTime;}
+ gr=new TGraph(gr->GetN(), time, gr->GetY());
+ delete [] time;
+ }
+ }
+ gr->Sort();
+ currentArray->AddAt(gr, isec);
+ currentArray->AddAt(gr->Clone(), isec);
+ }
+ }
+
+
+ for (Int_t isec=0; isec<72; isec++){
+ sector[isec]=isec;
+ TGraph * gr = (TGraph*)currentArray->At(isec);
+ TGraph * graph2 = (TGraph*)currentArray2->At(isec);
+ Int_t firstBin= TMath::BinarySearch(gr->GetN(), gr->GetX(), itime-300.)-2;
+ Int_t lastBin= TMath::BinarySearch(gr->GetN(), gr->GetX(), itime+300.)+2;
+ if (firstBin<0) firstBin=0;
+ if (lastBin>=gr->GetN()) lastBin=gr->GetN()-1;
+ //
+ if (firstBin<lastBin){
+ //
+ minROC[isec]=TMath::MinElement(lastBin-firstBin, &(gr->GetY()[firstBin]));
+ maxROC[isec]=TMath::MaxElement(lastBin-firstBin, &(gr->GetY()[firstBin]));
+ meanROC[isec]=TMath::Mean(lastBin-firstBin, &(gr->GetY()[firstBin]));
+ medianROC[isec]=TMath::Median(lastBin-firstBin, &(gr->GetY()[firstBin]));
+ graph2 = new TGraph(lastBin-firstBin, &(gr->GetX()[firstBin]), &(gr->GetY()[firstBin]));
+ delete currentArray2->At(isec);
+ currentArray2->AddAt(graph2,isec);
+ }
+ (*fPcstream)<<"dcs"<< // current information
+ Form("current%d.=",isec)<<graph2;
+ }
+ meanIIROC=TMath::Mean(36, &(meanROC.GetMatrixArray()[0]));
+ meanIOROC=TMath::Mean(36, &(meanROC.GetMatrixArray()[36]));
+ medianIIROC=TMath::Median(36, &(meanROC.GetMatrixArray()[0]));
+ medianIOROC=TMath::Median(36, &(meanROC.GetMatrixArray()[36]));
+ //
+ (*fPcstream)<<"dcs"<< // current information
+ "isec.="<<§or<< //sector number
+ "IIROC.="<<¤tIROC<< // current sample at given moment
+ "IOROC.="<<¤tOROC<< // current sample at given moment
+ "medianIIROC="<<medcurIROC<< // median at given moment
+ "medianIOROC="<<medcurOROC<< // median at given moment
+ //
+ "minIROC.="<<&minROC<< // minimum in +-5 min
+ "maxIROC.="<<&maxROC<< // maximum in +-5 min
+ "meanIROC.="<<&meanROC<< // mean in +-5 min
+ "medianIROC.="<<&medianROC<< // median in +-5 min
+ "meanIIROC5="<<meanIIROC<< // mean current in IROC +-5 minutes
+ "meanIOROC5="<<meanIOROC<< // mean current in OROC
+ "medianIIROC5="<<medianIIROC<< // median current in IROC
+ "medianIOROC5="<<medianIOROC; // medianan current in OROC
+
+
+ (*fPcstream)<<"current"<< // current information
+ "time="<<itime<<
+ "isec.="<<§or<< //sector number
+ "IIROC.="<<¤tIROC<< // current sample at given moment
+ "IOROC.="<<¤tOROC<< // current sample at given moment
+ "medianIIROC="<<medcurIROC<< // median at given moment
+ "medianIOROC="<<medcurOROC<< // median at given moment
+ //
+ "minIROC.="<<&minROC<< // minimum in +-5 min
+ "maxIROC.="<<&maxROC<< // maximum in +-5 min
+ "meanIROC.="<<&meanROC<< // mean in +-5 min
+ "medianIROC.="<<&medianROC<< // median in +-5 min
+ "meanIIROC5="<<meanIIROC<< // mean current in IROC +-5 minutes
+ "meanIOROC5="<<meanIOROC<< // mean current in OROC
+ "medianIIROC5="<<medianIIROC<< // median current in IROC
+ "medianIOROC5="<<medianIOROC<< // medianan current in OROC
+ "\n";
+
+}
+
+
+
+
+// TCanvas * DrawCEDiff(TTree * tree){
+
+// TCanvas *canvasIO = new TCanvas("canvasCEIO","canvasCEIO");
+// canvasIO->Divide(6,6);
+// for (Int_t isec=0; isec<36; isec++){
+// canvasIO->cd(isec+1);
+// dcs->Draw(Form("CET0.fElements[%d]-CET0.fElements[%d]",isec+36,isec),Form("abs(CETRef0.fElements[%d])<0.3",isec),"");
+// printf("%d\t%f\t%f\n",isec,dcs->GetHistogram()->GetMean(),dcs->GetHistogram()->GetRMS());
+// }
+// }