STEER/CDB: Missing delete in AliDCSSensor dtor
[u/mrichter/AliRoot.git] / STEER / CDB / AliDCSSensor.cxx
1 /**************************************************************************
2  * Copyright(c) 2006-07, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16
17 ////////////////////////////////////////////////////////////////////////////////
18 //                                                                            //
19 // Class describing time dependent values read from DCS sensors               //  
20 // (including pointers to graphs/fits)                                        //
21 // Authors: Marian Ivanov, Haavard Helstrup and Martin Siska                  //
22 //                                                                            //
23 ////////////////////////////////////////////////////////////////////////////////
24
25
26 #include "AliDCSSensor.h"
27 #include "TDatime.h"
28 #include "TCanvas.h"
29 ClassImp(AliDCSSensor)
30
31 const Double_t kSecInHour = 3600.; // seconds in one hour
32
33
34
35 AliDCSSensor::AliDCSSensor():
36   fId(),
37   fIdDCS(0),
38   fStringID(),
39   fStartTime(0),
40   fEndTime(0),
41   fGraph(0),
42   fFit(0),
43   fX(0),
44   fY(0),
45   fZ(0)
46 {
47   //
48   //  Standard constructor
49   //
50 }
51
52 AliDCSSensor::AliDCSSensor(const AliDCSSensor& source) :
53    TNamed(source),
54    fId(source.fId),
55    fIdDCS(source.fIdDCS),
56    fStringID(source.fStringID),
57    fStartTime(source.fStartTime),
58    fEndTime(source.fEndTime),
59    fGraph(0),
60    fFit(0),
61    fX(source.fX),
62    fY(source.fY),
63    fZ(source.fZ)
64 //
65 //  Copy constructor
66 //
67
68    if (source.fGraph) fGraph = (TGraph*)source.fGraph->Clone();
69    if (source.fFit) fFit = (AliSplineFit*)source.fFit->Clone();
70 }
71
72 AliDCSSensor::~AliDCSSensor(){
73   //
74   // Destructor
75   //
76   if(fGraph)
77     delete fGraph;
78   fGraph=0;
79
80 }
81
82 AliDCSSensor& AliDCSSensor::operator=(const AliDCSSensor& source){
83 //
84 // assignment operator
85 //
86   if (&source == this) return *this;
87   new (this) AliDCSSensor(source);
88
89   return *this;
90 }
91
92
93 void AliDCSSensor::Print(const Option_t* option) const{
94   //
95   // print function
96   //  
97   TString opt = option; opt.ToLower();
98   printf("%s:%s\n",GetTitle(), GetName());
99   printf("%s\n",fStringID.Data());
100
101 }
102
103 void AliDCSSensor::Draw(Option_t* option) {
104   //
105   // draw function - to viusalize sensor
106   // Unfortuantelly - it  make a memory leak as function Draw does not return the object pointer
107   //
108   TCanvas * canvas = new TCanvas((fStringID+option).Data(), (fStringID+option).Data()); 
109   if (fGraph){
110     // transform points to time in s
111     Int_t npoints = fGraph->GetN();
112     for (Int_t i=0; i<npoints; i++){
113       fGraph->GetX()[i]=fGraph->GetX()[i]*3600+fStartTime;
114     }
115     fGraph->Draw("alp");
116     return;
117   }
118   canvas->cd();
119   TGraph * graph = MakeGraph(100);  // memory leak - we can not modify the content - const method
120   graph->Draw(option);              // 
121   //
122 }
123
124
125
126 //_____________________________________________________________________________
127 Double_t AliDCSSensor::GetValue(UInt_t timeSec)
128 {
129  // 
130  // Get DCS value for actual sensor
131  //  timeSec given as offset from start-of-map measured in seconds
132  //  *NOTE* In the current TPC setup, start-of-map is defined as the 
133  //         first measured point for each sensor. This will be different
134  //         for each sensor in the array. If you want to get a value at the 
135  //         same absolute time, use AliDCSSensor::GetValue(TTimeStamp time)
136  //         or AliDCSSensorArray::GetValue (UInt_t timeSec, Int_t sensor)
137  //         which measure offsets with respect to the (global) start-of-run
138  //
139  Bool_t inside=kTRUE;
140  return Eval(TTimeStamp((time_t)(fStartTime+timeSec),0),inside);
141 }
142 //_____________________________________________________________________________
143 Double_t AliDCSSensor::GetValue(TTimeStamp time) 
144 {
145  // Get DCS value for actual sensor
146  //  time given as absolute TTimeStamp
147  //
148  Bool_t inside=kTRUE;
149  return Eval(time, inside);
150 }
151
152 //_____________________________________________________________________________
153
154 Double_t AliDCSSensor::Eval(const TTimeStamp& time, Bool_t& inside) const
155 {
156   // 
157   // Return DCS value at given time
158   //  The value is calculated from the AliSplineFit, if a fit is not available 
159   //    the most recent reading from the Graph of DCS points is returned (if 
160   //    the graph is present)
161   //  If time < start of map  return value at start of map, inside = false
162   //  If time > end of map    return value at end of map, inside = false
163   
164   UInt_t timeSec = time.GetSec();
165   UInt_t diff = timeSec-fStartTime;
166   inside = true;
167   
168   if ( timeSec < fStartTime ) { 
169      inside=false;
170      diff=0;
171   }
172   if ( timeSec > fEndTime ) {
173      inside=false;
174      diff = fEndTime-fStartTime;
175   }
176  
177   Double_t timeHour = diff/kSecInHour;
178   if ( fFit ) {
179      return fFit->Eval(timeHour); 
180   } else {
181      if ( fGraph ) {
182        return EvalGraph(timeHour);
183      } else {  
184        return -99;
185      }
186   }
187 }
188 //_____________________________________________________________________________
189
190 Double_t AliDCSSensor::EvalGraph(const TTimeStamp& time, Bool_t& inside) const
191 {
192   // 
193   // Return DCS value from graph of DCS points (i.e return last reading before
194   //  the time specified by TTimeStamp
195   //  If time < start of map  return value at start of map, inside = false
196   //  If time > end of map    return value at end of map, inside = false
197   
198   UInt_t timeSec = time.GetSec();
199   UInt_t diff = timeSec-fStartTime;
200   inside = true;
201   
202   if ( timeSec < fStartTime ) { 
203      inside=false;
204      diff=0;
205   }
206   if ( timeSec > fEndTime ) {
207      inside=false;
208      diff = fEndTime-fStartTime;
209   }
210  
211   Double_t timeHour = diff/kSecInHour;
212   if ( fGraph ) {
213      return EvalGraph(timeHour);
214   } else {  
215      return -99;
216   }  
217 }
218 //_____________________________________________________________________________
219 Double_t AliDCSSensor::EvalGraph(const Double_t& timeHour) const 
220 {
221   //
222   // Extract last value in graph observed before time given by timeHour
223   //
224
225   // return -99 if point specified is before beginning of graph
226   Double_t x=0; Double_t y=0;
227   fGraph->GetPoint(0,x,y);
228   if ( timeHour < x ) return -99;
229   
230   // return previous point when first time > timeHour is observed
231   
232   Int_t npoints = fGraph->GetN();
233   for (Int_t i=1; i<npoints; i++) {
234      fGraph->GetPoint(i,x,y);
235      if ( timeHour < x ) {
236        fGraph->GetPoint(i-1,x,y);
237        return y;
238      }
239   }
240   
241   // return last point if all times are < timeHour
242   return y;
243
244         
245
246 //_____________________________________________________________________________
247 TGraph* AliDCSSensor::MakeGraph(Int_t nPoints, Bool_t debug) const
248 {
249   //
250   // Make graph from start time to end time of DCS values 
251   //
252
253  
254
255   UInt_t stepTime = (fEndTime-fStartTime)/nPoints;
256   
257   if (debug==kTRUE) {
258      printf ("Start time %d, End time %d, step time %d\n",
259      fStartTime,fEndTime,stepTime);
260      TTimeStamp t((time_t)fStartTime,0); t.Print();
261      TTimeStamp t2((time_t)fEndTime,0); t2.Print();
262   }     
263   
264   if ( !fFit ) return 0;
265
266   Double_t *x = new Double_t[nPoints+1];
267   Double_t *y = new Double_t[nPoints+1];
268   for (Int_t ip=0; ip<nPoints; ip++) {
269     x[ip] = (time_t)(fStartTime+ip*stepTime);
270     y[ip] = fFit->Eval(ip*stepTime/kSecInHour);
271     if (debug==kTRUE) {
272      TTimeStamp t3((time_t)x[ip],0); 
273      printf ("x=%f, y=%f  ",x[ip],y[ip]);
274      t3.Print();
275     }
276   }
277   
278   TGraph *graph = new TGraph(nPoints,x,y);
279   delete [] x;
280   delete [] y;
281   
282   graph->GetXaxis()->SetTimeDisplay(1);
283   graph->GetXaxis()->SetLabelOffset(0.02);
284   graph->GetXaxis()->SetTimeFormat("#splitline{%d/%m}{%H:%M}");
285
286   return graph;
287 }
288
289 //_____________________________________________________________________________
290
291 TClonesArray * AliDCSSensor::ReadTree(TTree* tree) {
292   //
293   // read values from ascii file
294   //
295
296   Int_t nentries = tree->GetEntries();
297
298   char stringId[100];
299   Int_t num=0;
300   Int_t idDCS=0;
301   Double_t x=0;
302   Double_t y=0;
303   Double_t z=0;
304
305   tree->SetBranchAddress("StringID",&stringId);
306   tree->SetBranchAddress("IdDCS",&idDCS);
307   tree->SetBranchAddress("Num",&num);
308   tree->SetBranchAddress("X",&x);
309   tree->SetBranchAddress("Y",&y);
310   tree->SetBranchAddress("Z",&z);
311
312   // firstSensor = (Int_t)tree->GetMinimum("ECha");
313   // lastSensor = (Int_t)tree->GetMaximum("ECha");
314
315   TClonesArray * array = new TClonesArray("AliDCSSensor",nentries);
316    printf ("nentries = %d\n",nentries);
317
318   for (Int_t isensor=0; isensor<nentries; isensor++){
319     AliDCSSensor * sens = new ((*array)[isensor])AliDCSSensor;
320     tree->GetEntry(isensor);
321     sens->SetId(isensor);
322     sens->SetIdDCS(idDCS);
323     sens->SetStringID(TString(stringId));
324     sens->SetX(x);
325     sens->SetY(y);
326     sens->SetZ(z);
327
328   }
329   return array;
330 }
331