1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 ///////////////////////////////////////////////////////////////////////////////
19 // Calibration class for DCS sensors //
20 // Authors: Marian Ivanov and Haavard Helstrup //
22 ///////////////////////////////////////////////////////////////////////////////
24 #include "AliDCSSensorArray.h"
27 ClassImp(AliDCSSensorArray)
29 const Double_t kSecInHour = 3600.; // seconds in one hour
31 //_____________________________________________________________________________
32 AliDCSSensorArray::AliDCSSensorArray():TNamed(),
40 fStartTime (2000,1,1,0,0,0),
41 fEndTime (2000,1,1,0,0,0),
45 // AliDCSSensorArray default constructor
49 //_____________________________________________________________________________
50 AliDCSSensorArray::AliDCSSensorArray(TClonesArray *arr):TNamed(),
58 fStartTime (2000,1,1,0,0,0),
59 fEndTime (2000,1,1,0,0,0),
63 // AliDCSSensorArray special constructor taking TClonesArray from ReadList
67 //_____________________________________________________________________________
68 AliDCSSensorArray::AliDCSSensorArray(Int_t run, const char* dbEntry) :
77 fStartTime (2000,1,1,0,0,0),
78 fEndTime (2000,1,1,0,0,0),
82 // Read configuration from OCDB
85 AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry,run);
86 TTree *tree = (TTree*) entry->GetObject();
87 fSensors = AliDCSSensor::ReadTree(tree);
89 //_____________________________________________________________________________
90 AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t endTime,
100 fStartTime (2000,1,1,0,0,0),
101 fEndTime (2000,1,1,0,0,0),
106 // AliDCSSensorArray constructor for Shuttle preprocessor
107 // (confTree read from OCDB)
109 fSensors = AliDCSSensor::ReadTree(confTree);
110 fSensors->BypassStreamer(kFALSE);
111 fStartTime = TTimeStamp((time_t)startTime,0);
112 fEndTime = TTimeStamp((time_t)endTime,0);
116 //_____________________________________________________________________________
117 AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t endTime,
118 TClonesArray *sensors) :
127 fStartTime (2000,1,1,0,0,0),
128 fEndTime (2000,1,1,0,0,0),
133 // AliDCSSensorArray constructor for Shuttle preprocessor
134 // (TClonesArray of AliDCSSensor objects)
136 fStartTime = TTimeStamp((time_t)startTime,0);
137 fEndTime = TTimeStamp((time_t)endTime,0);
140 //_____________________________________________________________________________
141 AliDCSSensorArray::AliDCSSensorArray(const AliDCSSensorArray &c):TNamed(c),
142 fMinGraph(c.fMinGraph),
143 fMinPoints(c.fMinPoints),
145 fMaxDelta(c.fMaxDelta),
148 fDiffCut(c.fDiffCut),
149 fStartTime (c.fStartTime),
150 fEndTime (c.fEndTime),
155 // AliDCSSensorArray copy constructor
158 fSensors = (TClonesArray*)c.fSensors->Clone();
161 ///_____________________________________________________________________________
162 AliDCSSensorArray::~AliDCSSensorArray()
165 // AliDCSSensorArray destructor
172 //_____________________________________________________________________________
173 AliDCSSensorArray &AliDCSSensorArray::operator=(const AliDCSSensorArray &c)
176 // Assignment operator
180 new (this) AliDCSSensorArray(c);
181 fSensors = (TClonesArray*)c.fSensors->Clone();
186 //____________________________________________________________________________
188 void AliDCSSensorArray::SetGraph(TMap *map)
191 // Read graphs from DCS maps
193 Int_t nsensors = fSensors->GetEntries();
194 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
195 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
196 TString stringID = entry->GetStringID();
197 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
199 entry->SetGraph((TGraph*)gr->Clone());
205 //_____________________________________________________________________________
206 void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap)
209 // Make spline fits from DCS maps
211 Int_t nsensors = fSensors->GetEntries();
212 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
213 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
214 TString stringID = entry->GetStringID();
215 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
219 AliWarning(Form("sensor %s: no input graph",stringID.Data()));
222 AliSplineFit *fit = new AliSplineFit();
223 fit->SetMinPoints(fMinGraph);
224 fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
225 fit->SplineFit(fFitReq);
230 AliWarning(Form("sensor %s: no fit performed, DCS graph kept.",stringID.Data()));
231 entry->SetGraph((TGraph*)gr->Clone());
233 if (keepMap) entry->SetGraph((TGraph*)gr->Clone());
236 //_____________________________________________________________________________
237 void AliDCSSensorArray::MakeSplineFitAddPoints(TMap *map)
240 // Make spline fits from DCS maps
242 Int_t nsensors = fSensors->GetEntries();
243 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
244 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
246 // fetch old points from existing graph
248 TGraph *gr = entry->GetGraph();
253 TString stringID = entry->GetStringID();
255 // fetch new points from DCS map
257 TGraph *grAdd = (TGraph*)map->GetValue(stringID.Data());
260 // add new points to end of graph
262 Int_t nPointsOld=gr->GetN();
263 Int_t nPointsAdd=grAdd->GetN();
264 gr->Expand(nPointsOld+nPointsAdd);
265 gr->Set(nPointsOld+nPointsAdd);
266 Double_t *addX=grAdd->GetX();
267 Double_t *addY=grAdd->GetY();
268 for (Int_t i=0;i<nPointsAdd;i++) {
269 gr->SetPoint(nPointsOld+i,addX[i],addY[i]);
272 // make fit to complete graph
274 AliSplineFit *fit = new AliSplineFit();
275 fit->SetMinPoints(fMinGraph);
276 fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
277 fit->SplineFit(fFitReq);
280 AliSplineFit *oldFit = entry->GetFit();
281 if (oldFit) delete oldFit;
284 AliWarning(Form("sensor %s: no new fit performed. If available, old fit kept.",stringID.Data()));
289 //_____________________________________________________________________________
290 Int_t AliDCSSensorArray::NumFits() const
293 // Return number of sensors where a succesful fit has been made
296 Int_t nsensors = fSensors->GetEntries();
297 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
298 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
299 if (entry->GetFit()) nfit++;
303 //_____________________________________________________________________________
304 Double_t AliDCSSensorArray::GetValue(UInt_t timeSec, Int_t sensor)
307 // Return sensor value at time timeSec (obtained from fitted function)
308 // timeSec = time in seconds from start of run
310 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(sensor);
311 return entry->GetValue(timeSec);
315 //_____________________________________________________________________________
316 TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap, Bool_t keepStart)
319 // Extract temperature graphs from DCS maps
321 TMap *values = new TMap;
322 TObjArray * valueSet;
324 // Keep global start/end times
325 // to avoid extrapolations, the fits will only be valid from first
326 // measured point to last measured point. This is consistent with hardware,
327 // as there would be a new measured point if the value changed.
329 TTimeStamp startTime=fStartTime;
330 TTimeStamp endTime=fEndTime;
332 Int_t nsensors = fSensors->GetEntries();
333 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
334 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
335 TString stringID = entry->GetStringID();
336 TPair *pair = (TPair*)dcsMap->FindObject(stringID.Data());
337 if ( pair ) { // only try to read values
338 // if DCS object available
339 valueSet = (TObjArray*)pair->Value();
340 TGraph *graph = MakeGraph(valueSet,keepStart); // MakeGraph sets start/end time
342 values->Add(new TObjString(stringID.Data()),graph);
343 entry->SetStartTime(fStartTime);
344 entry->SetEndTime(fEndTime);
347 // Reset global start/end time
348 // ..... yes, I know this won't get a prize for structured programming..:-)
350 fStartTime=startTime;
355 //_____________________________________________________________________________
356 TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet, Bool_t keepStart){
358 // Make graph of temperature values read from DCS map
359 // (spline fit parameters will subsequently be obtained from this graph)
361 Int_t nentries = valueSet->GetEntriesFast();
362 if ( nentries == 0 ) return 0;
364 Float_t *x = new Float_t[nentries];
365 Float_t *y = new Float_t[nentries];
367 TTimeStamp firstTime(0);
368 TTimeStamp lastTime(0);
370 firstTime = fStartTime;
371 time0 = firstTime.GetSec();
375 AliDCSValue *val = (AliDCSValue *)valueSet->At(0);
376 AliDCSValue::Type type = val->GetType();
377 if ( type == AliDCSValue::kInvalid || type == AliDCSValue::kBool ) return 0;
379 for (Int_t i=0; i<nentries; i++){
380 val = (AliDCSValue *)valueSet->At(i);
383 time0=val->GetTimeStamp();
384 firstTime= TTimeStamp((time_t)val->GetTimeStamp(),0);
385 lastTime=TTimeStamp((time_t)val->GetTimeStamp(),0);
389 case AliDCSValue::kFloat:
390 value = val->GetFloat();
392 case AliDCSValue::kChar:
393 value = static_cast<Float_t>(val->GetChar());
395 case AliDCSValue::kInt:
396 value = static_cast<Float_t>(val->GetInt());
398 case AliDCSValue::kUInt:
399 value = static_cast<Float_t>(val->GetUInt());
404 if (fValCut>0 && TMath::Abs(value)>fValCut) continue; // refuse values greater than cut
406 if ( out>0 && skipped<10 && TMath::Abs(value-y[out-1])>fDiffCut) {
407 skipped++; // refuse values changing
408 continue; // by > cut in one time step
412 if (val->GetTimeStamp()-time0>1000000) continue;
413 lastTime=TTimeStamp((time_t)val->GetTimeStamp(),0);
414 x[out] = (val->GetTimeStamp()-time0)/kSecInHour; // give times in fractions of hours
415 y[out] = val->GetFloat();
418 if (!keepStart) fStartTime=firstTime;
420 TGraph * graph = new TGraph(out,x,y);
426 //_____________________________________________________________________________
427 AliDCSSensor* AliDCSSensorArray::GetSensor(Int_t IdDCS)
430 // Return sensor information for sensor specified by IdDCS
432 Int_t nsensors = fSensors->GetEntries();
433 for (Int_t isensor=0; isensor<nsensors; isensor++) {
434 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
435 if (entry->GetIdDCS() == IdDCS) return entry;
439 //_____________________________________________________________________________
440 AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID)
443 // Return sensor information for sensor specified by IdDCS
445 Int_t nsensors = fSensors->GetEntries();
446 for (Int_t isensor=0; isensor<nsensors; isensor++) {
447 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
448 if (entry->GetStringID() == stringID) return entry;
452 //_____________________________________________________________________________
453 AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z)
456 // Return sensor closest to given position
458 Int_t nsensors = fSensors->GetEntries();
459 Double_t dist2min=1e99;
460 Double_t xs,ys,zs,dist2;
462 for (Int_t isensor=0; isensor<nsensors; isensor++) {
463 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
467 dist2 = (x-xs)*(x-xs) + (y-ys)*(y-ys) + (z-zs)*(z-zs);
468 if (dist2 < dist2min) {
474 return (AliDCSSensor*)fSensors->At(ind);
479 //_____________________________________________________________________________
480 AliDCSSensor* AliDCSSensorArray::GetSensorNum(Int_t ind)
483 // Return sensor given by array index
485 return (AliDCSSensor*)fSensors->At(ind);
488 //_____________________________________________________________________________
489 void AliDCSSensorArray::RemoveSensorNum(Int_t ind)
492 // Return sensor given by array index
495 delete fSensors->RemoveAt(ind);
496 fSensors->Compress();
498 //_____________________________________________________________________________
499 void AliDCSSensorArray::RemoveSensor(Int_t IdDCS)
502 // Deletes Sensor by given IdDCS
505 Int_t nsensors = fSensors->GetEntries();
506 for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over sensors
507 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
508 if (entry->GetIdDCS()==IdDCS) {
509 delete fSensors->RemoveAt(isensor);
513 fSensors->Compress();
515 //_____________________________________________________________________________
516 TArrayI AliDCSSensorArray::OutsideThreshold(Double_t threshold, UInt_t timeSec, Bool_t below) const
519 // Return sensors with values outside threshold at time defined by second
521 // By default sensors with values below threshold are listed, if third
522 // parameter is set to kFALSE sensors with values above threshold are listed
524 Int_t nsensors = fSensors->GetEntries();
525 TArrayI array(nsensors);
527 for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over sensors
528 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
529 Double_t val=entry->GetValue(timeSec);
531 if (val<threshold) array[outside++] = entry->GetIdDCS();
533 if (val>threshold) array[outside++] = entry->GetIdDCS();
540 //_____________________________________________________________________________
541 Int_t AliDCSSensorArray::GetFirstIdDCS() const
544 // Return DCS Id of first sensor
546 if ( fSensors != 0 ) {
547 return ((AliDCSSensor*)fSensors->At(0))->GetIdDCS();
553 //_____________________________________________________________________________
554 Int_t AliDCSSensorArray::GetLastIdDCS() const
557 // Return DCS Id of last sensor
559 if ( fSensors != 0 ) {
560 Int_t last = fSensors->GetEntries();
561 return ((AliDCSSensor*)fSensors->At(last-1))->GetIdDCS();
566 //_____________________________________________________________________________
567 void AliDCSSensorArray::ClearGraph()
570 // Delete DCS graphs from all sensors in array
573 Int_t nsensors = fSensors->GetEntries();
574 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
575 AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
576 TGraph *gr = sensor->GetGraph();
584 //_____________________________________________________________________________
585 void AliDCSSensorArray::ClearFit()
588 // Delete spline fits from all sensors in array
591 Int_t nsensors = fSensors->GetEntries();
592 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
593 AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
594 AliSplineFit *fit = sensor->GetFit();
602 //_____________________________________________________________________________
603 void AliDCSSensorArray::AddSensors(AliDCSSensorArray *newSensors)
606 // add sensors from two sensor arrays
609 Int_t numNew = newSensors->NumSensors();
610 Int_t numOld = fSensors->GetEntries();
611 fSensors->Expand(numOld+numNew);
612 for (Int_t i=0;i<numNew;i++) {
613 AliDCSSensor *sens = newSensors->GetSensorNum(i);
614 new ((*fSensors)[numOld+i]) AliDCSSensor(*sens);