]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliDCSSensorArray.cxx
Bugfix. Store the global DDL ID instead of the local one. Thanks to Laurent for spott...
[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//_____________________________________________________________________________
67a165ed 50AliDCSSensorArray::AliDCSSensorArray(TClonesArray *arr):TNamed(),
24938b4c 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//_____________________________________________________________________________
67a165ed 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 //
67a165ed 84
85 AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry,run);
24938b4c 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 //
67a165ed 106 // AliDCSSensorArray constructor for Shuttle preprocessor
24938b4c 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
67a165ed 135 fSensors = (TClonesArray*)c.fSensors->Clone();
7264822f 136}
137
138///_____________________________________________________________________________
139AliDCSSensorArray::~AliDCSSensorArray()
140{
141 //
142 // AliDCSSensorArray destructor
143 //
144 fSensors->Delete();
145 delete fSensors;
146
147}
148
149//_____________________________________________________________________________
150AliDCSSensorArray &AliDCSSensorArray::operator=(const AliDCSSensorArray &c)
151{
152 //
153 // Assignment operator
154 //
67a165ed 155 if (this != &c) {
156 fSensors->Delete();
157 new (this) AliDCSSensorArray(c);
158 fSensors = (TClonesArray*)c.fSensors->Clone();
159 }
7264822f 160 return *this;
7264822f 161}
162
67a165ed 163//____________________________________________________________________________
7264822f 164
82dfb6c8 165void AliDCSSensorArray::SetGraph(TMap *map)
7264822f 166{
82dfb6c8 167 //
168 // Read graphs from DCS maps
7264822f 169 //
7264822f 170 Int_t nsensors = fSensors->GetEntries();
171 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
172 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
82dfb6c8 173 TString stringID = entry->GetStringID();
24938b4c 174 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
175 if ( gr !=0 ) {
176 entry->SetGraph((TGraph*)gr->Clone());
82dfb6c8 177 } else {
24938b4c 178 entry->SetGraph(0);
179 }
82dfb6c8 180 }
181}
7264822f 182//_____________________________________________________________________________
82dfb6c8 183void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap)
7264822f 184{
82dfb6c8 185 //
186 // Make spline fits from DCS maps
7264822f 187 //
7264822f 188 Int_t nsensors = fSensors->GetEntries();
189 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
190 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
82dfb6c8 191 TString stringID = entry->GetStringID();
24938b4c 192 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
82dfb6c8 193 if (!gr ) {
24938b4c 194 entry->SetFit(0);
82dfb6c8 195 entry->SetGraph(0);
196 AliWarning(Form("sensor %s: no input graph",stringID.Data()));
197 continue;
24938b4c 198 }
7264822f 199 AliSplineFit *fit = new AliSplineFit();
82dfb6c8 200 fit->SetMinPoints(fMinGraph);
e5250086 201 fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
202 fit->SplineFit(fFitReq);
7264822f 203 entry->SetStartTime(fStartTime);
8cb8848e 204 entry->SetEndTime(fEndTime);
7264822f 205 fit->Cleanup();
82dfb6c8 206 if (fit) {
207 entry->SetFit(fit);
208 } else {
209 AliWarning(Form("sensor %s: no fit performed, DCS graph kept.",stringID.Data()));
210 entry->SetGraph(gr);
211 }
8cb8848e 212 if (keepMap) entry->SetGraph(gr);
82dfb6c8 213 }
214}
7264822f 215
67a165ed 216//_____________________________________________________________________________
217Int_t AliDCSSensorArray::NumFits() const
218{
219 //
220 // Return number of sensors where a succesful fit has been made
221 //
222 Int_t nfit=0;
223 Int_t nsensors = fSensors->GetEntries();
224 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
225 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
226 if (entry->GetFit()) nfit++;
227 }
228 return nfit;
229}
7264822f 230//_____________________________________________________________________________
82dfb6c8 231Double_t AliDCSSensorArray::GetValue(UInt_t timeSec, Int_t sensor)
7264822f 232{
82dfb6c8 233 //
7264822f 234 // Return sensor value at time timeSec (obtained from fitted function)
235 // timeSec = time in seconds from start of run
236 //
237 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(sensor);
238 return entry->GetValue(timeSec);
239}
82dfb6c8 240
7264822f 241
242//_____________________________________________________________________________
82dfb6c8 243TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap)
7264822f 244{
245 //
246 // Extract temperature graphs from DCS maps
247 //
248 TMap *values = new TMap;
249 TObjArray * valueSet;
7c76a767 250 Int_t nsensors = fSensors->GetEntries();
251 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
252 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
82dfb6c8 253 TString stringID = entry->GetStringID();
24938b4c 254 TPair *pair = (TPair*)dcsMap->FindObject(stringID.Data());
82dfb6c8 255 if ( pair ) { // only try to read values
24938b4c 256 // if DCS object available
257 valueSet = (TObjArray*)pair->Value();
258 TGraph *graph = MakeGraph(valueSet);
259 values->Add(new TObjString(stringID.Data()),graph);
260 }
7264822f 261 }
262 return values;
263}
264
265//_____________________________________________________________________________
266TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet){
267 //
268 // Make graph of temperature values read from DCS map
269 // (spline fit parameters will subsequently be obtained from this graph)
270 //
271 Int_t nentries = valueSet->GetEntriesFast();
24938b4c 272 if ( nentries == 0 ) return 0;
273
7264822f 274 Float_t *x = new Float_t[nentries];
275 Float_t *y = new Float_t[nentries];
82dfb6c8 276 Int_t time0=fStartTime.GetSec();
7264822f 277 Int_t out=0;
278 Int_t skipped=0;
e5250086 279 AliDCSValue *val = (AliDCSValue *)valueSet->At(0);
280 AliDCSValue::Type type = val->GetType();
281 if ( type == AliDCSValue::kInvalid || type == AliDCSValue::kBool ) return 0;
282 Float_t value;
7264822f 283 for (Int_t i=0; i<nentries; i++){
e5250086 284 val = (AliDCSValue *)valueSet->At(i);
7264822f 285 if (!val) continue;
286 if (time0==0){
287 time0=val->GetTimeStamp();
288 }
e5250086 289 switch ( type )
290 {
291 case AliDCSValue::kFloat:
292 value = val->GetFloat();
293 break;
294 case AliDCSValue::kChar:
24938b4c 295 value = static_cast<Float_t>(val->GetChar());
e5250086 296 break;
297 case AliDCSValue::kInt:
24938b4c 298 value = static_cast<Float_t>(val->GetInt());
e5250086 299 break;
300 case AliDCSValue::kUInt:
24938b4c 301 value = static_cast<Float_t>(val->GetUInt());
e5250086 302 break;
303 default:
304 continue;
305 }
24938b4c 306 if (fValCut>0 && TMath::Abs(value)>fValCut) continue; // refuse values greater than cut
307 if (fDiffCut>0 ) {
308 if ( out>0 && skipped<10 && TMath::Abs(value-y[out-1])>fDiffCut) {
309 skipped++; // refuse values changing
310 continue; // by > cut in one time step
311 }
312 skipped=0;
313 }
7264822f 314 if (val->GetTimeStamp()-time0>1000000) continue;
8cb8848e 315 x[out] = (val->GetTimeStamp()-time0)/kSecInHour; // give times in fractions of hours
7264822f 316 y[out] = val->GetFloat();
317 out++;
318
319 }
320 TGraph * graph = new TGraph(out,x,y);
321 delete [] x;
322 delete [] y;
323 return graph;
324}
325
326//_____________________________________________________________________________
327AliDCSSensor* AliDCSSensorArray::GetSensor(Int_t IdDCS)
328{
329 //
330 // Return sensor information for sensor specified by IdDCS
331 //
332 Int_t nsensors = fSensors->GetEntries();
333 for (Int_t isensor=0; isensor<nsensors; isensor++) {
334 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
335 if (entry->GetIdDCS() == IdDCS) return entry;
336 }
337 return 0;
338}
339//_____________________________________________________________________________
82dfb6c8 340AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID)
24938b4c 341{
342 //
343 // Return sensor information for sensor specified by IdDCS
344 //
345 Int_t nsensors = fSensors->GetEntries();
346 for (Int_t isensor=0; isensor<nsensors; isensor++) {
347 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
348 if (entry->GetStringID() == stringID) return entry;
349 }
350 return 0;
351}
352//_____________________________________________________________________________
82dfb6c8 353AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z)
7264822f 354{
355 //
356 // Return sensor closest to given position
357 //
358 Int_t nsensors = fSensors->GetEntries();
359 Double_t dist2min=1e99;
360 Double_t xs,ys,zs,dist2;
361 Int_t ind=-1;
362 for (Int_t isensor=0; isensor<nsensors; isensor++) {
363 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
364 xs = entry->GetX();
365 ys = entry->GetY();
366 zs = entry->GetZ();
367 dist2 = (x-xs)*(x-xs) + (y-ys)*(y-ys) + (z-zs)*(z-zs);
368 if (dist2 < dist2min) {
369 ind=isensor;
370 dist2min = dist2;
82dfb6c8 371 }
7264822f 372 }
373 if ( ind >= 0 ) {
374 return (AliDCSSensor*)fSensors->At(ind);
375 } else {
376 return 0;
377 }
378}
8cb8848e 379
82dfb6c8 380AliDCSSensor* AliDCSSensorArray::GetSensorNum(Int_t ind)
8cb8848e 381{
382 //
383 // Return sensor given by array index
384 //
385 return (AliDCSSensor*)fSensors->At(ind);
386}
387
82dfb6c8 388void AliDCSSensorArray::RemoveSensorNum(Int_t ind)
389{
390 //
391 // Return sensor given by array index
392 //
393
394 delete fSensors->RemoveAt(ind);
395 fSensors->Compress();
396}
397void AliDCSSensorArray::RemoveSensor(Int_t IdDCS)
398{
399 //
400 // Deletes Sensor by given IdDCS
401 //
402
403 Int_t nsensors = fSensors->GetEntries();
404 for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over sensors
405 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
406 if (entry->GetIdDCS()==IdDCS) {
407 delete fSensors->RemoveAt(isensor);
408 break;
409 }
410 }
411 fSensors->Compress();
412}
413
8cb8848e 414Int_t AliDCSSensorArray::GetFirstIdDCS() const
415{
416 //
417 // Return DCS Id of first sensor
418 //
419 if ( fSensors != 0 ) {
420 return ((AliDCSSensor*)fSensors->At(0))->GetIdDCS();
421 } else {
422 return 0;
423 }
424}
425
426Int_t AliDCSSensorArray::GetLastIdDCS() const
427{
428 //
429 // Return DCS Id of last sensor
430 //
431 if ( fSensors != 0 ) {
432 Int_t last = fSensors->GetEntries();
433 return ((AliDCSSensor*)fSensors->At(last-1))->GetIdDCS();
434 } else {
435 return 0;
436 }
437}
24938b4c 438void AliDCSSensorArray::ClearGraph()
439{
440 //
441 // Delete DCS graphs from all sensors in array
442 //
443
444 Int_t nsensors = fSensors->GetEntries();
445 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
446 AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
447 TGraph *gr = sensor->GetGraph();
448 if ( gr != 0 ) {
449 delete gr;
450 gr = 0;
451 }
452 sensor->SetGraph(0);
82dfb6c8 453 }
454}
24938b4c 455void AliDCSSensorArray::ClearFit()
456{
457 //
458 // Delete spline fits from all sensors in array
459 //
82dfb6c8 460
24938b4c 461 Int_t nsensors = fSensors->GetEntries();
462 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
463 AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
464 AliSplineFit *fit = sensor->GetFit();
465 if ( fit != 0 ) {
466 delete fit;
467 fit = 0;
468 }
469 sensor->SetFit(0);
82dfb6c8 470 }
471}