]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliDCSSensorArray.cxx
Coding violations corrected.
[u/mrichter/AliRoot.git] / STEER / AliDCSSensorArray.cxx
CommitLineData
7264822f 1/**************************************************************************
2 * Copyright(c) 1998-1999, 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// Calibration class for DCS sensors //
20// Authors: Marian Ivanov and Haavard Helstrup //
21// //
22///////////////////////////////////////////////////////////////////////////////
23
24#include "AliDCSSensorArray.h"
82dfb6c8 25#include "AliLog.h"
7264822f 26
27ClassImp(AliDCSSensorArray)
28
8cb8848e 29const Double_t kSecInHour = 3600.; // seconds in one hour
7264822f 30
31//_____________________________________________________________________________
7c76a767 32AliDCSSensorArray::AliDCSSensorArray():TNamed(),
e5250086 33 fMinGraph(10),
34 fMinPoints(10),
35 fIter(10),
36 fMaxDelta(0.0),
37 fFitReq(2),
24938b4c 38 fValCut(-1),
39 fDiffCut(-1),
7c76a767 40 fStartTime (2000,1,1,0,0,0),
41 fEndTime (2000,1,1,0,0,0),
42 fSensors(0)
7264822f 43{
44 //
45 // AliDCSSensorArray default constructor
46 //
7264822f 47
48}
49//_____________________________________________________________________________
24938b4c 50AliDCSSensorArray::AliDCSSensorArray(TClonesArray *arr):TNamed(),
51 fMinGraph(10),
52 fMinPoints(10),
53 fIter(10),
54 fMaxDelta(0.0),
55 fFitReq(2),
56 fValCut(-1),
57 fDiffCut(-1),
58 fStartTime (2000,1,1,0,0,0),
59 fEndTime (2000,1,1,0,0,0),
60 fSensors(arr)
61{
62 //
63 // AliDCSSensorArray special constructor taking TClonesArray from ReadList
64 //
65
66}
67//_____________________________________________________________________________
68AliDCSSensorArray::AliDCSSensorArray(Int_t run, const char* dbEntry) :
7c76a767 69 TNamed(),
e5250086 70 fMinGraph(10),
71 fMinPoints(10),
72 fIter(10),
73 fMaxDelta(0.0),
74 fFitReq(2),
24938b4c 75 fValCut(-1),
76 fDiffCut(-1),
7c76a767 77 fStartTime (2000,1,1,0,0,0),
78 fEndTime (2000,1,1,0,0,0),
79 fSensors(0)
7264822f 80{
81 //
24938b4c 82 // Read configuration from OCDB
7264822f 83 //
24938b4c 84
85 AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry,run);
86 TTree *tree = (TTree*) entry->GetObject();
87 fSensors = AliDCSSensor::ReadTree(tree);
88}
89//_____________________________________________________________________________
90AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t endTime,
91 TTree* confTree) :
92 TNamed(),
93 fMinGraph(10),
94 fMinPoints(10),
95 fIter(10),
96 fMaxDelta(0.0),
97 fFitReq(2),
98 fValCut(-1),
99 fDiffCut(-1),
100 fStartTime (2000,1,1,0,0,0),
101 fEndTime (2000,1,1,0,0,0),
102 fSensors(0)
7264822f 103
24938b4c 104{
105 //
106 // AliDCSSensorArray constructor for Shuttle preprocessor
107 // (confTree read from OCDB)
108 //
109 fSensors = AliDCSSensor::ReadTree(confTree);
110 fSensors->BypassStreamer(kFALSE);
111 fStartTime = TTimeStamp(startTime);
112 fEndTime = TTimeStamp(endTime);
7264822f 113}
114
115
116
117//_____________________________________________________________________________
7c76a767 118AliDCSSensorArray::AliDCSSensorArray(const AliDCSSensorArray &c):TNamed(c),
e5250086 119 fMinGraph(c.fMinGraph),
120 fMinPoints(c.fMinPoints),
121 fIter(c.fIter),
122 fMaxDelta(c.fMaxDelta),
123 fFitReq(c.fFitReq),
124 fValCut(c.fValCut),
125 fDiffCut(c.fDiffCut),
7c76a767 126 fStartTime (c.fStartTime),
127 fEndTime (c.fEndTime),
128 fSensors(0)
129
7264822f 130{
131 //
132 // AliDCSSensorArray copy constructor
133 //
134
135 ((AliDCSSensorArray &) c).Copy(*this);
136
137}
138
139///_____________________________________________________________________________
140AliDCSSensorArray::~AliDCSSensorArray()
141{
142 //
143 // AliDCSSensorArray destructor
144 //
145 fSensors->Delete();
146 delete fSensors;
147
148}
149
150//_____________________________________________________________________________
151AliDCSSensorArray &AliDCSSensorArray::operator=(const AliDCSSensorArray &c)
152{
153 //
154 // Assignment operator
155 //
156
157 if (this != &c) ((AliDCSSensorArray &) c).Copy(*this);
158 return *this;
159
160}
161
162//_____________________________________________________________________________
163void AliDCSSensorArray::Copy(TObject &c) const
164{
165 //
166 // Copy function
167 //
168
169 TObject::Copy(c);
170}
171//_____________________________________________________________________________
82dfb6c8 172void AliDCSSensorArray::SetGraph(TMap *map)
7264822f 173{
82dfb6c8 174 //
175 // Read graphs from DCS maps
7264822f 176 //
7264822f 177 Int_t nsensors = fSensors->GetEntries();
178 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
179 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
82dfb6c8 180 TString stringID = entry->GetStringID();
24938b4c 181 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
182 if ( gr !=0 ) {
183 entry->SetGraph((TGraph*)gr->Clone());
82dfb6c8 184 } else {
24938b4c 185 entry->SetGraph(0);
186 }
82dfb6c8 187 }
188}
7264822f 189//_____________________________________________________________________________
82dfb6c8 190void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap)
7264822f 191{
82dfb6c8 192 //
193 // Make spline fits from DCS maps
7264822f 194 //
7264822f 195 Int_t nsensors = fSensors->GetEntries();
196 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
197 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
82dfb6c8 198 TString stringID = entry->GetStringID();
24938b4c 199 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
82dfb6c8 200 if (!gr ) {
24938b4c 201 entry->SetFit(0);
82dfb6c8 202 entry->SetGraph(0);
203 AliWarning(Form("sensor %s: no input graph",stringID.Data()));
204 continue;
24938b4c 205 }
7264822f 206 AliSplineFit *fit = new AliSplineFit();
82dfb6c8 207 fit->SetMinPoints(fMinGraph);
e5250086 208 fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
209 fit->SplineFit(fFitReq);
7264822f 210 entry->SetStartTime(fStartTime);
8cb8848e 211 entry->SetEndTime(fEndTime);
7264822f 212 fit->Cleanup();
82dfb6c8 213 if (fit) {
214 entry->SetFit(fit);
215 } else {
216 AliWarning(Form("sensor %s: no fit performed, DCS graph kept.",stringID.Data()));
217 entry->SetGraph(gr);
218 }
8cb8848e 219 if (keepMap) entry->SetGraph(gr);
82dfb6c8 220 }
221}
7264822f 222
24938b4c 223
7264822f 224//_____________________________________________________________________________
82dfb6c8 225Double_t AliDCSSensorArray::GetValue(UInt_t timeSec, Int_t sensor)
7264822f 226{
82dfb6c8 227 //
7264822f 228 // Return sensor value at time timeSec (obtained from fitted function)
229 // timeSec = time in seconds from start of run
230 //
231 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(sensor);
232 return entry->GetValue(timeSec);
233}
82dfb6c8 234
7264822f 235
236//_____________________________________________________________________________
82dfb6c8 237TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap)
7264822f 238{
239 //
240 // Extract temperature graphs from DCS maps
241 //
242 TMap *values = new TMap;
243 TObjArray * valueSet;
7c76a767 244 Int_t nsensors = fSensors->GetEntries();
245 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
246 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
82dfb6c8 247 TString stringID = entry->GetStringID();
24938b4c 248 TPair *pair = (TPair*)dcsMap->FindObject(stringID.Data());
82dfb6c8 249 if ( pair ) { // only try to read values
24938b4c 250 // if DCS object available
251 valueSet = (TObjArray*)pair->Value();
252 TGraph *graph = MakeGraph(valueSet);
253 values->Add(new TObjString(stringID.Data()),graph);
254 }
7264822f 255 }
256 return values;
257}
258
259//_____________________________________________________________________________
260TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet){
261 //
262 // Make graph of temperature values read from DCS map
263 // (spline fit parameters will subsequently be obtained from this graph)
264 //
265 Int_t nentries = valueSet->GetEntriesFast();
24938b4c 266 if ( nentries == 0 ) return 0;
267
7264822f 268 Float_t *x = new Float_t[nentries];
269 Float_t *y = new Float_t[nentries];
82dfb6c8 270 Int_t time0=fStartTime.GetSec();
7264822f 271 Int_t out=0;
272 Int_t skipped=0;
e5250086 273 AliDCSValue *val = (AliDCSValue *)valueSet->At(0);
274 AliDCSValue::Type type = val->GetType();
275 if ( type == AliDCSValue::kInvalid || type == AliDCSValue::kBool ) return 0;
276 Float_t value;
7264822f 277 for (Int_t i=0; i<nentries; i++){
e5250086 278 val = (AliDCSValue *)valueSet->At(i);
7264822f 279 if (!val) continue;
280 if (time0==0){
281 time0=val->GetTimeStamp();
282 }
e5250086 283 switch ( type )
284 {
285 case AliDCSValue::kFloat:
286 value = val->GetFloat();
287 break;
288 case AliDCSValue::kChar:
24938b4c 289 value = static_cast<Float_t>(val->GetChar());
e5250086 290 break;
291 case AliDCSValue::kInt:
24938b4c 292 value = static_cast<Float_t>(val->GetInt());
e5250086 293 break;
294 case AliDCSValue::kUInt:
24938b4c 295 value = static_cast<Float_t>(val->GetUInt());
e5250086 296 break;
297 default:
298 continue;
299 }
24938b4c 300 if (fValCut>0 && TMath::Abs(value)>fValCut) continue; // refuse values greater than cut
301 if (fDiffCut>0 ) {
302 if ( out>0 && skipped<10 && TMath::Abs(value-y[out-1])>fDiffCut) {
303 skipped++; // refuse values changing
304 continue; // by > cut in one time step
305 }
306 skipped=0;
307 }
7264822f 308 if (val->GetTimeStamp()-time0>1000000) continue;
8cb8848e 309 x[out] = (val->GetTimeStamp()-time0)/kSecInHour; // give times in fractions of hours
7264822f 310 y[out] = val->GetFloat();
311 out++;
312
313 }
314 TGraph * graph = new TGraph(out,x,y);
315 delete [] x;
316 delete [] y;
317 return graph;
318}
319
320//_____________________________________________________________________________
321AliDCSSensor* AliDCSSensorArray::GetSensor(Int_t IdDCS)
322{
323 //
324 // Return sensor information for sensor specified by IdDCS
325 //
326 Int_t nsensors = fSensors->GetEntries();
327 for (Int_t isensor=0; isensor<nsensors; isensor++) {
328 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
329 if (entry->GetIdDCS() == IdDCS) return entry;
330 }
331 return 0;
332}
333//_____________________________________________________________________________
82dfb6c8 334AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID)
24938b4c 335{
336 //
337 // Return sensor information for sensor specified by IdDCS
338 //
339 Int_t nsensors = fSensors->GetEntries();
340 for (Int_t isensor=0; isensor<nsensors; isensor++) {
341 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
342 if (entry->GetStringID() == stringID) return entry;
343 }
344 return 0;
345}
346//_____________________________________________________________________________
82dfb6c8 347AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z)
7264822f 348{
349 //
350 // Return sensor closest to given position
351 //
352 Int_t nsensors = fSensors->GetEntries();
353 Double_t dist2min=1e99;
354 Double_t xs,ys,zs,dist2;
355 Int_t ind=-1;
356 for (Int_t isensor=0; isensor<nsensors; isensor++) {
357 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
358 xs = entry->GetX();
359 ys = entry->GetY();
360 zs = entry->GetZ();
361 dist2 = (x-xs)*(x-xs) + (y-ys)*(y-ys) + (z-zs)*(z-zs);
362 if (dist2 < dist2min) {
363 ind=isensor;
364 dist2min = dist2;
82dfb6c8 365 }
7264822f 366 }
367 if ( ind >= 0 ) {
368 return (AliDCSSensor*)fSensors->At(ind);
369 } else {
370 return 0;
371 }
372}
8cb8848e 373
82dfb6c8 374AliDCSSensor* AliDCSSensorArray::GetSensorNum(Int_t ind)
8cb8848e 375{
376 //
377 // Return sensor given by array index
378 //
379 return (AliDCSSensor*)fSensors->At(ind);
380}
381
82dfb6c8 382void AliDCSSensorArray::RemoveSensorNum(Int_t ind)
383{
384 //
385 // Return sensor given by array index
386 //
387
388 delete fSensors->RemoveAt(ind);
389 fSensors->Compress();
390}
391void AliDCSSensorArray::RemoveSensor(Int_t IdDCS)
392{
393 //
394 // Deletes Sensor by given IdDCS
395 //
396
397 Int_t nsensors = fSensors->GetEntries();
398 for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over sensors
399 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
400 if (entry->GetIdDCS()==IdDCS) {
401 delete fSensors->RemoveAt(isensor);
402 break;
403 }
404 }
405 fSensors->Compress();
406}
407
8cb8848e 408Int_t AliDCSSensorArray::GetFirstIdDCS() const
409{
410 //
411 // Return DCS Id of first sensor
412 //
413 if ( fSensors != 0 ) {
414 return ((AliDCSSensor*)fSensors->At(0))->GetIdDCS();
415 } else {
416 return 0;
417 }
418}
419
420Int_t AliDCSSensorArray::GetLastIdDCS() const
421{
422 //
423 // Return DCS Id of last sensor
424 //
425 if ( fSensors != 0 ) {
426 Int_t last = fSensors->GetEntries();
427 return ((AliDCSSensor*)fSensors->At(last-1))->GetIdDCS();
428 } else {
429 return 0;
430 }
431}
24938b4c 432void AliDCSSensorArray::ClearGraph()
433{
434 //
435 // Delete DCS graphs from all sensors in array
436 //
437
438 Int_t nsensors = fSensors->GetEntries();
439 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
440 AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
441 TGraph *gr = sensor->GetGraph();
442 if ( gr != 0 ) {
443 delete gr;
444 gr = 0;
445 }
446 sensor->SetGraph(0);
82dfb6c8 447 }
448}
24938b4c 449void AliDCSSensorArray::ClearFit()
450{
451 //
452 // Delete spline fits from all sensors in array
453 //
82dfb6c8 454
24938b4c 455 Int_t nsensors = fSensors->GetEntries();
456 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
457 AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
458 AliSplineFit *fit = sensor->GetFit();
459 if ( fit != 0 ) {
460 delete fit;
461 fit = 0;
462 }
463 sensor->SetFit(0);
82dfb6c8 464 }
465}