Store DCS identification string for each sensor. Read Config entry from OCDB (Haavard)
[u/mrichter/AliRoot.git] / STEER / 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 TPC temperature sensors (including pointers to graphs/fits//
20 // Authors: Marian Ivanov, Haavard Helstrup and Martin Siska                  //
21 //                                                                            //
22 ////////////////////////////////////////////////////////////////////////////////
23
24
25 // Running instructions:
26 /*
27   TClonesArray * arr = AliDCSSensor::ReadList("TempSensor.txt");
28   TFile f("TempSensors.root","RECREATE");
29   TTree * tree = new TTree("TempSensor", "TempSensor");
30   tree->Branch("Temp",&arr);
31   tree->Fill();
32   tree->Write();
33   
34  */
35 //
36
37
38 #include "AliDCSSensor.h"
39 ClassImp(AliDCSSensor)
40
41 const Double_t kSmall = -9e99;     // invalid small value
42 const Double_t kLarge = 9e99;      // invalid large value
43 const Double_t kSecInHour = 3600.; // seconds in one hour
44
45
46
47 AliDCSSensor::AliDCSSensor():
48   fId(),
49   fIdDCS(0),
50   fStringID(),
51   fStartTime(0),
52   fEndTime(0),
53   fGraph(0),
54   fFit(0),
55   fX(0),
56   fY(0),
57   fZ(0)
58 {
59   //
60   //  Standard constructor
61   //
62 }
63
64 AliDCSSensor::AliDCSSensor(const AliDCSSensor& source) :
65    TNamed(source),
66    fId(source.fId),
67    fIdDCS(source.fIdDCS),
68    fStringID(source.fStringID),
69    fStartTime(source.fStartTime),
70    fEndTime(source.fEndTime),
71    fGraph(source.fGraph),
72    fFit(source.fFit),
73    fX(source.fX),
74    fY(source.fY),
75    fZ(source.fZ)
76 //
77 //  Copy constructor
78 //
79 { }
80
81 AliDCSSensor& AliDCSSensor::operator=(const AliDCSSensor& source){
82 //
83 // assignment operator
84 //
85   if (&source == this) return *this;
86   new (this) AliDCSSensor(source);
87   
88   return *this;  
89 }
90
91 //_____________________________________________________________________________
92 Double_t AliDCSSensor::GetValue(UInt_t timeSec) 
93 {
94  //
95  // Get temperature value for actual sensor
96  //  timeSec given as offset from start-of-run measured in seconds
97  //
98  return Eval(TTimeStamp(timeSec));
99 }
100 //_____________________________________________________________________________
101 Double_t AliDCSSensor::GetValue(TTimeStamp time) 
102 {
103  // Get temperature value for actual sensor
104  //  time given as absolute TTimeStamp
105  //
106  return Eval(time);
107 }
108
109 //_____________________________________________________________________________
110
111 Double_t AliDCSSensor::Eval(const TTimeStamp& time) const
112 {
113   // 
114   // Return temperature at given time
115   //  If time < start of map  return kSmall
116   //  If time > end of map    return kLarge
117   
118   UInt_t timeSec = time.GetSec();
119   UInt_t diff = timeSec-fStartTime;
120   
121   if ( timeSec < fStartTime ) return kSmall;
122   if ( timeSec > fEndTime ) return kLarge;
123  
124   Double_t timeHour = diff/kSecInHour;
125   if ( fFit ) {
126      return fFit->Eval(timeHour); 
127   } else {
128      return kSmall;
129   }
130 }
131
132 TGraph* AliDCSSensor::MakeGraph(Int_t nPoints) const
133 {
134   //
135   // Make graph from start time to end time of DCS values 
136   //
137
138   UInt_t stepTime = (fEndTime-fStartTime)/nPoints;
139   
140   if ( !fFit ) return 0;
141
142   Double_t *x = new Double_t[nPoints+1];
143   Double_t *y = new Double_t[nPoints+1];
144   for (Int_t ip=0; ip<nPoints; ip++) {
145     x[ip] = fStartTime+ip*stepTime;
146     y[ip] = fFit->Eval(ip*stepTime/kSecInHour);
147   }
148   
149   TGraph *graph = new TGraph(nPoints,x,y);
150   delete [] x;
151   delete [] y;
152   
153   graph->GetXaxis()->SetTimeDisplay(1);
154   graph->GetXaxis()->SetLabelOffset(0.02);
155   graph->GetXaxis()->SetTimeFormat("#splitline{%d/%m}{%H:%M}");
156   
157   return graph;
158 }
159
160 //_____________________________________________________________________________
161
162 TClonesArray * AliDCSSensor::ReadTree(TTree* tree) {
163   //
164   // read values from ascii file
165   //
166   
167   Int_t nentries = tree->GetEntries();
168   
169   char stringId[100];
170   Int_t num=0;
171   Int_t idDCS=0;
172   Double_t x=0;
173   Double_t y=0;
174   Double_t z=0;
175
176   tree->SetBranchAddress("StringID",&stringId);
177   tree->SetBranchAddress("IdDCS",&idDCS);
178   tree->SetBranchAddress("Num",&num);
179   tree->SetBranchAddress("X",&x);
180   tree->SetBranchAddress("Y",&y);
181   tree->SetBranchAddress("Z",&z);
182
183   // firstSensor = (Int_t)tree->GetMinimum("ECha");
184   // lastSensor = (Int_t)tree->GetMaximum("ECha");
185
186   TClonesArray * array = new TClonesArray("AliDCSSensor",nentries);
187    printf ("nentries = %d\n",nentries);
188
189   for (Int_t isensor=0; isensor<nentries; isensor++){
190     AliDCSSensor * sens = new ((*array)[isensor])AliDCSSensor;
191     tree->GetEntry(isensor);
192     sens->SetId(isensor);
193     sens->SetIdDCS(idDCS);
194     sens->SetStringID(TString(stringId));
195     sens->SetX(x);
196     sens->SetY(y);
197     sens->SetZ(z);
198
199   }
200   return array;
201 }
202