]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TPC/AliTPCcalibSummary.cxx
Logarithmic binning for TAxis
[u/mrichter/AliRoot.git] / TPC / AliTPCcalibSummary.cxx
1 /*
2 // Make a summary information of calibration.
3 // Store results in the summary trees
4 // OCDB configuration
5
6 Example usage:
7
8 gSystem->Load("libANALYSIS");
9 gSystem->Load("libTPCcalib");
10
11 Int_t irun=119037;
12 gROOT->LoadMacro("$ALICE_ROOT/TPC/scripts/OCDBscan/ConfigOCDB.C");
13 ConfigOCDB(irun)
14
15 AliTPCcalibSummary *calibSummary = new AliTPCcalibSummary;
16 calibSummary->ProcessRun(irun);
17 delete calibSummary;
18
19 */
20
21 #include <TROOT.h>
22 #include <iostream>
23 #include <fstream>
24 #include <stdio.h>
25 #include <AliCDBManager.h>
26 #include <AliCDBEntry.h>
27 #include <AliLog.h>
28 #include <AliMagF.h>
29 #include "AliTPCcalibDB.h"
30 #include "AliTPCcalibDButil.h"
31 #include "AliTPCAltroMapping.h"
32 #include "AliTPCExB.h"
33 #include "AliTPCCalROC.h"
34 #include "AliTPCCalPad.h"
35 #include "AliTPCSensorTempArray.h"
36 #include "AliGRPObject.h"
37 #include "AliTPCTransform.h"
38 #include "TFile.h"
39 #include "TKey.h"
40 #include "TObjArray.h"
41 #include "TObjString.h"
42 #include "TString.h"
43 #include "AliTPCCalPad.h"
44 #include "AliTPCROC.h"
45 #include "AliTPCParam.h"
46 #include "AliTPCCalibPulser.h"
47 #include "AliTPCCalibPedestal.h"
48 #include "AliTPCCalibCE.h"
49 #include "AliTPCExBFirst.h"
50 #include "TTreeStream.h"
51 #include "AliTPCTempMap.h"
52 #include "TVectorD.h"
53 #include "TMatrixD.h"
54 #include "AliTPCCalibRaw.h"
55 #include "AliSplineFit.h"
56 #include "TGraphErrors.h"
57 #include <AliCTPTimeParams.h>
58 #include <AliTPCcalibSummary.h>
59 #include <TStatToolkit.h>
60 #include <TCut.h> 
61 #include "AliTPCCalibGlobalMisalignment.h"
62 #include "AliTPCExBTwist.h"
63 #include "AliTPCComposedCorrection.h"
64 //
65 //
66 //
67 AliTPCcalibSummary::AliTPCcalibSummary():
68   TNamed(),
69   fCalibDB(0),
70   fDButil(0),
71   fPcstream(0)
72 {
73   //
74   // default constructor
75   // OCDB have to be setupe before - not part of class
76   // usualy ConfigOCDB.C macro used
77   // 
78   fPcstream = new TTreeSRedirector("dcsTime.root");
79   fCalibDB = AliTPCcalibDB::Instance();
80   fDButil= new AliTPCcalibDButil;
81 }
82
83 AliTPCcalibSummary::~AliTPCcalibSummary(){
84   //
85   // destructor  - close streamer
86   //
87   delete fPcstream;  
88 }
89
90 void AliTPCcalibSummary::Process(const char * runList, Int_t first, Int_t last){
91   //
92   // runList - listOfRuns to process
93   // first   - first run to process
94   // last    - last  to process
95   // 
96   //
97   // make list of runs
98   //
99
100   ifstream inputFile;
101   inputFile.open("run.list");
102   Int_t irun=0;
103   TArrayI runArray(100000);
104   Int_t indexes[100000];
105   Int_t nruns=0;
106   printf("Runs to process:\n");
107   if (!inputFile.is_open()) { 
108     printf("Problem to open file %s\n",runList);
109   }
110   while( inputFile.good() ) {
111     inputFile >> irun;
112     printf("Run \t%d\n",irun);
113     if (irun<first) continue;  // process only subset of list
114     if (last>0 && irun>last) continue;  // process only subset of list
115     runArray[nruns]=irun;
116     nruns++;
117   }
118
119
120   TMath::Sort(nruns, runArray.fArray, indexes,kFALSE);
121   Int_t startTime = 0;
122   Int_t endTime   = 0;
123   for (Int_t run=0; run<nruns; run++){
124     irun=runArray[indexes[run]];
125     printf("Processing run %d ...\n",irun);
126     fCalibDB->SetRun(irun);
127     fDButil->UpdateFromCalibDB();
128     fDButil->SetReferenceRun(irun);
129     fDButil->UpdateRefDataFromOCDB();
130     fCalibDB->CreateGUITree("calPads.root");
131     fDButil->CreateGUIRefTree("calPadsRef.root");
132     //
133     AliDCSSensorArray *arrHV=fCalibDB->GetVoltageSensors(irun);
134     if (!arrHV) continue;
135     for  (Int_t isenHV=0; isenHV<arrHV->NumSensors(); ++isenHV){
136       AliDCSSensor *senHV=arrHV->GetSensorNum(isenHV);
137       if (!senHV) {
138         printf("Not interesting OCDB info\n");
139         continue;
140       }
141       startTime=senHV->GetStartTime();
142       endTime  =senHV->GetEndTime();
143       if (startTime>0&&endTime>0) break;
144     }
145     AliDCSSensorArray* goofieArray = fCalibDB->GetGoofieSensors(irun);  
146     if (goofieArray) fDButil->FilterGoofie(goofieArray,0.5,4.,4,10,fPcstream);
147     // don't filter goofie for the moment
148     ProcessRun(irun, startTime,endTime);
149   }
150 }
151
152
153 void AliTPCcalibSummary::ProcessRun(Int_t irun, Int_t startTime, Int_t endTime){
154   //
155   // Process run irun
156   // 
157   fCalibDB->SetRun(irun);
158   fDButil->UpdateFromCalibDB();
159   fDButil->SetReferenceRun(irun);
160   fDButil->UpdateRefDataFromOCDB();
161   fCalibDB->CreateGUITree("calPads.root");
162   fDButil->CreateGUIRefTree("calPadsRef.root");
163
164   //
165   AliSplineFit *fitVdrift=0x0;
166   Int_t startTimeGRP=0, stopTimeGRP=0;
167   if (fCalibDB->GetGRP(irun)){
168     startTimeGRP = AliTPCcalibDB::GetGRP(irun)->GetTimeStart();
169     stopTimeGRP  = AliTPCcalibDB::GetGRP(irun)->GetTimeEnd();
170   }
171   if (startTime==0){
172     startTime=startTimeGRP;
173     endTime=stopTimeGRP;
174   }
175   AliTPCSensorTempArray * tempArray = fCalibDB->GetTemperatureSensor(irun);
176   AliTPCTempMap * tempMap = new AliTPCTempMap(tempArray);
177   AliDCSSensorArray* goofieArray = fCalibDB->GetGoofieSensors(irun);
178   //
179   Int_t dtime = TMath::Max((endTime-startTime)/20,10);
180   //
181   //Goofie statistical data
182   //
183   TVectorD vecEntries, vecMean, vecMedian,vecRMS;
184   fDButil->ProcessGoofie(vecEntries ,vecMedian, vecMean, vecRMS);
185   //
186   //CE data processing - see ProcessCEdata function for description of the results
187   //
188   TVectorD fitResultsA, fitResultsC;
189   Int_t nmaskedCE;
190   Double_t chi2ACE=0,chi2CCE=0;
191   //     fDButil->ProcessCEdata("(sector<36)++gx++gy++lx++lx**2",fitResultsA,fitResultsC,nmaskedCE);
192   fDButil->ProcessCEdata("(sector<36)++gx++gy++(lx-134)++(sector<36)*(lx-134)++(ly/lx)^2",fitResultsA,fitResultsC,nmaskedCE,chi2ACE,chi2CCE);
193
194   TVectorD fitCEResultsA(7), fitCEResultsC(7);
195   Int_t    noutCE;
196   Double_t chi2CEA=0,chi2CEC=0;
197   AliTPCCalPad *time0 = fDButil->CreatePadTime0CE(fitCEResultsA, fitCEResultsC, noutCE, chi2CEA, chi2CEC);
198   delete time0;
199   //  
200   //
201   TVectorD vecTEntries, vecTMean, vecTRMS, vecTMedian, vecQEntries, vecQMean, vecQRMS, vecQMedian;
202   Float_t driftTimeA, driftTimeC;
203   fDButil->ProcessCEgraphs(vecTEntries, vecTMean, vecTRMS, vecTMedian,
204                           vecQEntries, vecQMean, vecQRMS, vecQMedian,
205                           driftTimeA, driftTimeC );
206   //
207   //
208   //
209   //drift velocity using tracks
210   //
211   //     fitVdrift=fCalibDB->GetVdriftSplineFit("ALISPLINEFIT_MEAN_VDRIFT_COSMICS_ALL",irun);
212   fitVdrift=fCalibDB->CreateVdriftSplineFit("TGRAPHERRORS_MEAN_VDRIFT_COSMICS_ALL",irun);
213   //noise data Processing - see ProcessNoiseData function for description of the results
214   TVectorD vNoiseMean, vNoiseMeanSenRegions, vNoiseRMS, vNoiseRMSSenRegions;
215   Int_t nonMaskedZero=0, nNaN=0;
216   fDButil->ProcessNoiseData(vNoiseMean, vNoiseMeanSenRegions, vNoiseRMS, vNoiseRMSSenRegions, nonMaskedZero, nNaN);
217   //
218   // comparisons
219   //
220   TVectorF pedestalDeviations;
221   TVectorF noiseDeviations;
222   TVectorF pulserQdeviations;
223   Float_t varQMean;
224   Int_t npadsOutOneTB;
225   Int_t npadsOffAdd;
226   fDButil->ProcessPedestalVariations(pedestalDeviations);
227   fDButil->ProcessNoiseVariations(noiseDeviations);
228   fDButil->ProcessPulserVariations(pulserQdeviations,varQMean,npadsOutOneTB,npadsOffAdd);
229   //
230   //L3 data 
231   //
232   Float_t bz=AliTPCcalibDB::GetBz(irun);
233   Char_t  l3pol=AliTPCcalibDB::GetL3Polarity(irun);
234   //
235   //QA data processing
236   //
237   TVectorD vQaOcc;
238   TVectorD vQaQtot;
239   TVectorD vQaQmax;
240   fDButil->ProcessQAData(vQaOcc, vQaQtot, vQaQmax);
241   //
242   //calibration Pulser data processing
243   //
244   Int_t nOffChannels=0;
245   TVectorD vTimePulser;
246   nOffChannels=fDButil->GetNPulserOutliers();
247   fDButil->ProcessPulser(vTimePulser);
248   //
249   //ALTRO data
250   //
251   Int_t nMasked=0;
252   fDButil->ProcessALTROConfig(nMasked);
253   //
254   //Calib RAW data
255   //
256   Int_t nFailL1=-1;
257   if (fCalibDB->GetCalibRaw()) nFailL1=fCalibDB->GetCalibRaw()->GetNFailL1Phase();
258   //
259   //production information
260   //
261   Int_t nalien=0,nRawAlien=0,nlocal=0,nRawLocal=0;
262   //run type
263   TObjString runType(AliTPCcalibDB::GetRunType(irun).Data());
264   //
265   //
266   //
267   
268   for (Int_t itime=startTime; itime<endTime; itime+=dtime){
269     //
270     TTimeStamp tstamp(itime);
271     Float_t valuePressure  = fCalibDB->GetPressure(tstamp,irun,0);
272     Float_t valuePressure2 = fCalibDB->GetPressure(tstamp,irun,1);
273     Double_t ptrelative0 = AliTPCcalibDB::GetPTRelative((UInt_t)itime,irun,0);
274     Double_t ptrelative1 = AliTPCcalibDB::GetPTRelative((UInt_t)itime,irun,1);
275     //temperature fits
276     TLinearFitter * fitter = 0;
277     TVectorD vecTemp[10];
278     for (Int_t itype=0; itype<5; itype++)
279       for (Int_t iside=0; iside<2; iside++){
280         fitter= tempMap->GetLinearFitter(itype,iside,tstamp);     
281         if (!fitter) continue;
282         fitter->Eval();
283         fitter->GetParameters(vecTemp[itype+iside*5]);
284         delete fitter;
285       }
286     //
287     //measured skirt temperatures
288     //
289     TVectorD vecSkirtTempA(18);
290     TVectorD vecSkirtTempC(18);
291     Int_t nsenTemp=tempArray->NumSensors();
292     for (Int_t isenTemp=0;isenTemp<nsenTemp;++isenTemp){
293       AliTPCSensorTemp *senTemp=(AliTPCSensorTemp*)tempArray->GetSensorNum(isenTemp);
294       if (senTemp->GetType()!=3) continue;
295       if (TMath::Sqrt(senTemp->GetX()*senTemp->GetX()+senTemp->GetY()*senTemp->GetY())<100) continue; //only skirt, outer FC vessel
296       Double_t val=senTemp->GetValue(tstamp);
297       if (senTemp->GetSide()==0)
298         vecSkirtTempA[senTemp->GetSector()]=val;
299       else
300         vecSkirtTempC[senTemp->GetSector()]=val;
301     }
302     //
303     //goofie data
304     //
305     TVectorD vecGoofie; 
306     if (goofieArray){
307       vecGoofie.ResizeTo(goofieArray->NumSensors());
308       for (Int_t isensor=0; isensor<goofieArray->NumSensors();isensor++){
309         AliDCSSensor *gsensor = goofieArray->GetSensor(isensor);
310         if (gsensor){
311           vecGoofie[isensor] = gsensor->GetValue(tstamp);
312         }
313       }
314     } else {
315       vecGoofie.ResizeTo(19);
316     }
317     //
318     TVectorD voltagesIROC(36);
319     TVectorD voltagesOROC(36); 
320       for(Int_t j=0; j<36; j++) voltagesIROC[j] = fCalibDB->GetChamberHighVoltage(irun, j,itime); 
321     for(Int_t j=36; j<72; j++) voltagesOROC[j-36] = fCalibDB->GetChamberHighVoltage(irun, j,itime);
322     Double_t voltIROC = TMath::Median(36, voltagesIROC.GetMatrixArray());
323     Double_t voltOROC = TMath::Median(36, voltagesOROC.GetMatrixArray());
324     //
325     Float_t  coverIA=AliTPCcalibDB::GetCoverVoltage(irun,0,itime);
326     Float_t  coverIC=AliTPCcalibDB::GetCoverVoltage(irun,18,itime);
327     Float_t  coverOA=AliTPCcalibDB::GetCoverVoltage(irun,36,itime);
328     Float_t  coverOC=AliTPCcalibDB::GetCoverVoltage(irun,54,itime);
329     Float_t  skirtA=AliTPCcalibDB::GetSkirtVoltage(irun,0,itime);
330     Float_t  skirtC=AliTPCcalibDB::GetSkirtVoltage(irun,18,itime);
331     Float_t  ggOffA=AliTPCcalibDB::GetGGoffsetVoltage(irun,0,itime);
332     Float_t  ggOffC=AliTPCcalibDB::GetGGoffsetVoltage(irun,18,itime);
333     //drift velocity
334     Float_t dvCorr=-5;
335     if (fitVdrift) dvCorr=fitVdrift->Eval(itime);
336     
337     //tempMap->GetLinearFitter(0,0,itime);
338     (*fPcstream)<<"dcs"<<
339       "run="<<irun<<
340       "time="<<itime<<
341       "startTimeGRP="<<startTimeGRP<<
342       "stopTimeGRP="<<stopTimeGRP<<
343       //run type
344       "runType.="<<&runType<<
345       // voltage setting
346       "VIROC.="<<&voltagesIROC<<
347       "VOROC.="<<&voltagesOROC<<
348       "medianVIROC="<<voltIROC<<
349       "medianVOROC="<<voltOROC<<
350       "coverIA=" << coverIA <<
351       "coverIC=" << coverIC <<
352       "coverOA=" << coverOA <<
353       "coverOC=" << coverOC <<
354       "skirtA=" << skirtA <<
355       "skirtC=" << skirtC <<
356       "ggOffA=" << ggOffA <<
357       "ggOffC=" << ggOffC <<
358       //
359       "ptrel0="<<ptrelative0<<  // deltaTP/TP  - A side
360       "ptrel1="<<ptrelative1<<  // deltaTP/TPC - C side
361       "goofie.="<<&vecGoofie<<
362       "goofieE.="<<&vecEntries<<
363       "goofieMean.="<<&vecMean<<
364       "goofieMedian.="<<&vecMedian<<
365       "goofieRMS.="<<&vecRMS<<
366       //
367       "press="<<valuePressure<<
368       "press2="<<valuePressure2<<
369       "temp00.="<<&vecTemp[0]<<
370       "temp10.="<<&vecTemp[1]<<
371       "temp20.="<<&vecTemp[2]<<
372       "temp30.="<<&vecTemp[3]<<
373       "temp40.="<<&vecTemp[4]<<
374       "temp01.="<<&vecTemp[5]<<
375       "temp11.="<<&vecTemp[6]<<
376       "temp21.="<<&vecTemp[7]<<
377       "temp31.="<<&vecTemp[8]<<
378       "temp41.="<<&vecTemp[9]<<
379       "tempSkirtA.="<<&vecSkirtTempA<<
380       "tempSkirtC.="<<&vecSkirtTempC;
381
382     ProcessDrift(irun, itime);
383     ProcessDriftCE(irun,itime);
384     ProcessDriftAll(irun,itime);
385     //    ProcessKryptonTime(irun,itime);
386     ProcessCTP(irun,itime);
387     ProcessAlign(irun,itime);
388     ProcessGain(irun,itime);
389     //ProcessDriftCERef();
390     //ProcessPulserRef();
391     ProcessCurrent(irun,itime);
392
393
394     (*fPcstream)<<"dcs"<<       
395       //noise data
396       "meanNoise.="<<&vNoiseMean<<
397       "meanNoiseSen.="<<&vNoiseMeanSenRegions<<
398       "rmsNoise.="<<&vNoiseRMS<<
399       "rmsNoiseSen.="<<&vNoiseRMSSenRegions<<
400       "zeroNoise="<<nonMaskedZero<<
401       "nNaN="<<nNaN<<  
402       //QA data
403       "occQA.="  << &vQaOcc  <<
404       "qQA.="    << &vQaQtot <<
405       "qmaxQA.=" << &vQaQmax <<
406       //pulser data
407       "timePulser.=" << &vTimePulser <<
408       "nOffPulser="<<nOffChannels<<
409       //altro data
410       "nMasked="<<nMasked<<
411       //ce data -Jens version
412       "CEfitA.="<<&fitResultsA<<
413       "CEfitC.="<<&fitResultsC<<
414       "nmaskedCE="<<nmaskedCE<<
415       "chi2ACE="<<chi2ACE<<
416       "chi2CCE="<<chi2CCE<<
417       //ce data new - MI version
418       "CEfitAMI.="<<&fitCEResultsA<<
419       "CEfitCMI.="<<&fitCEResultsC<<
420       "chi2CEA="<<chi2CEA<<
421       "chi2CEC="<<chi2CEC<<
422       //
423       //ce graph data
424       "CEgrTEntries.="<<&vecTEntries<<
425       "CEgrTMean.="<<&vecTMean<<
426       "CEgrTRMS.="<<&vecTRMS<<
427       "CEgrTMedian.="<<&vecTMedian<<
428       "CEgrQEntries.="<<&vecQEntries<<
429       "CEgrQMean.="<<&vecQMean<<
430       "CEgrQRMS.="<<&vecQRMS<<
431       "CEgrQMedian.="<<&vecQMedian<<
432       "CEgrDriftA="<<driftTimeA<<
433       "CEgrDriftC="<<driftTimeC<<
434       //calib raw data
435       "nFailL1="<<nFailL1<<
436       // b field
437       "Bz="<< bz <<
438       "L3polarity="<<l3pol<<
439       // production information
440       "nalien="<<nalien<<
441       "nRawAlien="<<nRawAlien<<
442       "nlocal="<<nlocal<<
443       "nRawLocal="<<nRawLocal<<
444       //comparisons with ref data
445       "pedestalDeviations.="<<&pedestalDeviations<<
446       "noiseDeviations.="<<&noiseDeviations<<
447       "pulserQdeviations.="<<&pulserQdeviations<<
448       //         "pulserVarQMean="<<varQMean<<
449       "pulserNpadsOutOneTB="<<npadsOutOneTB<<
450       "pulserNpadsOffAdd="<<npadsOffAdd<<
451       "driftCorrCosmAll="<<dvCorr<<
452       "\n";
453   }//end run loop
454 }
455
456
457
458
459
460
461 void AliTPCcalibSummary::ProcessDrift(Int_t run, Int_t timeStamp){
462   //
463   // dump drift calibration data to the tree
464   //
465   TObjArray *array =fCalibDB->GetTimeVdriftSplineRun(run);
466   TGraphErrors *laserA[3]={0,0,0};
467   TGraphErrors *laserC[3]={0,0,0};
468   TGraphErrors *cosmicAll=0;
469   static Double_t     vlaserA[3]={0,0,0};
470   static Double_t     vlaserC[3]={0,0,0};
471   static Double_t     vcosmicAll=0;
472   static Double_t     vdrift1=0;
473   vdrift1=fCalibDB->GetVDriftCorrectionTime(timeStamp,run,0,1);
474
475   if (array){
476     laserA[0]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_DELAY_LASER_ALL_A");
477     laserA[1]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_DRIFT_LASER_ALL_A");
478     laserA[2]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_GLOBALYGRADIENT_LASER_ALL_A");
479     laserC[0]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_DELAY_LASER_ALL_C");
480     laserC[1]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_DRIFT_LASER_ALL_C");
481     laserC[2]=(TGraphErrors*)array->FindObject("GRAPH_MEAN_GLOBALYGRADIENT_LASER_ALL_C");
482     cosmicAll =(TGraphErrors*)array->FindObject("TGRAPHERRORS_MEAN_VDRIFT_COSMICS_ALL");
483   }
484   if (laserA[0]) vlaserA[0]= AliTPCcalibDButil::EvalGraphConst(laserA[0],timeStamp);
485   if (laserA[1]) vlaserA[1]= AliTPCcalibDButil::EvalGraphConst(laserA[1],timeStamp);
486   if (laserA[2]) vlaserA[2]= AliTPCcalibDButil::EvalGraphConst(laserA[2],timeStamp);
487   if (laserC[0]) vlaserC[0]= AliTPCcalibDButil::EvalGraphConst(laserC[0],timeStamp);
488   if (laserC[1]) vlaserC[1]= AliTPCcalibDButil::EvalGraphConst(laserC[1],timeStamp);
489   if (laserC[2]) vlaserC[2]= AliTPCcalibDButil::EvalGraphConst(laserC[2],timeStamp);
490   if (cosmicAll) vcosmicAll= AliTPCcalibDButil::EvalGraphConst(cosmicAll,timeStamp); 
491   (*fPcstream)<<"dcs"<<
492     "vlaserA0="<<vlaserA[0]<<
493     "vlaserA1="<<vlaserA[1]<<
494     "vlaserA2="<<vlaserA[2]<<
495     "vlaserC0="<<vlaserC[0]<<
496     "vlaserC1="<<vlaserC[1]<<
497     "vlaserC2="<<vlaserC[2]<<
498     "vcosmicAll="<<vcosmicAll<<
499     "vdrift1="<<vdrift1;
500
501   //
502   // define distance to measurement
503   //
504   static Double_t dlaserA=0; 
505   static Double_t dlaserC=0; 
506   static Double_t dcosmic=0; 
507   static Double_t slaserA=0; 
508   static Double_t slaserC=0; 
509   static Double_t scosmic=0; 
510   static Double_t  vclaserA[3]={0,0,0};
511   static Double_t  vclaserC[3]={0,0,0};
512   static Double_t  vccosmicAll=0;
513   for (Int_t i=0;i<3;i++){
514     if (laserA[i]) AliTPCcalibDButil::GetNearest(laserA[i],timeStamp,dlaserA,vclaserA[i]);
515     if (laserC[i]) AliTPCcalibDButil::GetNearest(laserC[i],timeStamp,dlaserC,vclaserC[i]);
516   }  
517   if (cosmicAll) AliTPCcalibDButil::GetNearest(cosmicAll,timeStamp,dcosmic,vccosmicAll);
518   (*fPcstream)<<"dcs"<<
519     "vclaserA0="<<vclaserA[0]<<
520     "vclaserA1="<<vclaserA[1]<<
521     "vclaserA2="<<vclaserA[2]<<
522     "vclaserC0="<<vclaserC[0]<<
523     "vclaserC1="<<vclaserC[1]<<
524     "vclaserC2="<<vclaserC[2]<<
525     "vccosmicAll="<<vccosmicAll<<
526     "dlaserA="<<dlaserA<<
527     "dlaserC="<<dlaserC<<
528     "dcosmic="<<dcosmic<<
529     "slaserA="<<slaserA<<
530     "slaserC="<<slaserC<<
531     "scosmic="<<scosmic;
532
533   static TGeoMatrix * matrixAlign=0;
534   static Double_t twistX=0;
535   static Double_t twistY=0;
536   if (matrixAlign==0){
537     AliTPCComposedCorrection * corr =  (AliTPCComposedCorrection *)array->FindObject("FitCorrectionTime");
538     if (!corr) {
539       matrixAlign=new TGeoHMatrix;
540       
541     }
542     if (corr){
543        AliTPCCalibGlobalMisalignment *align = (AliTPCCalibGlobalMisalignment*)corr->GetCorrections()->FindObject("FitAlignTime");
544        AliTPCExBTwist *twist  = (AliTPCExBTwist*)corr->GetCorrections()->FindObject("FitExBTwistTime");
545        if (twist){
546          twistX=twist->GetXTwist();
547          twistY=twist->GetYTwist();
548          //delete twist;
549        }
550        if (align && align->GetAlignGlobal()){
551          matrixAlign =  (TGeoMatrix*) (align->GetAlignGlobal()->Clone());        
552          //delete align;
553        }
554     }    
555   }
556   (*fPcstream)<<"dcs"<<
557     "alignTime.="<<matrixAlign<<
558     "twistX="<<twistX<<
559     "twistY="<<twistY;
560 }
561
562 void AliTPCcalibSummary::ProcessDriftCE(Int_t run,Int_t timeStamp){
563   //
564   // dump drift calibration data CE
565   //
566   TObjArray *arrT=fCalibDB->GetCErocTtime();
567   AliTPCParam *param=fCalibDB->GetParameters();
568   static TVectorD tdriftCE(74);
569   static TVectorD tndriftCE(74);
570   static TVectorD vdriftCE(74);
571   static TVectorD tcdriftCE(74);
572   static TVectorD tddriftCE(74);
573   static Double_t ltime0A;
574   static Double_t ltime0C;
575   //
576   //
577   //
578   ltime0A  = fDButil->GetLaserTime0(run,timeStamp,36000,0);
579   ltime0C  = fDButil->GetLaserTime0(run,timeStamp,36000,1);
580   //
581   for (Int_t i=0; i<arrT->GetEntries();i++){
582     tdriftCE[i]=0;
583     vdriftCE[i]=0;
584     TGraph *graph = (TGraph*)arrT->At(i);
585     if (!graph) continue;
586     tdriftCE[i]=AliTPCcalibDButil::EvalGraphConst(graph,timeStamp);
587     Double_t deltaT,gry;
588     AliTPCcalibDButil::GetNearest(graph,timeStamp,deltaT,gry);
589     tndriftCE[i]=graph->GetN();
590     tcdriftCE[i]=gry;          
591     tddriftCE[i]=deltaT;               
592     if (i%36<18){
593       vdriftCE[i] =(param->GetZLength(i)/(tdriftCE[i]*param->GetTSample()*(1.-ltime0A)-param->GetL1Delay()))/param->GetDriftV();
594     }else{
595       vdriftCE[i] =(param->GetZLength(i)/(tdriftCE[i]*param->GetTSample()*(1.-ltime0A)-param->GetL1Delay()))/param->GetDriftV();
596     }
597   }
598   // export values
599   (*fPcstream)<<"dcs"<<  
600     "tdriftCE.="<<&tdriftCE<<    // arrival time 
601     "vdriftCE.="<<&vdriftCE<<    // derived drift velocity per chamber 
602     "tndriftCE.="<<&tndriftCE<<  // number of points (chambers)
603     "tcdriftCE.="<<&tcdriftCE<<  // constant evaluation - nearest point used
604     "tddriftCE.="<<&tddriftCE<<  // distance to closest measuement
605     "ltime0A="<<ltime0A<<        // laser offset expected in reconstruction
606     "ltime0C="<<ltime0C;         // laser offset expected in reconstruction 
607    }
608
609
610 void AliTPCcalibSummary::ProcessDriftAll(Int_t run,Int_t timeStamp){
611   //
612   // dump drift calibration data  all calibrations form DB util
613   // test of utils
614   static Double_t vdriftCEA=0, vdriftCEC=0, vdriftCEM=0;
615   static Double_t vdriftLTA=0, vdriftLTC=0, vdriftLTM=0;
616   static Double_t vdriftLTAon=0, vdriftLTCon=0, vdriftLTMon=0;
617   static Double_t vdriftITS=0;
618   static Double_t vdriftP=0;
619   static Double_t dcea=0, dcec=0, dcem=0,  dla=0,dlc=0,dlm=0, dlaon=0,dlcon=0,dlmon=0, dp=0;
620   static Double_t dits=0;
621   static Double_t ltime0A;
622   static Double_t ltime0C;
623   static Double_t ctime0;
624   static Double_t vdrift1=0;
625   vdrift1= fCalibDB->GetVDriftCorrectionTime(timeStamp,run,0,1);
626   vdriftP = fDButil->GetVDriftTPC(dp, run, timeStamp, 86400, 3600,0);
627   ctime0 = AliTPCcalibDButil::GetTriggerOffsetTPC(run,timeStamp, 36000, 3600,0);
628   //
629   vdriftCEA= fDButil->GetVDriftTPCCE(dcea,run,timeStamp,36000,0);
630   vdriftCEC= fDButil->GetVDriftTPCCE(dcec,run,timeStamp,36000,1);
631   vdriftCEM= fDButil->GetVDriftTPCCE(dcem,run,timeStamp,36000,2);
632   //
633   vdriftLTA= fDButil->GetVDriftTPCLaserTracks(dla,run,timeStamp,36000,0);
634   vdriftLTC= fDButil->GetVDriftTPCLaserTracks(dlc,run,timeStamp,36000,1);
635   vdriftLTM= fDButil->GetVDriftTPCLaserTracks(dlm,run,timeStamp,36000,2);
636   //
637   vdriftLTAon= fDButil->GetVDriftTPCLaserTracksOnline(dlaon,run,timeStamp,36000,0);
638   vdriftLTCon= fDButil->GetVDriftTPCLaserTracksOnline(dlcon,run,timeStamp,36000,1);
639   vdriftLTMon= fDButil->GetVDriftTPCLaserTracksOnline(dlmon,run,timeStamp,36000,2);
640   //
641   vdriftITS= fDButil->GetVDriftTPCITS(dits, run,timeStamp);
642   //
643   ltime0A  = fDButil->GetLaserTime0(run,timeStamp,36000,0);
644   ltime0C  = fDButil->GetLaserTime0(run,timeStamp,36000,1);
645
646   (*fPcstream)<<"dcs"<<  
647     //
648     "vdriftCEA="<<vdriftCEA<<   // drift velocity CE
649     "vdriftCEC="<<vdriftCEC<<
650     "vdriftCEM="<<vdriftCEM<<
651     "dcea="<<dcea<<
652     "dcec="<<dcec<<
653     "dcem="<<dcem<<
654     "vdriftLTA="<<vdriftLTA<<   // drift velocity laser tracks
655     "vdriftLTC="<<vdriftLTC<<
656     "vdriftLTM="<<vdriftLTM<<
657     "dla="<<dla<<
658     "dlc="<<dlc<<
659     "dlm="<<dlm<<
660     "vdriftLTAon="<<vdriftLTAon<<   // drift velocity laser tracks and CE from online algorithm
661     "vdriftLTCon="<<vdriftLTCon<<
662     "vdriftLTMon="<<vdriftLTMon<<
663     "dlaOn="<<dlaon<<
664     "dlcOn="<<dlcon<<
665     "dlmOn="<<dlmon<<
666     //
667     //
668     "vdriftITS="<<vdriftITS<<
669     "dits="<<dits<<
670     "ctime0="<<ctime0<<
671     "vdriftP="<<vdriftP<<       // drift velocity comsic 
672     "dp="<<dp<<
673     "vdrift1="<<vdrift1;        // combined drift velocity
674
675 }
676
677
678
679 void AliTPCcalibSummary::ProcessKryptonTime(Int_t run, Int_t timeStamp){
680   //
681   // Dumping  krypton calibration results
682   //
683   static TObjArray * krArray=0;
684   if (!krArray) {
685     AliCDBEntry* entry = AliCDBManager::Instance()->Get("TPC/Calib/TimeGainKrypton", run);
686     if (entry){
687       krArray = (TObjArray*)entry->GetObject();
688     }
689   }
690   static TVectorD krMean(74);
691   static TVectorD krErr(74);
692   static TVectorD krDist(74);
693   TGraphErrors *gr=0;
694   Double_t deltaT=0,gry=0;
695   if (krArray){
696     for (Int_t isec=0; isec<72; isec++){
697       krMean[isec]=0;
698       krDist[isec]=0;
699       krErr[isec]=0;
700       gr=(TGraphErrors*)krArray->At(isec);
701       if (gr) {
702         krMean[isec]=AliTPCcalibDButil::EvalGraphConst(gr,timeStamp);
703         AliTPCcalibDButil::GetNearest(gr, timeStamp,deltaT,gry);
704         krDist[isec]=deltaT;
705       }     
706       if (72+isec<krArray->GetEntries()) {
707         gr=(TGraphErrors*)krArray->At(72+isec);
708         if (gr) krErr[isec]=AliTPCcalibDButil::EvalGraphConst(gr,timeStamp);
709       }
710     }
711     krMean[72]= TMath::Median(36,krMean.GetMatrixArray());
712     krMean[73]= TMath::Median(36,&(krMean.GetMatrixArray()[36]));
713     krErr[72]= TMath::Median(36,krErr.GetMatrixArray());
714     krErr[73]= TMath::Median(36,&(krErr.GetMatrixArray()[36]));
715   }
716   (*fPcstream)<<"dcs"<<
717     "krMean.="<<&krMean<<
718     "krErr.="<<&krErr<<
719     "krDist.="<<&krDist;
720 }
721
722 void AliTPCcalibSummary::ProcessCTP(Int_t irun, Int_t timeStamp){
723   //
724   // 
725   //
726   static TClonesArray *pcarray = new TClonesArray("AliCTPInputTimeParams",1);
727   static AliCTPTimeParams *ctpParams =0;
728   ctpParams = fCalibDB->GetCTPTimeParams(); //
729   const TObjArray        *arr = ctpParams->GetInputTimeParams();
730   pcarray->ExpandCreateFast(TMath::Max(arr->GetEntries(),1));
731   for (Int_t i=0; i<arr->GetEntries(); i++){
732     new ((*pcarray)[i]) AliCTPInputTimeParams(*((AliCTPInputTimeParams*)arr->At(i)));
733   }
734   (*fPcstream)<<"ctp"<<
735     "run="<<irun<<
736     "time="<<timeStamp<<
737     "ctpP.="<<ctpParams<<
738     "ctpArr="<<pcarray<<
739     "\n";
740   (*fPcstream)<<"dcs"<<
741     "ctpP.="<<ctpParams<<
742     "ctpArr="<<pcarray;
743 }
744
745 void AliTPCcalibSummary::ProcessGain(Int_t irun, Int_t timeStamp){
746   //
747   // Dump gain related information to the tree
748   //
749   static Float_t  gainCosmic = 0;
750   static Float_t  gainMIP = 0;
751   static Float_t  attachMIP = 0;
752   static Double_t dMIP=0; 
753   Double_t dummy=0;
754   TObjArray * gainSplines = fCalibDB->GetTimeGainSplinesRun(irun);
755   if (gainSplines) {
756     TGraphErrors * graphMIP = (TGraphErrors *) gainSplines->FindObject("TGRAPHERRORS_MEAN_GAIN_BEAM_ALL");
757     TGraphErrors * graphCosmic = (TGraphErrors *) gainSplines->FindObject("TGRAPHERRORS_MEAN_GAIN_COSMIC_ALL");
758     TGraphErrors * graphAttach = (TGraphErrors *) gainSplines->FindObject("TGRAPHERRORS_MEAN_ATTACHMENT_BEAM_ALL");
759     if (graphMIP) gainMIP = AliTPCcalibDButil::EvalGraphConst(graphMIP,timeStamp);
760     if (graphCosmic) gainCosmic = AliTPCcalibDButil::EvalGraphConst(graphCosmic,timeStamp);
761     if (graphAttach) attachMIP = AliTPCcalibDButil::EvalGraphConst(graphAttach,timeStamp);
762     if (graphMIP)  AliTPCcalibDButil::GetNearest(graphMIP, timeStamp, dMIP,dummy);
763   }
764   // time dependence of gain
765   (*fPcstream)<<"dcs"<<
766     "gainMIP="<<gainMIP<<
767     "attachMIP="<<attachMIP<<
768     "dMIP="<<dMIP<<
769     "gainCosmic="<<gainCosmic;     
770 }
771
772
773 void AliTPCcalibSummary::ProcessAlign(Int_t run, Int_t timeStamp){
774   //
775   // Proccess alignment 
776   //
777   TString   grnames[12]={"ALIGN_ITS", "ALIGN_ITSP", "ALIGN_ITSM", "ALIGN_ITSB",
778                          "ALIGN_TRD", "ALIGN_TRDP", "ALIGN_TRDM","ALIGN_TRDB",
779                          "ALIGN_TOF", "ALIGN_TOFP", "ALIGN_TOFM","ALIGN_TOFB"};
780   TString   grpar[9]={"DELTAPSI", "DELTATHETA", "DELTAPHI",
781                       "DELTAX", "DELTAY", "DELTAZ",
782                       "DRIFTVD", "T0", "VDGY"};
783   static Double_t values[12*9];
784   static Double_t errs[12*9];
785
786   TObjArray *array =fCalibDB->GetTimeVdriftSplineRun(run);
787   TGraphErrors *gr=0;
788   for (Int_t idet=0; idet<12; idet++){
789     for (Int_t ipar=0; ipar<9; ipar++){
790       TString grName=grnames[idet];
791       grName+="_TPC_";
792       grName+=grpar[ipar];
793       if (array){
794         gr = (TGraphErrors*)array->FindObject(grName.Data());
795       }
796       values[9*idet+ipar]=0;
797       errs[9*idet+ipar]=0;
798       if (gr) values[9*idet+ipar]=AliTPCcalibDButil::EvalGraphConst(gr,timeStamp);
799       (*fPcstream)<<"dcs"<<
800         Form("%s=",grName.Data())<<values[9*idet+ipar];
801       (*fPcstream)<<"align"<<
802         Form("%s=",grName.Data())<<values[9*idet+ipar];
803     }
804   }
805   (*fPcstream)<<"align"<<
806     "time="<<timeStamp<<
807     "run="<<run<<
808     "\n";
809 }
810
811
812 void AliTPCcalibSummary::ProcessDriftCERef(){
813   //
814   // Get fit of residuals if CE in respect with reference
815   // data
816   //
817   static TVectorD  sec(72);
818   static TVectorD vec0(72);
819   static TVectorD vecLy(72);
820   static TVectorD vecLx(72);
821   static TVectorD vecChi2(72);
822   static TVectorD vecN(72);
823   //
824   static TVectorD vecA0(72);
825   static TVectorD vecALy(72);
826   static TVectorD vecALx(72);
827   static TVectorD vecAChi2(72);
828   //
829   static TVectorD vecASide(4);
830   static TVectorD vecCSide(4);
831   static Bool_t isCalc=kFALSE;
832   
833   TFile f("calPads.root");
834   TFile fref("calPadsRef.root");
835   TTree * tree = (TTree*)f.Get("calPads");
836   TTree * treeRef = (TTree*)fref.Get("calPads");
837   tree->AddFriend(treeRef,"R");
838   tree->SetAlias("inCE","((CEQmean.fElements>35)&&abs(CETmean.fElements)<1.5&&abs(CETrms.fElements/1.2-1)<0.2)");  // outlyerTrms
839   tree->SetAlias("inCER","((R.CEQmean.fElements>35)&&abs(R.CETmean.fElements)<1.5&&abs(R.CETrms.fElements/1.2-1)<0.2)");  // outlyerTrms
840   //
841   if (!isCalc){
842     // make fits only once
843     TStatToolkit toolkit;
844     Double_t chi2=0;
845     Int_t    npoints=0;
846     TVectorD param;
847     TMatrixD covar;
848     tree->SetAlias("dt","CETmean.fElements-R.CETmean.fElements");
849     TCut cutAll ="inCE&&inCER&&abs(CETmean.fElements-R.CETmean.fElements)<0.5"; 
850     TString  fstringG="";              // global part
851     fstringG+="ly.fElements++";
852     fstringG+="(lx.fElements-134.)++";  
853     for (Int_t isec=0; isec<72; isec++){
854       TStatToolkit::FitPlane(tree,"0.264*dt", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
855       if (npoints<3) continue;
856       printf("Sector=%d\n",isec);
857       vec0[isec]=param[0];
858       vecLy[isec]=param[1];
859       vecLx[isec]=param[2];
860       sec[isec]=isec;
861       vecN[isec]=npoints;
862       vecChi2[isec]=TMath::Sqrt(chi2/npoints);
863
864       TStatToolkit::FitPlane(tree,"0.264*CETmean.fElements", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
865       if (npoints<3) continue;
866       printf("Sector=%d\n",isec);
867       vecA0[isec]=param[0];
868       vecALy[isec]=param[1];
869       vecALx[isec]=param[2];
870       vecAChi2[isec]=TMath::Sqrt(chi2/npoints);
871     }
872     isCalc=kTRUE;
873     //
874     TString  fstringRef="";              // global fit
875     fstringRef+="gx.fElements++";
876     fstringRef+="gy.fElements++";  
877     fstringRef+="lx.fElements++";
878     TStatToolkit::FitPlane(tree,"0.264*dt", fstringG.Data(),"(sector%36)<18"+cutAll, chi2,npoints,vecASide,covar,-1,0, 10000000, kFALSE);
879     TStatToolkit::FitPlane(tree,"0.264*dt", fstringG.Data(),"(sector%36)>=18"+cutAll, chi2,npoints,vecCSide,covar,-1,0, 10000000, kFALSE);
880
881   }
882   (*fPcstream)<<"dcs"<<     // CE information
883     "CETSector.="<<&sec<<    // sector numbers
884     "CETRefA.="<<&vecASide<<   // diff to reference A side
885     "CETRefC.="<<&vecCSide<<   // diff to reference C side    
886     //                      // fit in respect to reference data
887     "CETRef0.="<<&vec0<<    // offset change
888     "CETRefY.="<<&vecLy<<   // slope y change - rad
889     "CETRefX.="<<&vecLx<<   // slope x change - rad
890     "CETRefChi2.="<<&vecChi2<<    // chi2 (rms in cm)
891     "CETRefN.="<<&vecN<<     //number of accepted points
892     //                       // fit in respect per mean per side
893     "CET0.="<<&vecA0<<       // offset change
894     "CETY.="<<&vecALy<<      // slope y change - rad
895     "CETX.="<<&vecALx<<      // slope x change - rad
896     "CETChi2.="<<&vecAChi2;  // chi2 (rms in cm)
897 }
898
899 void AliTPCcalibSummary::ProcessPulserRef(){
900   //
901   // Get fit of residuals if Pulser in respect with reference
902   // data
903   //
904   static TVectorD  sec(72);
905   static TVectorD vec0(72);
906   static TVectorD vecLy(72);
907   static TVectorD vecLx(72);
908   static TVectorD vecChi2(72);
909   static TVectorD vecN(72);
910   //
911   static TVectorD vecA0(72);
912   static TVectorD vecALy(72);
913   static TVectorD vecALx(72);
914   static TVectorD vecAChi2(72);
915   static Bool_t isCalc=kFALSE;
916   
917   TFile f("calPads.root");
918   TFile fref("calPadsRef.root");
919   TTree * tree = (TTree*)f.Get("calPads");
920   TTree * treeRef = (TTree*)fref.Get("calPads");
921   tree->AddFriend(treeRef,"R");
922   
923   tree->SetAlias("inPulser","(abs(PulserTmean.fElements-PulserTmean_Median)<1.5&&abs(PulserTrms.fElements-PulserTrms_Median)<0.2)");  // outlyerTrms
924   tree->SetAlias("inPulserR","(abs(R.PulserTmean.fElements-R.PulserTmean_Median)<1.5&&abs(R.PulserTrms.fElements-R.PulserTrms_Median)<0.2)");  // outlyerTrms
925   //
926   if (!isCalc){
927     // make fits only once
928     TStatToolkit toolkit;
929     Double_t chi2=0;
930     Int_t    npoints=0;
931     TVectorD param;
932     TMatrixD covar;
933     tree->SetAlias("dt","PulserTmean.fElements-R.PulserTmean.fElements");
934     TCut cutAll ="inPulser&&inPulserR"; 
935     TString  fstringG="";              // global part
936     fstringG+="ly.fElements++";
937     fstringG+="(lx.fElements-134.)++";  
938     for (Int_t isec=0; isec<72; isec++){
939       TStatToolkit::FitPlane(tree,"dt", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
940       if (npoints<3) continue;
941       printf("Setor=%d\n",isec);
942       vec0[isec]=param[0];
943       vecLy[isec]=param[1];
944       vecLx[isec]=param[2];
945       sec[isec]=isec;
946       vecN[isec]=npoints;
947
948       TStatToolkit::FitPlane(tree,"PulserTmean.fElements", fstringG.Data(),Form("sector==%d",isec)+cutAll, chi2,npoints,param,covar,-1,0, 10000000, kFALSE);
949       if (npoints<3) continue;
950       printf("Setor=%d\n",isec);
951       vecA0[isec]=param[0];
952       vecALy[isec]=param[1];
953       vecALx[isec]=param[2];
954       vecAChi2[isec]=TMath::Sqrt(chi2/npoints);
955     }
956
957     isCalc=kTRUE;
958   }
959   (*fPcstream)<<"dcs"<<     // Pulser information
960     "PulserTSector.="<<&sec<<    // sector numbers
961     //                      // fit in respect to reference
962     "PulserTRef0.="<<&vec0<<    // offset change
963     "PulserTRefY.="<<&vecLy<<   // slope y change - rad
964     "PulserTRefX.="<<&vecLx<<   // slope x change - rad
965     "PulserTRefChi2.="<<&vecChi2<<    // chi2 (rms in cm)
966     "PulserTRefN.="<<&vecN<<     //number of accepted points
967     //                       // fit in respect per mean per side
968     "PulserT0.="<<&vecA0<<       // offset change
969     "PulserTY.="<<&vecALy<<      // slope y change - rad
970     "PulserTX.="<<&vecALx<<      // slope x change - rad
971     "PulserTChi2.="<<&vecAChi2;  // chi2 (rms in cm)
972 }
973
974 void AliTPCcalibSummary::ProcessCurrent(Int_t irun, Int_t itime){
975   //
976   // Dump current 
977   //
978   //variables to export
979   //
980   static TObjArray *currentArray=new TObjArray(72);   // current graphs
981   static TObjArray *currentArray2=new TObjArray(72);  // current graphs to export
982   //
983   static TVectorD currentIROC(36);                    // current snapshots
984   static TVectorD currentOROC(36); 
985   static TVectorF sector(72);                         //
986   static Double_t medcurIROC = 0;
987   static Double_t medcurOROC = 0;
988   //
989   static TVectorF minROC(72);                         // current mean +-5 minutes
990   static TVectorF maxROC(72);
991   static TVectorF meanROC(72);
992   static TVectorF medianROC(72);
993   static Double_t meanIIROC=0;
994   static Double_t meanIOROC=0;
995   static Double_t medianIIROC=0;
996   static Double_t medianIOROC=0;
997   //
998   AliDCSSensorArray* voltageArray = AliTPCcalibDB::Instance()->GetVoltageSensors(irun);
999   //
1000   for(Int_t j=1; j<36; j++) currentIROC[j-1] = fCalibDB->GetChamberHighVoltage(irun, j,itime,-1,kTRUE);
1001   for(Int_t j=36; j<72; j++) currentOROC[j-36] = fCalibDB->GetChamberHighVoltage(irun, j,itime,-1,kTRUE);
1002   medcurIROC = TMath::Median(36, currentIROC.GetMatrixArray());
1003   medcurOROC = TMath::Median(36, currentOROC.GetMatrixArray());
1004
1005
1006   if (currentArray->At(0)==0){
1007     for (Int_t isec=0; isec<72; isec++){
1008       TString sensorName="";
1009       const char* sideName=(isec%36<18) ? "A":"C";
1010       if (isec<36){
1011         //IROC
1012         sensorName=Form("TPC_ANODE_I_%s%02d_IMEAS",sideName,isec%18);
1013       }else{
1014         //OROC
1015         sensorName=Form("TPC_ANODE_O_%s%02d_0_IMEAS",sideName,isec%18);
1016       }      
1017     
1018       AliDCSSensor *sensor = 0;
1019       if (voltageArray) sensor= voltageArray->GetSensor(sensorName);   
1020       TGraph *gr=0;
1021       if (!sensor) gr=new TGraph(1);
1022       else{
1023         if (!sensor->GetGraph()) gr=new TGraph(1);
1024         else{
1025           gr=sensor->GetGraph();
1026           Double_t startTime=sensor->GetStartTime();
1027           Double_t * time = new Double_t[gr->GetN()];
1028           for (Int_t ip=0; ip<gr->GetN(); ip++){ time[ip]= (gr->GetX()[ip]*3600.)+startTime;}     
1029           gr=new TGraph(gr->GetN(), time, gr->GetY());  
1030           delete [] time;
1031         }      
1032       }
1033       gr->Sort();
1034       currentArray->AddAt(gr, isec);
1035       currentArray->AddAt(gr->Clone(), isec);
1036     }
1037   }
1038
1039
1040   for (Int_t isec=0; isec<72; isec++){
1041     sector[isec]=isec;
1042     TGraph * gr = (TGraph*)currentArray->At(isec);
1043     TGraph * graph2 = (TGraph*)currentArray2->At(isec);    
1044     Int_t firstBin= TMath::BinarySearch(gr->GetN(), gr->GetX(), itime-300.)-2;
1045     Int_t lastBin= TMath::BinarySearch(gr->GetN(), gr->GetX(), itime+300.)+2;
1046     if (firstBin<0) firstBin=0;
1047     if (lastBin>=gr->GetN()) lastBin=gr->GetN()-1;
1048     //
1049     if (firstBin<lastBin){
1050       //
1051       minROC[isec]=TMath::MinElement(lastBin-firstBin, &(gr->GetY()[firstBin]));
1052       maxROC[isec]=TMath::MaxElement(lastBin-firstBin, &(gr->GetY()[firstBin]));
1053       meanROC[isec]=TMath::Mean(lastBin-firstBin, &(gr->GetY()[firstBin]));
1054       medianROC[isec]=TMath::Median(lastBin-firstBin, &(gr->GetY()[firstBin]));       
1055       graph2 = new TGraph(lastBin-firstBin, &(gr->GetX()[firstBin]), &(gr->GetY()[firstBin]));
1056       delete currentArray2->At(isec);
1057       currentArray2->AddAt(graph2,isec);
1058     }
1059     (*fPcstream)<<"dcs"<<     // current information
1060       Form("current%d.=",isec)<<graph2;
1061   }     
1062   meanIIROC=TMath::Mean(36, &(meanROC.GetMatrixArray()[0]));
1063   meanIOROC=TMath::Mean(36, &(meanROC.GetMatrixArray()[36]));
1064   medianIIROC=TMath::Median(36, &(meanROC.GetMatrixArray()[0]));
1065   medianIOROC=TMath::Median(36, &(meanROC.GetMatrixArray()[36]));
1066   //
1067   (*fPcstream)<<"dcs"<<     // current information
1068     "isec.="<<&sector<<                       //sector number
1069     "IIROC.="<<&currentIROC<<               // current sample at given moment
1070     "IOROC.="<<&currentOROC<<               // current sample at given moment
1071     "medianIIROC="<<medcurIROC<<            // median at given moment 
1072     "medianIOROC="<<medcurOROC<<            // median at given moment
1073     //
1074     "minIROC.="<<&minROC<<                  // minimum in +-5 min 
1075     "maxIROC.="<<&maxROC<<                  // maximum in +-5 min
1076     "meanIROC.="<<&meanROC<<                // mean in +-5 min
1077     "medianIROC.="<<&medianROC<<              // median in +-5 min
1078     "meanIIROC5="<<meanIIROC<<               // mean current in IROC +-5 minutes 
1079     "meanIOROC5="<<meanIOROC<<               // mean current in OROC 
1080     "medianIIROC5="<<medianIIROC<<           // median current in IROC 
1081     "medianIOROC5="<<medianIOROC;           // medianan current in OROC 
1082    
1083
1084   (*fPcstream)<<"current"<<     // current information
1085     "time="<<itime<<
1086     "isec.="<<&sector<<                       //sector number
1087     "IIROC.="<<&currentIROC<<               // current sample at given moment
1088     "IOROC.="<<&currentOROC<<               // current sample at given moment
1089     "medianIIROC="<<medcurIROC<<            // median at given moment 
1090     "medianIOROC="<<medcurOROC<<            // median at given moment
1091     //
1092     "minIROC.="<<&minROC<<                  // minimum in +-5 min 
1093     "maxIROC.="<<&maxROC<<                  // maximum in +-5 min
1094     "meanIROC.="<<&meanROC<<                // mean in +-5 min
1095     "medianIROC.="<<&medianROC<<              // median in +-5 min
1096     "meanIIROC5="<<meanIIROC<<               // mean current in IROC +-5 minutes 
1097     "meanIOROC5="<<meanIOROC<<               // mean current in OROC 
1098     "medianIIROC5="<<medianIIROC<<           // median current in IROC 
1099     "medianIOROC5="<<medianIOROC<< // medianan current in OROC 
1100     "\n";
1101
1102 }
1103
1104
1105
1106
1107 // TCanvas * DrawCEDiff(TTree * tree){
1108   
1109 //   TCanvas *canvasIO = new TCanvas("canvasCEIO","canvasCEIO");
1110 //   canvasIO->Divide(6,6);
1111 //   for (Int_t isec=0; isec<36; isec++){
1112 //     canvasIO->cd(isec+1);
1113 //     dcs->Draw(Form("CET0.fElements[%d]-CET0.fElements[%d]",isec+36,isec),Form("abs(CETRef0.fElements[%d])<0.3",isec),"");
1114 //     printf("%d\t%f\t%f\n",isec,dcs->GetHistogram()->GetMean(),dcs->GetHistogram()->GetRMS());
1115 //   }
1116
1117 // }