]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCcalibSummary.cxx
Fixing Coverity 10889 (B.Hippolyte)
[u/mrichter/AliRoot.git] / TPC / AliTPCcalibSummary.cxx
index e4225674a637740f9406b720d76507d76c3b568b..cb31455c621578c446efca8b233b2db5bddbfe22 100644 (file)
@@ -3,12 +3,18 @@
 // 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;
 
 */
 
@@ -50,6 +56,8 @@ calib.Procces("run.list",run0,run1);
 #include "TGraphErrors.h"
 #include <AliCTPTimeParams.h>
 #include <AliTPCcalibSummary.h>
+#include <TStatToolkit.h>
+#include <TCut.h>
 //
 //
 //
@@ -116,6 +124,8 @@ void AliTPCcalibSummary::Process(const char * runList, Int_t first, Int_t last){
     fDButil->UpdateFromCalibDB();
     fDButil->SetReferenceRun(irun);
     fDButil->UpdateRefDataFromOCDB();
+    fCalibDB->CreateGUITree("calPads.root");
+    fDButil->CreateGUIRefTree("calPadsRef.root");
     //
     AliDCSSensorArray *arrHV=fCalibDB->GetVoltageSensors(irun);
     if (!arrHV) continue;
@@ -145,6 +155,9 @@ void AliTPCcalibSummary::ProcessRun(Int_t irun, Int_t startTime, Int_t endTime){
   fDButil->UpdateFromCalibDB();
   fDButil->SetReferenceRun(irun);
   fDButil->UpdateRefDataFromOCDB();
+  fCalibDB->CreateGUITree("calPads.root");
+  fDButil->CreateGUIRefTree("calPadsRef.root");
+
   //
   AliSplineFit *fitVdrift=0x0;
   Int_t startTimeGRP=0, stopTimeGRP=0;
@@ -160,7 +173,7 @@ void AliTPCcalibSummary::ProcessRun(Int_t irun, Int_t startTime, Int_t endTime){
   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
   //
@@ -216,6 +229,13 @@ void AliTPCcalibSummary::ProcessRun(Int_t irun, Int_t startTime, Int_t endTime){
   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;
@@ -293,7 +313,7 @@ void AliTPCcalibSummary::ProcessRun(Int_t irun, Int_t startTime, Int_t endTime){
     }
     //
     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());
@@ -359,10 +379,13 @@ void AliTPCcalibSummary::ProcessRun(Int_t irun, Int_t startTime, Int_t endTime){
     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"<<      
@@ -372,7 +395,11 @@ void AliTPCcalibSummary::ProcessRun(Int_t irun, Int_t startTime, Int_t endTime){
       "rmsNoise.="<<&vNoiseRMS<<
       "rmsNoiseSen.="<<&vNoiseRMSSenRegions<<
       "zeroNoise="<<nonMaskedZero<<
-      "nNaN="<<nNaN<<
+      "nNaN="<<nNaN<<  
+      //QA data
+      "occQA.="  << &vQaOcc  <<
+      "qQA.="    << &vQaQtot <<
+      "qmaxQA.=" << &vQaQmax <<
       //pulser data
       "timePulser.=" << &vTimePulser <<
       "nOffPulser="<<nOffChannels<<
@@ -555,9 +582,10 @@ void AliTPCcalibSummary::ProcessDriftAll(Int_t run,Int_t timeStamp){
   // 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;
@@ -575,6 +603,10 @@ void AliTPCcalibSummary::ProcessDriftAll(Int_t run,Int_t timeStamp){
   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);
@@ -594,6 +626,12 @@ void AliTPCcalibSummary::ProcessDriftAll(Int_t run,Int_t timeStamp){
     "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<<
@@ -630,13 +668,13 @@ void AliTPCcalibSummary::ProcessKryptonTime(Int_t run, Int_t timeStamp){
       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());
@@ -679,16 +717,24 @@ void AliTPCcalibSummary::ProcessGain(Int_t irun, Int_t timeStamp){
   //
   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;     
 }
 
@@ -718,7 +764,7 @@ void AliTPCcalibSummary::ProcessAlign(Int_t run, Int_t timeStamp){
       }
       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"<<
@@ -732,4 +778,309 @@ void AliTPCcalibSummary::ProcessAlign(Int_t run, Int_t timeStamp){
 }
 
 
+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.="<<&sector<<                       //sector number
+    "IIROC.="<<&currentIROC<<               // current sample at given moment
+    "IOROC.="<<&currentOROC<<               // 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.="<<&sector<<                       //sector number
+    "IIROC.="<<&currentIROC<<               // current sample at given moment
+    "IOROC.="<<&currentOROC<<               // 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());
+//   }
 
+// }