/* // Make a summary information of calibration. // Store results in the summary trees // OCDB configuration Example usage: 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 #include #include #include #include #include #include #include #include "AliTPCcalibDB.h" #include "AliTPCcalibDButil.h" #include "AliTPCAltroMapping.h" #include "AliTPCExB.h" #include "AliTPCCalROC.h" #include "AliTPCCalPad.h" #include "AliTPCSensorTempArray.h" #include "AliGRPObject.h" #include "AliTPCTransform.h" #include "TFile.h" #include "TKey.h" #include "TObjArray.h" #include "TObjString.h" #include "TString.h" #include "AliTPCCalPad.h" #include "AliTPCROC.h" #include "AliTPCParam.h" #include "AliTPCCalibPulser.h" #include "AliTPCCalibPedestal.h" #include "AliTPCCalibCE.h" #include "AliTPCExBFirst.h" #include "TTreeStream.h" #include "AliTPCTempMap.h" #include "TVectorD.h" #include "TMatrixD.h" #include "AliTPCCalibRaw.h" #include "AliSplineFit.h" #include "TGraphErrors.h" #include #include #include #include // // // AliTPCcalibSummary::AliTPCcalibSummary(): TNamed(), fCalibDB(0), fDButil(0), fPcstream(0) { // // default constructor // OCDB have to be setupe before - not part of class // usualy ConfigOCDB.C macro used // fPcstream = new TTreeSRedirector("dcsTime.root"); fCalibDB = AliTPCcalibDB::Instance(); fDButil= new AliTPCcalibDButil; } AliTPCcalibSummary::~AliTPCcalibSummary(){ // // destructor - close streamer // delete fPcstream; } void AliTPCcalibSummary::Process(const char * runList, Int_t first, Int_t last){ // // runList - listOfRuns to process // first - first run to process // last - last to process // // // make list of runs // ifstream inputFile; inputFile.open("run.list"); Int_t irun=0; TArrayI runArray(100000); Int_t indexes[100000]; Int_t nruns=0; printf("Runs to process:\n"); if (!inputFile.is_open()) { printf("Problem to open file %s\n",runList); } while( inputFile.good() ) { inputFile >> irun; printf("Run \t%d\n",irun); if (irun0 && irun>last) continue; // process only subset of list runArray[nruns]=irun; nruns++; } TMath::Sort(nruns, runArray.fArray, indexes,kFALSE); Int_t startTime = 0; Int_t endTime = 0; for (Int_t run=0; runSetRun(irun); fDButil->UpdateFromCalibDB(); fDButil->SetReferenceRun(irun); fDButil->UpdateRefDataFromOCDB(); fCalibDB->CreateGUITree("calPads.root"); fDButil->CreateGUIRefTree("calPadsRef.root"); // AliDCSSensorArray *arrHV=fCalibDB->GetVoltageSensors(irun); if (!arrHV) continue; for (Int_t isenHV=0; isenHVNumSensors(); ++isenHV){ AliDCSSensor *senHV=arrHV->GetSensorNum(isenHV); if (!senHV) { printf("Not interesting OCDB info\n"); continue; } startTime=senHV->GetStartTime(); endTime =senHV->GetEndTime(); if (startTime>0&&endTime>0) break; } AliDCSSensorArray* goofieArray = fCalibDB->GetGoofieSensors(irun); if (goofieArray) fDButil->FilterGoofie(goofieArray,0.5,4.,6.85,7.05,fPcstream); // don't filter goofie for the moment ProcessRun(irun, startTime,endTime); } } void AliTPCcalibSummary::ProcessRun(Int_t irun, Int_t startTime, Int_t endTime){ // // Process run irun // fCalibDB->SetRun(irun); fDButil->UpdateFromCalibDB(); fDButil->SetReferenceRun(irun); fDButil->UpdateRefDataFromOCDB(); fCalibDB->CreateGUITree("calPads.root"); fDButil->CreateGUIRefTree("calPadsRef.root"); // AliSplineFit *fitVdrift=0x0; Int_t startTimeGRP=0, stopTimeGRP=0; if (fCalibDB->GetGRP(irun)){ startTimeGRP = AliTPCcalibDB::GetGRP(irun)->GetTimeStart(); stopTimeGRP = AliTPCcalibDB::GetGRP(irun)->GetTimeEnd(); } if (startTime==0){ startTime=startTimeGRP; endTime=stopTimeGRP; } AliTPCSensorTempArray * tempArray = fCalibDB->GetTemperatureSensor(irun); AliTPCTempMap * tempMap = new AliTPCTempMap(tempArray); AliDCSSensorArray* goofieArray = fCalibDB->GetGoofieSensors(irun); // Int_t dtime = TMath::Max((endTime-startTime)/20,10); // //Goofie statistical data // TVectorD vecEntries, vecMean, vecMedian,vecRMS; fDButil->ProcessGoofie(vecEntries ,vecMedian, vecMean, vecRMS); // //CE data processing - see ProcessCEdata function for description of the results // TVectorD fitResultsA, fitResultsC; Int_t nmaskedCE; Double_t chi2ACE=0,chi2CCE=0; // fDButil->ProcessCEdata("(sector<36)++gx++gy++lx++lx**2",fitResultsA,fitResultsC,nmaskedCE); fDButil->ProcessCEdata("(sector<36)++gx++gy++(lx-134)++(sector<36)*(lx-134)++(ly/lx)^2",fitResultsA,fitResultsC,nmaskedCE,chi2ACE,chi2CCE); TVectorD fitCEResultsA(7), fitCEResultsC(7); Int_t noutCE; Double_t chi2CEA=0,chi2CEC=0; AliTPCCalPad *time0 = fDButil->CreatePadTime0CE(fitCEResultsA, fitCEResultsC, noutCE, chi2CEA, chi2CEC); delete time0; // // TVectorD vecTEntries, vecTMean, vecTRMS, vecTMedian, vecQEntries, vecQMean, vecQRMS, vecQMedian; Float_t driftTimeA, driftTimeC; fDButil->ProcessCEgraphs(vecTEntries, vecTMean, vecTRMS, vecTMedian, vecQEntries, vecQMean, vecQRMS, vecQMedian, driftTimeA, driftTimeC ); // // // //drift velocity using tracks // // fitVdrift=fCalibDB->GetVdriftSplineFit("ALISPLINEFIT_MEAN_VDRIFT_COSMICS_ALL",irun); fitVdrift=fCalibDB->CreateVdriftSplineFit("TGRAPHERRORS_MEAN_VDRIFT_COSMICS_ALL",irun); //noise data Processing - see ProcessNoiseData function for description of the results TVectorD vNoiseMean, vNoiseMeanSenRegions, vNoiseRMS, vNoiseRMSSenRegions; Int_t nonMaskedZero=0, nNaN=0; fDButil->ProcessNoiseData(vNoiseMean, vNoiseMeanSenRegions, vNoiseRMS, vNoiseRMSSenRegions, nonMaskedZero, nNaN); // // comparisons // TVectorF pedestalDeviations; TVectorF noiseDeviations; TVectorF pulserQdeviations; Float_t varQMean; Int_t npadsOutOneTB; Int_t npadsOffAdd; fDButil->ProcessPedestalVariations(pedestalDeviations); fDButil->ProcessNoiseVariations(noiseDeviations); fDButil->ProcessPulserVariations(pulserQdeviations,varQMean,npadsOutOneTB,npadsOffAdd); // //L3 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 vTimePulser; nOffChannels=fDButil->GetNPulserOutliers(); fDButil->ProcessPulser(vTimePulser); // //ALTRO data // Int_t nMasked=0; fDButil->ProcessALTROConfig(nMasked); // //Calib RAW data // Int_t nFailL1=-1; if (fCalibDB->GetCalibRaw()) nFailL1=fCalibDB->GetCalibRaw()->GetNFailL1Phase(); // //production information // Int_t nalien=0,nRawAlien=0,nlocal=0,nRawLocal=0; //run type TObjString runType(AliTPCcalibDB::GetRunType(irun).Data()); // // // for (Int_t itime=startTime; itimeGetPressure(tstamp,irun,0); Float_t valuePressure2 = fCalibDB->GetPressure(tstamp,irun,1); Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative((UInt_t)itime,irun,0); Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative((UInt_t)itime,irun,1); //temperature fits TLinearFitter * fitter = 0; TVectorD vecTemp[10]; for (Int_t itype=0; itype<5; itype++) for (Int_t iside=0; iside<2; iside++){ fitter= tempMap->GetLinearFitter(itype,iside,tstamp); if (!fitter) continue; fitter->Eval(); fitter->GetParameters(vecTemp[itype+iside*5]); delete fitter; } // //measured skirt temperatures // TVectorD vecSkirtTempA(18); TVectorD vecSkirtTempC(18); Int_t nsenTemp=tempArray->NumSensors(); for (Int_t isenTemp=0;isenTempGetSensorNum(isenTemp); if (senTemp->GetType()!=3) continue; if (TMath::Sqrt(senTemp->GetX()*senTemp->GetX()+senTemp->GetY()*senTemp->GetY())<100) continue; //only skirt, outer FC vessel Double_t val=senTemp->GetValue(tstamp); if (senTemp->GetSide()==0) vecSkirtTempA[senTemp->GetSector()]=val; else vecSkirtTempC[senTemp->GetSector()]=val; } // //goofie data // TVectorD vecGoofie; if (goofieArray){ vecGoofie.ResizeTo(goofieArray->NumSensors()); for (Int_t isensor=0; isensorNumSensors();isensor++){ AliDCSSensor *gsensor = goofieArray->GetSensor(isensor); if (gsensor){ vecGoofie[isensor] = gsensor->GetValue(tstamp); } } } else { vecGoofie.ResizeTo(19); } // TVectorD voltagesIROC(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()); Double_t voltOROC = TMath::Median(36, voltagesOROC.GetMatrixArray()); // Float_t coverIA=AliTPCcalibDB::GetCoverVoltage(irun,0,itime); Float_t coverIC=AliTPCcalibDB::GetCoverVoltage(irun,18,itime); Float_t coverOA=AliTPCcalibDB::GetCoverVoltage(irun,36,itime); Float_t coverOC=AliTPCcalibDB::GetCoverVoltage(irun,54,itime); Float_t skirtA=AliTPCcalibDB::GetSkirtVoltage(irun,0,itime); Float_t skirtC=AliTPCcalibDB::GetSkirtVoltage(irun,18,itime); Float_t ggOffA=AliTPCcalibDB::GetGGoffsetVoltage(irun,0,itime); Float_t ggOffC=AliTPCcalibDB::GetGGoffsetVoltage(irun,18,itime); //drift velocity Float_t dvCorr=-5; if (fitVdrift) dvCorr=fitVdrift->Eval(itime); //tempMap->GetLinearFitter(0,0,itime); (*fPcstream)<<"dcs"<< "run="<GetTimeVdriftSplineRun(run); TGraphErrors *laserA[3]={0,0,0}; TGraphErrors *laserC[3]={0,0,0}; TGraphErrors *cosmicAll=0; static Double_t vlaserA[3]={0,0,0}; static Double_t vlaserC[3]={0,0,0}; static Double_t vcosmicAll=0; static Double_t vdrift1=0; vdrift1=fCalibDB->GetVDriftCorrectionTime(timeStamp,run,0,1); if (array){ laserA[0]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_DELAY_LASER_ALL_A"); laserA[1]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_DRIFT_LASER_ALL_A"); laserA[2]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_GLOBALYGRADIENT_LASER_ALL_A"); laserC[0]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_DELAY_LASER_ALL_C"); laserC[1]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_DRIFT_LASER_ALL_C"); laserC[2]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_GLOBALYGRADIENT_LASER_ALL_C"); cosmicAll =(TGraphErrors*)array->FindObject("TGRAPHERRORS_MEAN_VDRIFT_COSMICS_ALL"); } if (laserA[0]) vlaserA[0]= AliTPCcalibDButil::EvalGraphConst(laserA[0],timeStamp); if (laserA[1]) vlaserA[1]= AliTPCcalibDButil::EvalGraphConst(laserA[1],timeStamp); if (laserA[2]) vlaserA[2]= AliTPCcalibDButil::EvalGraphConst(laserA[2],timeStamp); if (laserC[0]) vlaserC[0]= AliTPCcalibDButil::EvalGraphConst(laserC[0],timeStamp); if (laserC[1]) vlaserC[1]= AliTPCcalibDButil::EvalGraphConst(laserC[1],timeStamp); if (laserC[2]) vlaserC[2]= AliTPCcalibDButil::EvalGraphConst(laserC[2],timeStamp); if (cosmicAll) vcosmicAll= AliTPCcalibDButil::EvalGraphConst(cosmicAll,timeStamp); (*fPcstream)<<"dcs"<< "vlaserA0="<GetObject(); } } static TVectorD krMean(74); static TVectorD krErr(74); static TVectorD krDist(74); TGraphErrors *gr=0; Double_t deltaT=0,gry=0; if (krArray){ for (Int_t isec=0; isec<72; isec++){ krMean[isec]=0; krDist[isec]=0; krErr[isec]=0; gr=(TGraphErrors*)krArray->At(isec); if (gr) { krMean[isec]=AliTPCcalibDButil::EvalGraphConst(gr,timeStamp); AliTPCcalibDButil::GetNearest(gr, timeStamp,deltaT,gry); krDist[isec]=deltaT; } if (72+isecGetEntries()) { gr=(TGraphErrors*)krArray->At(72+isec); if (gr) krErr[isec]=AliTPCcalibDButil::EvalGraphConst(gr,timeStamp); } } krMean[72]= TMath::Median(36,krMean.GetMatrixArray()); krMean[73]= TMath::Median(36,&(krMean.GetMatrixArray()[36])); krErr[72]= TMath::Median(36,krErr.GetMatrixArray()); krErr[73]= TMath::Median(36,&(krErr.GetMatrixArray()[36])); } (*fPcstream)<<"dcs"<< "krMean.="<<&krMean<< "krErr.="<<&krErr<< "krDist.="<<&krDist; } void AliTPCcalibSummary::ProcessCTP(Int_t irun, Int_t timeStamp){ // // // static TClonesArray *pcarray = new TClonesArray("AliCTPInputTimeParams",1); static AliCTPTimeParams *ctpParams =0; ctpParams = fCalibDB->GetCTPTimeParams(); // const TObjArray *arr = ctpParams->GetInputTimeParams(); pcarray->ExpandCreateFast(TMath::Max(arr->GetEntries(),1)); for (Int_t i=0; iGetEntries(); i++){ new ((*pcarray)[i]) AliCTPInputTimeParams(*((AliCTPInputTimeParams*)arr->At(i))); } (*fPcstream)<<"ctp"<< "run="<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="<GetTimeVdriftSplineRun(run); TGraphErrors *gr=0; for (Int_t idet=0; idet<12; idet++){ for (Int_t ipar=0; ipar<9; ipar++){ TString grName=grnames[idet]; grName+="_TPC_"; grName+=grpar[ipar]; if (array){ gr = (TGraphErrors*)array->FindObject(grName.Data()); } values[9*idet+ipar]=0; errs[9*idet+ipar]=0; if (gr) values[9*idet+ipar]=AliTPCcalibDButil::EvalGraphConst(gr,timeStamp); (*fPcstream)<<"dcs"<< Form("%s=",grName.Data())<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; ipGetN(); 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 (firstBinGetY()[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)<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()); // } // }