]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliDCSSensorArray.cxx
Fix tru index calculation (Nicola and Rachid)
[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
082c0071 30const UInt_t kMinMapTime = 60; // don't fit maps shorter than one minute
7264822f 31
32//_____________________________________________________________________________
7c76a767 33AliDCSSensorArray::AliDCSSensorArray():TNamed(),
e5250086 34 fMinGraph(10),
35 fMinPoints(10),
36 fIter(10),
37 fMaxDelta(0.0),
38 fFitReq(2),
24938b4c 39 fValCut(-1),
40 fDiffCut(-1),
7c76a767 41 fStartTime (2000,1,1,0,0,0),
42 fEndTime (2000,1,1,0,0,0),
43 fSensors(0)
7264822f 44{
45 //
46 // AliDCSSensorArray default constructor
47 //
7264822f 48
49}
50//_____________________________________________________________________________
67a165ed 51AliDCSSensorArray::AliDCSSensorArray(TClonesArray *arr):TNamed(),
24938b4c 52 fMinGraph(10),
53 fMinPoints(10),
54 fIter(10),
55 fMaxDelta(0.0),
56 fFitReq(2),
57 fValCut(-1),
58 fDiffCut(-1),
59 fStartTime (2000,1,1,0,0,0),
60 fEndTime (2000,1,1,0,0,0),
61 fSensors(arr)
62{
63 //
64 // AliDCSSensorArray special constructor taking TClonesArray from ReadList
65 //
66
67}
68//_____________________________________________________________________________
67a165ed 69AliDCSSensorArray::AliDCSSensorArray(Int_t run, const char* dbEntry) :
7c76a767 70 TNamed(),
e5250086 71 fMinGraph(10),
72 fMinPoints(10),
73 fIter(10),
74 fMaxDelta(0.0),
75 fFitReq(2),
24938b4c 76 fValCut(-1),
77 fDiffCut(-1),
7c76a767 78 fStartTime (2000,1,1,0,0,0),
79 fEndTime (2000,1,1,0,0,0),
80 fSensors(0)
7264822f 81{
82 //
24938b4c 83 // Read configuration from OCDB
7264822f 84 //
67a165ed 85
86 AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry,run);
24938b4c 87 TTree *tree = (TTree*) entry->GetObject();
88 fSensors = AliDCSSensor::ReadTree(tree);
89}
90//_____________________________________________________________________________
91AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t endTime,
92 TTree* confTree) :
93 TNamed(),
94 fMinGraph(10),
95 fMinPoints(10),
96 fIter(10),
97 fMaxDelta(0.0),
98 fFitReq(2),
99 fValCut(-1),
100 fDiffCut(-1),
101 fStartTime (2000,1,1,0,0,0),
102 fEndTime (2000,1,1,0,0,0),
103 fSensors(0)
7264822f 104
24938b4c 105{
106 //
67a165ed 107 // AliDCSSensorArray constructor for Shuttle preprocessor
24938b4c 108 // (confTree read from OCDB)
109 //
110 fSensors = AliDCSSensor::ReadTree(confTree);
111 fSensors->BypassStreamer(kFALSE);
008ef66a 112 fStartTime = TTimeStamp((time_t)startTime,0);
113 fEndTime = TTimeStamp((time_t)endTime,0);
7264822f 114}
115
116
17984b61 117//_____________________________________________________________________________
118AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t endTime,
119 TClonesArray *sensors) :
120 TNamed(),
121 fMinGraph(10),
122 fMinPoints(10),
123 fIter(10),
124 fMaxDelta(0.0),
125 fFitReq(2),
126 fValCut(-1),
127 fDiffCut(-1),
128 fStartTime (2000,1,1,0,0,0),
129 fEndTime (2000,1,1,0,0,0),
130 fSensors(sensors)
131
132{
133 //
134 // AliDCSSensorArray constructor for Shuttle preprocessor
135 // (TClonesArray of AliDCSSensor objects)
136 //
008ef66a 137 fStartTime = TTimeStamp((time_t)startTime,0);
138 fEndTime = TTimeStamp((time_t)endTime,0);
17984b61 139}
7264822f 140
141//_____________________________________________________________________________
7c76a767 142AliDCSSensorArray::AliDCSSensorArray(const AliDCSSensorArray &c):TNamed(c),
e5250086 143 fMinGraph(c.fMinGraph),
144 fMinPoints(c.fMinPoints),
145 fIter(c.fIter),
146 fMaxDelta(c.fMaxDelta),
147 fFitReq(c.fFitReq),
148 fValCut(c.fValCut),
149 fDiffCut(c.fDiffCut),
7c76a767 150 fStartTime (c.fStartTime),
151 fEndTime (c.fEndTime),
152 fSensors(0)
153
7264822f 154{
155 //
156 // AliDCSSensorArray copy constructor
157 //
158
67a165ed 159 fSensors = (TClonesArray*)c.fSensors->Clone();
7264822f 160}
161
162///_____________________________________________________________________________
163AliDCSSensorArray::~AliDCSSensorArray()
164{
165 //
166 // AliDCSSensorArray destructor
167 //
168 fSensors->Delete();
169 delete fSensors;
170
171}
172
173//_____________________________________________________________________________
174AliDCSSensorArray &AliDCSSensorArray::operator=(const AliDCSSensorArray &c)
175{
176 //
177 // Assignment operator
178 //
67a165ed 179 if (this != &c) {
180 fSensors->Delete();
181 new (this) AliDCSSensorArray(c);
182 fSensors = (TClonesArray*)c.fSensors->Clone();
183 }
7264822f 184 return *this;
7264822f 185}
186
67a165ed 187//____________________________________________________________________________
7264822f 188
82dfb6c8 189void AliDCSSensorArray::SetGraph(TMap *map)
7264822f 190{
82dfb6c8 191 //
192 // Read graphs from DCS maps
7264822f 193 //
7264822f 194 Int_t nsensors = fSensors->GetEntries();
195 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
196 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
82dfb6c8 197 TString stringID = entry->GetStringID();
24938b4c 198 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
199 if ( gr !=0 ) {
200 entry->SetGraph((TGraph*)gr->Clone());
82dfb6c8 201 } else {
24938b4c 202 entry->SetGraph(0);
203 }
82dfb6c8 204 }
205}
7264822f 206//_____________________________________________________________________________
82dfb6c8 207void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap)
7264822f 208{
82dfb6c8 209 //
210 // Make spline fits from DCS maps
7264822f 211 //
7264822f 212 Int_t nsensors = fSensors->GetEntries();
213 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
214 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
82dfb6c8 215 TString stringID = entry->GetStringID();
24938b4c 216 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
008ef66a 217 if (!gr ) {
24938b4c 218 entry->SetFit(0);
82dfb6c8 219 entry->SetGraph(0);
220 AliWarning(Form("sensor %s: no input graph",stringID.Data()));
221 continue;
24938b4c 222 }
082c0071 223 UInt_t timeDiff = entry->GetEndTime() - entry->GetStartTime();
224 if ( timeDiff < kMinMapTime ) {
225 AliWarning(Form("sensor %s: map length < 60 s, DCS graph kept.",stringID.Data()));
6ec4e3e3 226 entry->SetGraph((TGraph*)gr->Clone());
082c0071 227 } else {
228 AliSplineFit *fit = new AliSplineFit();
229 fit->SetMinPoints(fMinGraph);
230 fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
231 fit->SplineFit(fFitReq);
232 fit->Cleanup();
233 if (fit) {
234 entry->SetFit(fit);
235 } else {
236 AliWarning(Form("sensor %s: no fit performed, DCS graph kept.",stringID.Data()));
237 entry->SetGraph((TGraph*)gr->Clone());
238 }
82dfb6c8 239 }
6ec4e3e3 240 if (keepMap) entry->SetGraph((TGraph*)gr->Clone());
82dfb6c8 241 }
242}
e7097603 243//_____________________________________________________________________________
0baf4718 244void AliDCSSensorArray::MakeSplineFitAddPoints(TMap *map)
e7097603 245{
246 //
0baf4718 247 // Make spline fits from DCS maps
e7097603 248 //
249 Int_t nsensors = fSensors->GetEntries();
250 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
251 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
0baf4718 252
253 // fetch old points from existing graph
254
255 TGraph *gr = entry->GetGraph();
256 if (!gr) {
257 gr = new TGraph();
258 entry->SetGraph(gr);
259 }
e7097603 260 TString stringID = entry->GetStringID();
0baf4718 261
262 // fetch new points from DCS map
263
264 TGraph *grAdd = (TGraph*)map->GetValue(stringID.Data());
265 if (!grAdd ) return;
266
267 // add new points to end of graph
268
269 Int_t nPointsOld=gr->GetN();
270 Int_t nPointsAdd=grAdd->GetN();
271 gr->Expand(nPointsOld+nPointsAdd);
272 gr->Set(nPointsOld+nPointsAdd);
273 Double_t *addX=grAdd->GetX();
274 Double_t *addY=grAdd->GetY();
275 for (Int_t i=0;i<nPointsAdd;i++) {
276 gr->SetPoint(nPointsOld+i,addX[i],addY[i]);
277 }
278
279 // make fit to complete graph
280
281 AliSplineFit *fit = new AliSplineFit();
282 fit->SetMinPoints(fMinGraph);
283 fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
284 fit->SplineFit(fFitReq);
285 fit->Cleanup();
286 if (fit) {
287 AliSplineFit *oldFit = entry->GetFit();
288 if (oldFit) delete oldFit;
289 entry->SetFit(fit);
290 } else {
291 AliWarning(Form("sensor %s: no new fit performed. If available, old fit kept.",stringID.Data()));
e7097603 292 }
e7097603 293 }
294}
7264822f 295
67a165ed 296//_____________________________________________________________________________
297Int_t AliDCSSensorArray::NumFits() const
298{
299 //
300 // Return number of sensors where a succesful fit has been made
301 //
302 Int_t nfit=0;
303 Int_t nsensors = fSensors->GetEntries();
304 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
305 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
306 if (entry->GetFit()) nfit++;
307 }
308 return nfit;
309}
7264822f 310//_____________________________________________________________________________
082c0071 311Double_t AliDCSSensorArray::GetValue(UInt_t timeSec, Int_t sensor)
7264822f 312{
82dfb6c8 313 //
7264822f 314 // Return sensor value at time timeSec (obtained from fitted function)
315 // timeSec = time in seconds from start of run
316 //
082c0071 317
7264822f 318 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(sensor);
082c0071 319 return entry->GetValue(TTimeStamp((time_t)fStartTime.GetSec()+timeSec,0));
7264822f 320}
82dfb6c8 321
7264822f 322
323//_____________________________________________________________________________
0baf4718 324TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap, Bool_t keepStart)
7264822f 325{
326 //
327 // Extract temperature graphs from DCS maps
328 //
329 TMap *values = new TMap;
330 TObjArray * valueSet;
008ef66a 331 //
332 // Keep global start/end times
333 // to avoid extrapolations, the fits will only be valid from first
334 // measured point to last measured point. This is consistent with hardware,
335 // as there would be a new measured point if the value changed.
336
337 TTimeStamp startTime=fStartTime;
338 TTimeStamp endTime=fEndTime;
339
7c76a767 340 Int_t nsensors = fSensors->GetEntries();
341 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
342 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
82dfb6c8 343 TString stringID = entry->GetStringID();
24938b4c 344 TPair *pair = (TPair*)dcsMap->FindObject(stringID.Data());
82dfb6c8 345 if ( pair ) { // only try to read values
24938b4c 346 // if DCS object available
347 valueSet = (TObjArray*)pair->Value();
0baf4718 348 TGraph *graph = MakeGraph(valueSet,keepStart); // MakeGraph sets start/end time
008ef66a 349 // per sensor
24938b4c 350 values->Add(new TObjString(stringID.Data()),graph);
008ef66a 351 entry->SetStartTime(fStartTime);
352 entry->SetEndTime(fEndTime);
24938b4c 353 }
7264822f 354 }
008ef66a 355 // Reset global start/end time
356 // ..... yes, I know this won't get a prize for structured programming..:-)
357
358 fStartTime=startTime;
359 fEndTime=endTime;
7264822f 360 return values;
361}
362
989362ab 363
7264822f 364//_____________________________________________________________________________
0baf4718 365TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet, Bool_t keepStart){
7264822f 366 //
367 // Make graph of temperature values read from DCS map
368 // (spline fit parameters will subsequently be obtained from this graph)
369 //
370 Int_t nentries = valueSet->GetEntriesFast();
24938b4c 371 if ( nentries == 0 ) return 0;
372
7264822f 373 Float_t *x = new Float_t[nentries];
374 Float_t *y = new Float_t[nentries];
4ba8baed 375 Int_t time0=0, previousTime=0;
bf84b403 376 TTimeStamp firstTime(0);
377 TTimeStamp lastTime(0);
0baf4718 378 if (keepStart) {
379 firstTime = fStartTime;
380 time0 = firstTime.GetSec();
381 }
7264822f 382 Int_t out=0;
383 Int_t skipped=0;
e5250086 384 AliDCSValue *val = (AliDCSValue *)valueSet->At(0);
385 AliDCSValue::Type type = val->GetType();
386 if ( type == AliDCSValue::kInvalid || type == AliDCSValue::kBool ) return 0;
387 Float_t value;
7264822f 388 for (Int_t i=0; i<nentries; i++){
e5250086 389 val = (AliDCSValue *)valueSet->At(i);
7264822f 390 if (!val) continue;
391 if (time0==0){
392 time0=val->GetTimeStamp();
40de6493 393 firstTime= TTimeStamp((time_t)val->GetTimeStamp(),0);
394 lastTime=TTimeStamp((time_t)val->GetTimeStamp(),0);
0baf4718 395 }
e5250086 396 switch ( type )
397 {
398 case AliDCSValue::kFloat:
399 value = val->GetFloat();
400 break;
401 case AliDCSValue::kChar:
24938b4c 402 value = static_cast<Float_t>(val->GetChar());
e5250086 403 break;
404 case AliDCSValue::kInt:
24938b4c 405 value = static_cast<Float_t>(val->GetInt());
e5250086 406 break;
407 case AliDCSValue::kUInt:
24938b4c 408 value = static_cast<Float_t>(val->GetUInt());
e5250086 409 break;
410 default:
411 continue;
412 }
24938b4c 413 if (fValCut>0 && TMath::Abs(value)>fValCut) continue; // refuse values greater than cut
414 if (fDiffCut>0 ) {
415 if ( out>0 && skipped<10 && TMath::Abs(value-y[out-1])>fDiffCut) {
416 skipped++; // refuse values changing
417 continue; // by > cut in one time step
418 }
419 skipped=0;
420 }
7264822f 421 if (val->GetTimeStamp()-time0>1000000) continue;
4ba8baed 422 if (val->GetTimeStamp()-previousTime < 1 ) continue; // refuse duplicate recordings
423 previousTime=val->GetTimeStamp();
40de6493 424 lastTime=TTimeStamp((time_t)val->GetTimeStamp(),0);
8cb8848e 425 x[out] = (val->GetTimeStamp()-time0)/kSecInHour; // give times in fractions of hours
7264822f 426 y[out] = val->GetFloat();
bf84b403 427 out++;
7264822f 428 }
0baf4718 429 if (!keepStart) fStartTime=firstTime;
008ef66a 430 fEndTime=lastTime;
7264822f 431 TGraph * graph = new TGraph(out,x,y);
432 delete [] x;
433 delete [] y;
434 return graph;
435}
989362ab 436
437//_____________________________________________________________________________
438void AliDCSSensorArray::RemoveGraphDuplicates(Double_t tolerance){
439//
440// Remove points with same y value as the previous measured point
441// (to save space for non-fitted graphs -- i.e. last measured point used)
442//
443 Int_t nsensors = fSensors->GetEntries();
444 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
445 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
446 TGraph *graph = entry->GetGraph();
447 Double_t x=-999.,y=-999., x0=-999.,y0=-999.;
448 if (graph) {
449 Int_t npoints=graph->GetN();
450 if (npoints>1) {
451 for (Int_t i=npoints-1;i>0;i--) {
452 graph->GetPoint(i,x,y);
453 graph->GetPoint(i-1,x0,y0);
454 if ( fabs(y-y0) < fabs(tolerance*y0) ) graph->RemovePoint(i);
455 }
456 }
457 }
458 }
459}
460
7264822f 461
462//_____________________________________________________________________________
463AliDCSSensor* AliDCSSensorArray::GetSensor(Int_t IdDCS)
464{
465 //
466 // Return sensor information for sensor specified by IdDCS
467 //
468 Int_t nsensors = fSensors->GetEntries();
469 for (Int_t isensor=0; isensor<nsensors; isensor++) {
470 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
471 if (entry->GetIdDCS() == IdDCS) return entry;
472 }
473 return 0;
474}
475//_____________________________________________________________________________
82dfb6c8 476AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID)
24938b4c 477{
478 //
9663477d 479 // Return sensor information for sensor specified by stringID
24938b4c 480 //
481 Int_t nsensors = fSensors->GetEntries();
482 for (Int_t isensor=0; isensor<nsensors; isensor++) {
483 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
484 if (entry->GetStringID() == stringID) return entry;
485 }
486 return 0;
487}
488//_____________________________________________________________________________
82dfb6c8 489AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z)
7264822f 490{
491 //
492 // Return sensor closest to given position
493 //
494 Int_t nsensors = fSensors->GetEntries();
495 Double_t dist2min=1e99;
496 Double_t xs,ys,zs,dist2;
497 Int_t ind=-1;
498 for (Int_t isensor=0; isensor<nsensors; isensor++) {
499 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
500 xs = entry->GetX();
501 ys = entry->GetY();
502 zs = entry->GetZ();
503 dist2 = (x-xs)*(x-xs) + (y-ys)*(y-ys) + (z-zs)*(z-zs);
504 if (dist2 < dist2min) {
505 ind=isensor;
506 dist2min = dist2;
82dfb6c8 507 }
7264822f 508 }
509 if ( ind >= 0 ) {
510 return (AliDCSSensor*)fSensors->At(ind);
511 } else {
512 return 0;
513 }
514}
bf84b403 515//_____________________________________________________________________________
82dfb6c8 516AliDCSSensor* AliDCSSensorArray::GetSensorNum(Int_t ind)
8cb8848e 517{
518 //
519 // Return sensor given by array index
520 //
521 return (AliDCSSensor*)fSensors->At(ind);
522}
523
9663477d 524//_____________________________________________________________________________
525Int_t AliDCSSensorArray::SetSensor(const TString& stringID,
526 const AliDCSSensor& sensor)
527{
528 //
529 // Update sensor information for sensor specified by stringID
530 //
531 Int_t nsensors = fSensors->GetEntries();
532 for (Int_t isensor=0; isensor<nsensors; isensor++) {
533 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
534 if (entry->GetStringID() == stringID)
535 {
536 new ((*fSensors)[isensor])AliDCSSensor(sensor);
537 return isensor;
538 }
539 }
540 return -1;
541}
542//_____________________________________________________________________________
543void AliDCSSensorArray::SetSensorNum(const Int_t ind, const AliDCSSensor& sensor)
544{
545 //
546 // Update sensor information for sensor at index ind
547 //
548 new ((*fSensors)[ind])AliDCSSensor(sensor);
549 return;
550}
bf84b403 551//_____________________________________________________________________________
82dfb6c8 552void AliDCSSensorArray::RemoveSensorNum(Int_t ind)
553{
554 //
555 // Return sensor given by array index
556 //
557
558 delete fSensors->RemoveAt(ind);
559 fSensors->Compress();
560}
bf84b403 561//_____________________________________________________________________________
82dfb6c8 562void AliDCSSensorArray::RemoveSensor(Int_t IdDCS)
563{
564 //
565 // Deletes Sensor by given IdDCS
566 //
567
568 Int_t nsensors = fSensors->GetEntries();
569 for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over sensors
570 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
571 if (entry->GetIdDCS()==IdDCS) {
572 delete fSensors->RemoveAt(isensor);
573 break;
574 }
575 }
576 fSensors->Compress();
577}
bf84b403 578//_____________________________________________________________________________
579TArrayI AliDCSSensorArray::OutsideThreshold(Double_t threshold, UInt_t timeSec, Bool_t below) const
580{
581 //
582 // Return sensors with values outside threshold at time defined by second
583 // parameter
584 // By default sensors with values below threshold are listed, if third
585 // parameter is set to kFALSE sensors with values above threshold are listed
586 //
587 Int_t nsensors = fSensors->GetEntries();
588 TArrayI array(nsensors);
589 Int_t outside=0;
590 for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over sensors
591 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
0baf4718 592 Double_t val=entry->GetValue(timeSec);
bf84b403 593 if (below) {
594 if (val<threshold) array[outside++] = entry->GetIdDCS();
595 } else {
596 if (val>threshold) array[outside++] = entry->GetIdDCS();
597 }
598 }
599 array.Set(outside);
600 return array;
601}
602
603//_____________________________________________________________________________
8cb8848e 604Int_t AliDCSSensorArray::GetFirstIdDCS() const
605{
606 //
607 // Return DCS Id of first sensor
608 //
609 if ( fSensors != 0 ) {
610 return ((AliDCSSensor*)fSensors->At(0))->GetIdDCS();
611 } else {
612 return 0;
613 }
614}
615
bf84b403 616//_____________________________________________________________________________
8cb8848e 617Int_t AliDCSSensorArray::GetLastIdDCS() const
618{
619 //
620 // Return DCS Id of last sensor
621 //
622 if ( fSensors != 0 ) {
623 Int_t last = fSensors->GetEntries();
624 return ((AliDCSSensor*)fSensors->At(last-1))->GetIdDCS();
625 } else {
626 return 0;
627 }
628}
bf84b403 629//_____________________________________________________________________________
24938b4c 630void AliDCSSensorArray::ClearGraph()
631{
632 //
633 // Delete DCS graphs from all sensors in array
634 //
635
636 Int_t nsensors = fSensors->GetEntries();
637 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
638 AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
639 TGraph *gr = sensor->GetGraph();
640 if ( gr != 0 ) {
641 delete gr;
642 gr = 0;
643 }
644 sensor->SetGraph(0);
82dfb6c8 645 }
646}
bf84b403 647//_____________________________________________________________________________
24938b4c 648void AliDCSSensorArray::ClearFit()
649{
650 //
651 // Delete spline fits from all sensors in array
652 //
82dfb6c8 653
24938b4c 654 Int_t nsensors = fSensors->GetEntries();
655 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
656 AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
657 AliSplineFit *fit = sensor->GetFit();
658 if ( fit != 0 ) {
659 delete fit;
660 fit = 0;
661 }
662 sensor->SetFit(0);
82dfb6c8 663 }
664}
e7097603 665//_____________________________________________________________________________
666void AliDCSSensorArray::AddSensors(AliDCSSensorArray *newSensors)
667{
668 //
669 // add sensors from two sensor arrays
670 //
671
672 Int_t numNew = newSensors->NumSensors();
673 Int_t numOld = fSensors->GetEntries();
674 fSensors->Expand(numOld+numNew);
675 for (Int_t i=0;i<numNew;i++) {
676 AliDCSSensor *sens = newSensors->GetSensorNum(i);
677 new ((*fSensors)[numOld+i]) AliDCSSensor(*sens);
678 }
679}
680