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"
26 ClassImp(AliDCSSensorArray)
28 const Double_t kSecInHour = 3600.; // seconds in one hour
30 //_____________________________________________________________________________
31 AliDCSSensorArray::AliDCSSensorArray():TNamed(),
39 fStartTime (2000,1,1,0,0,0),
40 fEndTime (2000,1,1,0,0,0),
44 // AliDCSSensorArray default constructor
48 //_____________________________________________________________________________
49 AliDCSSensorArray::AliDCSSensorArray(TClonesArray *arr):TNamed(),
57 fStartTime (2000,1,1,0,0,0),
58 fEndTime (2000,1,1,0,0,0),
62 // AliDCSSensorArray special constructor taking TClonesArray from ReadList
66 //_____________________________________________________________________________
67 AliDCSSensorArray::AliDCSSensorArray(Int_t run, const char* dbEntry) :
76 fStartTime (2000,1,1,0,0,0),
77 fEndTime (2000,1,1,0,0,0),
81 // Read configuration from OCDB
84 AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry,run);
85 TTree *tree = (TTree*) entry->GetObject();
86 fSensors = AliDCSSensor::ReadTree(tree);
88 //_____________________________________________________________________________
89 AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t endTime,
99 fStartTime (2000,1,1,0,0,0),
100 fEndTime (2000,1,1,0,0,0),
105 // AliDCSSensorArray constructor for Shuttle preprocessor
106 // (confTree read from OCDB)
108 fSensors = AliDCSSensor::ReadTree(confTree);
109 fSensors->BypassStreamer(kFALSE);
110 fStartTime = TTimeStamp(startTime);
111 fEndTime = TTimeStamp(endTime);
116 //_____________________________________________________________________________
117 AliDCSSensorArray::AliDCSSensorArray(const AliDCSSensorArray &c):TNamed(c),
118 fMinGraph(c.fMinGraph),
119 fMinPoints(c.fMinPoints),
121 fMaxDelta(c.fMaxDelta),
124 fDiffCut(c.fDiffCut),
125 fStartTime (c.fStartTime),
126 fEndTime (c.fEndTime),
131 // AliDCSSensorArray copy constructor
134 ((AliDCSSensorArray &) c).Copy(*this);
138 ///_____________________________________________________________________________
139 AliDCSSensorArray::~AliDCSSensorArray()
142 // AliDCSSensorArray destructor
149 //_____________________________________________________________________________
150 AliDCSSensorArray &AliDCSSensorArray::operator=(const AliDCSSensorArray &c)
153 // Assignment operator
156 if (this != &c) ((AliDCSSensorArray &) c).Copy(*this);
161 //_____________________________________________________________________________
162 void AliDCSSensorArray::Copy(TObject &c) const
170 //_____________________________________________________________________________
171 void AliDCSSensorArray::SetGraph(TMap *map)
174 // Read graphs from DCS maps
176 Int_t nsensors = fSensors->GetEntries();
177 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
178 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
179 TString stringID = entry->GetStringID();
180 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
182 entry->SetGraph((TGraph*)gr->Clone());
188 //_____________________________________________________________________________
189 void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap)
192 // Make spline fits from DCS maps
194 Int_t nsensors = fSensors->GetEntries();
195 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
196 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
197 TString stringID = entry->GetStringID();
198 TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
199 if (gr==0 || gr->GetN() < fMinGraph) {
203 AliSplineFit *fit = new AliSplineFit();
204 fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
205 fit->SplineFit(fFitReq);
206 entry->SetStartTime(fStartTime);
207 entry->SetEndTime(fEndTime);
210 if (keepMap) entry->SetGraph(gr);
215 //_____________________________________________________________________________
216 Double_t AliDCSSensorArray::GetValue(UInt_t timeSec, Int_t sensor)
219 // Return sensor value at time timeSec (obtained from fitted function)
220 // timeSec = time in seconds from start of run
222 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(sensor);
223 return entry->GetValue(timeSec);
227 //_____________________________________________________________________________
228 TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap)
231 // Extract temperature graphs from DCS maps
233 TMap *values = new TMap;
234 TObjArray * valueSet;
235 Int_t nsensors = fSensors->GetEntries();
236 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
237 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
238 TString stringID = entry->GetStringID();
239 TPair *pair = (TPair*)dcsMap->FindObject(stringID.Data());
240 if ( pair ) { // only try to read values
241 // if DCS object available
242 valueSet = (TObjArray*)pair->Value();
243 TGraph *graph = MakeGraph(valueSet);
244 values->Add(new TObjString(stringID.Data()),graph);
250 //_____________________________________________________________________________
251 TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet){
253 // Make graph of temperature values read from DCS map
254 // (spline fit parameters will subsequently be obtained from this graph)
256 Int_t nentries = valueSet->GetEntriesFast();
257 if ( nentries == 0 ) return 0;
259 Float_t *x = new Float_t[nentries];
260 Float_t *y = new Float_t[nentries];
264 AliDCSValue *val = (AliDCSValue *)valueSet->At(0);
265 AliDCSValue::Type type = val->GetType();
266 if ( type == AliDCSValue::kInvalid || type == AliDCSValue::kBool ) return 0;
268 for (Int_t i=0; i<nentries; i++){
269 val = (AliDCSValue *)valueSet->At(i);
272 time0=val->GetTimeStamp();
276 case AliDCSValue::kFloat:
277 value = val->GetFloat();
279 case AliDCSValue::kChar:
280 value = static_cast<Float_t>(val->GetChar());
282 case AliDCSValue::kInt:
283 value = static_cast<Float_t>(val->GetInt());
285 case AliDCSValue::kUInt:
286 value = static_cast<Float_t>(val->GetUInt());
291 if (fValCut>0 && TMath::Abs(value)>fValCut) continue; // refuse values greater than cut
293 if ( out>0 && skipped<10 && TMath::Abs(value-y[out-1])>fDiffCut) {
294 skipped++; // refuse values changing
295 continue; // by > cut in one time step
299 if (val->GetTimeStamp()-time0>1000000) continue;
300 x[out] = (val->GetTimeStamp()-time0)/kSecInHour; // give times in fractions of hours
301 y[out] = val->GetFloat();
305 TGraph * graph = new TGraph(out,x,y);
311 //_____________________________________________________________________________
312 AliDCSSensor* AliDCSSensorArray::GetSensor(Int_t IdDCS)
315 // Return sensor information for sensor specified by IdDCS
317 Int_t nsensors = fSensors->GetEntries();
318 for (Int_t isensor=0; isensor<nsensors; isensor++) {
319 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
320 if (entry->GetIdDCS() == IdDCS) return entry;
324 //_____________________________________________________________________________
325 AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID)
328 // Return sensor information for sensor specified by IdDCS
330 Int_t nsensors = fSensors->GetEntries();
331 for (Int_t isensor=0; isensor<nsensors; isensor++) {
332 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
333 if (entry->GetStringID() == stringID) return entry;
337 //_____________________________________________________________________________
338 AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z)
341 // Return sensor closest to given position
343 Int_t nsensors = fSensors->GetEntries();
344 Double_t dist2min=1e99;
345 Double_t xs,ys,zs,dist2;
347 for (Int_t isensor=0; isensor<nsensors; isensor++) {
348 AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
352 dist2 = (x-xs)*(x-xs) + (y-ys)*(y-ys) + (z-zs)*(z-zs);
353 if (dist2 < dist2min) {
359 return (AliDCSSensor*)fSensors->At(ind);
365 AliDCSSensor* AliDCSSensorArray::GetSensorNum(Int_t ind)
368 // Return sensor given by array index
370 return (AliDCSSensor*)fSensors->At(ind);
373 Int_t AliDCSSensorArray::GetFirstIdDCS() const
376 // Return DCS Id of first sensor
378 if ( fSensors != 0 ) {
379 return ((AliDCSSensor*)fSensors->At(0))->GetIdDCS();
385 Int_t AliDCSSensorArray::GetLastIdDCS() const
388 // Return DCS Id of last sensor
390 if ( fSensors != 0 ) {
391 Int_t last = fSensors->GetEntries();
392 return ((AliDCSSensor*)fSensors->At(last-1))->GetIdDCS();
397 void AliDCSSensorArray::ClearGraph()
400 // Delete DCS graphs from all sensors in array
403 Int_t nsensors = fSensors->GetEntries();
404 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
405 AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
406 TGraph *gr = sensor->GetGraph();
414 void AliDCSSensorArray::ClearFit()
417 // Delete spline fits from all sensors in array
420 Int_t nsensors = fSensors->GetEntries();
421 for ( Int_t isensor=0; isensor<nsensors; isensor++) {
422 AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
423 AliSplineFit *fit = sensor->GetFit();