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(startTime);
112 fEndTime = TTimeStamp(endTime);
117 //_____________________________________________________________________________
118 AliDCSSensorArray::AliDCSSensorArray(const AliDCSSensorArray &c):TNamed(c),
119 fMinGraph(c.fMinGraph),
120 fMinPoints(c.fMinPoints),
122 fMaxDelta(c.fMaxDelta),
125 fDiffCut(c.fDiffCut),
126 fStartTime (c.fStartTime),
127 fEndTime (c.fEndTime),
132 // AliDCSSensorArray copy constructor
135 ((AliDCSSensorArray &) c).Copy(*this);
139 ///_____________________________________________________________________________
140 AliDCSSensorArray::~AliDCSSensorArray()
143 // AliDCSSensorArray destructor
150 //_____________________________________________________________________________
151 AliDCSSensorArray &AliDCSSensorArray::operator=(const AliDCSSensorArray &c)
154 // Assignment operator
157 if (this != &c) ((AliDCSSensorArray &) c).Copy(*this);
162 //_____________________________________________________________________________
163 void AliDCSSensorArray::Copy(TObject &c) const
171 //_____________________________________________________________________________
172 void AliDCSSensorArray::SetGraph(TMap *map)
175 // Read graphs from DCS maps
177 Int_t nsensors = fSensors->GetEntries();
178 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
179 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
180 TString stringID = entry->GetStringID();
181 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
183 entry->SetGraph((TGraph*)gr->Clone());
189 //_____________________________________________________________________________
190 void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap)
193 // Make spline fits from DCS maps
195 Int_t nsensors = fSensors->GetEntries();
196 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
197 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
198 TString stringID = entry->GetStringID();
199 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
203 AliWarning(Form("sensor %s: no input graph",stringID.Data()));
206 AliSplineFit *fit = new AliSplineFit();
207 fit->SetMinPoints(fMinGraph);
208 fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
209 fit->SplineFit(fFitReq);
210 entry->SetStartTime(fStartTime);
211 entry->SetEndTime(fEndTime);
216 AliWarning(Form("sensor %s: no fit performed, DCS graph kept.",stringID.Data()));
219 if (keepMap) entry->SetGraph(gr);
224 //_____________________________________________________________________________
225 Double_t AliDCSSensorArray::GetValue(UInt_t timeSec, Int_t sensor)
228 // Return sensor value at time timeSec (obtained from fitted function)
229 // timeSec = time in seconds from start of run
231 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(sensor);
232 return entry->GetValue(timeSec);
236 //_____________________________________________________________________________
237 TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap)
240 // Extract temperature graphs from DCS maps
242 TMap *values = new TMap;
243 TObjArray * valueSet;
244 Int_t nsensors = fSensors->GetEntries();
245 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
246 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
247 TString stringID = entry->GetStringID();
248 TPair *pair = (TPair*)dcsMap->FindObject(stringID.Data());
249 if ( pair ) { // only try to read values
250 // if DCS object available
251 valueSet = (TObjArray*)pair->Value();
252 TGraph *graph = MakeGraph(valueSet);
253 values->Add(new TObjString(stringID.Data()),graph);
259 //_____________________________________________________________________________
260 TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet){
262 // Make graph of temperature values read from DCS map
263 // (spline fit parameters will subsequently be obtained from this graph)
265 Int_t nentries = valueSet->GetEntriesFast();
266 if ( nentries == 0 ) return 0;
268 Float_t *x = new Float_t[nentries];
269 Float_t *y = new Float_t[nentries];
270 Int_t time0=fStartTime.GetSec();
273 AliDCSValue *val = (AliDCSValue *)valueSet->At(0);
274 AliDCSValue::Type type = val->GetType();
275 if ( type == AliDCSValue::kInvalid || type == AliDCSValue::kBool ) return 0;
277 for (Int_t i=0; i<nentries; i++){
278 val = (AliDCSValue *)valueSet->At(i);
281 time0=val->GetTimeStamp();
285 case AliDCSValue::kFloat:
286 value = val->GetFloat();
288 case AliDCSValue::kChar:
289 value = static_cast<Float_t>(val->GetChar());
291 case AliDCSValue::kInt:
292 value = static_cast<Float_t>(val->GetInt());
294 case AliDCSValue::kUInt:
295 value = static_cast<Float_t>(val->GetUInt());
300 if (fValCut>0 && TMath::Abs(value)>fValCut) continue; // refuse values greater than cut
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
308 if (val->GetTimeStamp()-time0>1000000) continue;
309 x[out] = (val->GetTimeStamp()-time0)/kSecInHour; // give times in fractions of hours
310 y[out] = val->GetFloat();
314 TGraph * graph = new TGraph(out,x,y);
320 //_____________________________________________________________________________
321 AliDCSSensor* AliDCSSensorArray::GetSensor(Int_t IdDCS)
324 // Return sensor information for sensor specified by IdDCS
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;
333 //_____________________________________________________________________________
334 AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID)
337 // Return sensor information for sensor specified by IdDCS
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;
346 //_____________________________________________________________________________
347 AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z)
350 // Return sensor closest to given position
352 Int_t nsensors = fSensors->GetEntries();
353 Double_t dist2min=1e99;
354 Double_t xs,ys,zs,dist2;
356 for (Int_t isensor=0; isensor<nsensors; isensor++) {
357 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
361 dist2 = (x-xs)*(x-xs) + (y-ys)*(y-ys) + (z-zs)*(z-zs);
362 if (dist2 < dist2min) {
368 return (AliDCSSensor*)fSensors->At(ind);
374 AliDCSSensor* AliDCSSensorArray::GetSensorNum(Int_t ind)
377 // Return sensor given by array index
379 return (AliDCSSensor*)fSensors->At(ind);
382 void AliDCSSensorArray::RemoveSensorNum(Int_t ind)
385 // Return sensor given by array index
388 delete fSensors->RemoveAt(ind);
389 fSensors->Compress();
391 void AliDCSSensorArray::RemoveSensor(Int_t IdDCS)
394 // Deletes Sensor by given IdDCS
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);
405 fSensors->Compress();
408 Int_t AliDCSSensorArray::GetFirstIdDCS() const
411 // Return DCS Id of first sensor
413 if ( fSensors != 0 ) {
414 return ((AliDCSSensor*)fSensors->At(0))->GetIdDCS();
420 Int_t AliDCSSensorArray::GetLastIdDCS() const
423 // Return DCS Id of last sensor
425 if ( fSensors != 0 ) {
426 Int_t last = fSensors->GetEntries();
427 return ((AliDCSSensor*)fSensors->At(last-1))->GetIdDCS();
432 void AliDCSSensorArray::ClearGraph()
435 // Delete DCS graphs from all sensors in array
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();
449 void AliDCSSensorArray::ClearFit()
452 // Delete spline fits from all sensors in array
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();