]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliDCSSensorArray.cxx
Announce changed
[u/mrichter/AliRoot.git] / STEER / AliDCSSensorArray.cxx
index 6336b95c7147a1868b05ee9ed50f3e9757075d6b..94341a434199a6c3ecb6194c95e47289e14ea16b 100644 (file)
@@ -22,6 +22,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "AliDCSSensorArray.h"
+#include "AliLog.h"
 
 ClassImp(AliDCSSensorArray)
 
@@ -34,8 +35,8 @@ AliDCSSensorArray::AliDCSSensorArray():TNamed(),
   fIter(10),
   fMaxDelta(0.0),
   fFitReq(2),
-  fValCut(9999999),
-  fDiffCut(9999999),
+  fValCut(-1),
+  fDiffCut(-1),
   fStartTime (2000,1,1,0,0,0),
   fEndTime   (2000,1,1,0,0,0),
   fSensors(0)
@@ -46,56 +47,95 @@ AliDCSSensorArray::AliDCSSensorArray():TNamed(),
 
 }
 //_____________________________________________________________________________
-AliDCSSensorArray::AliDCSSensorArray(Int_t prevRun, const char* dbEntry) : 
+AliDCSSensorArray::AliDCSSensorArray(TClonesArray *arr):TNamed(),
+  fMinGraph(10),
+  fMinPoints(10),
+  fIter(10),
+  fMaxDelta(0.0),
+  fFitReq(2),
+  fValCut(-1),
+  fDiffCut(-1),
+  fStartTime (2000,1,1,0,0,0),
+  fEndTime   (2000,1,1,0,0,0),
+  fSensors(arr)
+{
+  //
+  // AliDCSSensorArray special constructor taking TClonesArray from ReadList
+  //
+
+}
+//_____________________________________________________________________________
+AliDCSSensorArray::AliDCSSensorArray(Int_t run, const char* dbEntry) :
   TNamed(),
   fMinGraph(10),
   fMinPoints(10),
   fIter(10),
   fMaxDelta(0.0),
   fFitReq(2),
-  fValCut(9999999),
-  fDiffCut(9999999),
+  fValCut(-1),
+  fDiffCut(-1),
   fStartTime (2000,1,1,0,0,0),
   fEndTime   (2000,1,1,0,0,0),
   fSensors(0)
 {
   //
-  // Read positions etc. from data base entry for previous run
-  // Delete all fits and graphs
+  // Read configuration from OCDB
   //
-   AliDCSSensorArray *temp=0;
-   AliCDBEntry* entry = 
-       AliCDBManager::Instance()->Get(dbEntry,prevRun); 
-   if (entry){
-     entry->SetOwner(kTRUE);
-     temp = (AliDCSSensorArray*)entry->GetObject();
-   } 
-
-   TGraph *gr;
-   AliSplineFit* fit;
-
-// Delete previous values
-   
-   Int_t nsensors = temp->fSensors->GetEntries();
-   for ( Int_t isensor=0; isensor<nsensors; isensor++) {
-     AliDCSSensor *entry = (AliDCSSensor*)temp->fSensors->At(isensor);
-     gr = entry->GetGraph();
-     if ( gr != 0 ) {
-       delete gr;
-       gr = 0;
-     }
-     fit = entry->GetFit();
-     if ( fit != 0 ) {
-       delete fit;
-       fit = 0;
-     }
-   }    
-   
-   new (this) AliDCSSensorArray(*temp);
-   delete temp;
+
+  AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry,run);
+  TTree *tree = (TTree*) entry->GetObject();
+  fSensors = AliDCSSensor::ReadTree(tree);
+}
+//_____________________________________________________________________________
+AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t endTime,
+                       TTree* confTree) :
+  TNamed(),
+  fMinGraph(10),
+  fMinPoints(10),
+  fIter(10),
+  fMaxDelta(0.0),
+  fFitReq(2),
+  fValCut(-1),
+  fDiffCut(-1),
+  fStartTime (2000,1,1,0,0,0),
+  fEndTime   (2000,1,1,0,0,0),
+  fSensors(0)
+
+{
+  //
+  // AliDCSSensorArray constructor for Shuttle preprocessor
+  //  (confTree read from OCDB)
+  //
+  fSensors = AliDCSSensor::ReadTree(confTree);
+  fSensors->BypassStreamer(kFALSE);
+  fStartTime = TTimeStamp(startTime);
+  fEndTime   = TTimeStamp(endTime);
 }
 
 
+//_____________________________________________________________________________
+AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t endTime,
+                       TClonesArray *sensors) :
+  TNamed(),
+  fMinGraph(10),
+  fMinPoints(10),
+  fIter(10),
+  fMaxDelta(0.0),
+  fFitReq(2),
+  fValCut(-1),
+  fDiffCut(-1),
+  fStartTime (2000,1,1,0,0,0),
+  fEndTime   (2000,1,1,0,0,0),
+  fSensors(sensors)
+
+{
+  //
+  // AliDCSSensorArray constructor for Shuttle preprocessor
+  //  (TClonesArray of AliDCSSensor objects)
+  //
+  fStartTime = TTimeStamp(startTime);
+  fEndTime   = TTimeStamp(endTime);
+}
 
 //_____________________________________________________________________________
 AliDCSSensorArray::AliDCSSensorArray(const AliDCSSensorArray &c):TNamed(c),
@@ -115,8 +155,7 @@ AliDCSSensorArray::AliDCSSensorArray(const AliDCSSensorArray &c):TNamed(c),
   // AliDCSSensorArray copy constructor
   //
 
-  ((AliDCSSensorArray &) c).Copy(*this);
-
+  fSensors = (TClonesArray*)c.fSensors->Clone();
 }
 
 ///_____________________________________________________________________________
@@ -136,77 +175,95 @@ AliDCSSensorArray &AliDCSSensorArray::operator=(const AliDCSSensorArray &c)
   //
   // Assignment operator
   //
-
-  if (this != &c) ((AliDCSSensorArray &) c).Copy(*this);
+  if (this != &c) {
+     fSensors->Delete();
+     new (this) AliDCSSensorArray(c);
+     fSensors = (TClonesArray*)c.fSensors->Clone();
+  }
   return *this;
-
 }
 
-//_____________________________________________________________________________
-void AliDCSSensorArray::Copy(TObject &c) const
-{
-  //
-  // Copy function
-  //
+//____________________________________________________________________________
 
-  TObject::Copy(c);
-}
-//_____________________________________________________________________________
-void AliDCSSensorArray::SetGraph(TMap *map, const char *amandaString) 
+void AliDCSSensorArray::SetGraph(TMap *map)
 {
-  // 
-  // Read graphs from DCS maps 
   //
-  char dname[100];
+  // Read graphs from DCS maps
+  //
   Int_t nsensors = fSensors->GetEntries();
   for ( Int_t isensor=0; isensor<nsensors; isensor++) {
     AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
-    Int_t dcsSensor=entry->GetIdDCS();
-    sprintf(dname,amandaString,dcsSensor);
-    TGraph *gr = (TGraph*)map->GetValue(dname);
-    entry->SetGraph(gr);
-  } 
-}  
+    TString stringID = entry->GetStringID();
+    TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
+    if ( gr !=0 ) {
+       entry->SetGraph((TGraph*)gr->Clone());
+    } else {
+       entry->SetGraph(0);
+    }
+  }
+}
 //_____________________________________________________________________________
-void AliDCSSensorArray::MakeSplineFit(TMap *map, const char *amandaString,
-                                                               Bool_t keepMap) 
+void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap)
 {
-  // 
-  // Make spline fits from DCS maps 
   //
-  char dname[100];
+  // Make spline fits from DCS maps
+  //
   Int_t nsensors = fSensors->GetEntries();
   for ( Int_t isensor=0; isensor<nsensors; isensor++) {
     AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
-    Int_t dcsSensor=entry->GetIdDCS();
-    sprintf(dname,amandaString,dcsSensor);
-    TGraph *gr = (TGraph*)map->GetValue(dname);
-    if (gr->GetN() < fMinGraph ) continue;    
+    TString stringID = entry->GetStringID();
+    TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
+    if (!gr ) {
+      entry->SetFit(0);
+      entry->SetGraph(0);
+      AliWarning(Form("sensor %s: no input graph",stringID.Data()));
+      continue;
+    }
     AliSplineFit *fit = new AliSplineFit();
+    fit->SetMinPoints(fMinGraph);
     fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
     fit->SplineFit(fFitReq);
     entry->SetStartTime(fStartTime);
     entry->SetEndTime(fEndTime);
     fit->Cleanup();
-    entry->SetFit(fit);
+    if (fit) {
+      entry->SetFit(fit);
+    } else {
+      AliWarning(Form("sensor %s: no fit performed, DCS graph kept.",stringID.Data()));
+      entry->SetGraph(gr);
+    }
     if (keepMap) entry->SetGraph(gr);
-  } 
-}  
+  }
+}
 
 //_____________________________________________________________________________
-Double_t AliDCSSensorArray::GetValue(UInt_t timeSec, Int_t sensor) 
+Int_t AliDCSSensorArray::NumFits() const 
 {
-  // 
+ //
+ // Return number of sensors where a succesful fit has been made
+ //
+  Int_t nfit=0;
+  Int_t nsensors = fSensors->GetEntries();
+  for ( Int_t isensor=0; isensor<nsensors; isensor++) {
+    AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
+    if (entry->GetFit()) nfit++;
+  }    
+  return nfit;
+}
+//_____________________________________________________________________________
+Double_t AliDCSSensorArray::GetValue(UInt_t timeSec, Int_t sensor)
+{
+  //
   // Return sensor value at time timeSec (obtained from fitted function)
   //  timeSec = time in seconds from start of run
   //
   AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(sensor);
   return entry->GetValue(timeSec);
 }
-    
+
 
 //_____________________________________________________________________________
-TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap, const char *amandaString) 
+TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap)
 {
  //
  // Extract temperature graphs from DCS maps
@@ -216,12 +273,14 @@ TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap, const char *amandaString)
  Int_t nsensors = fSensors->GetEntries();
  for ( Int_t isensor=0; isensor<nsensors; isensor++) {
    AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
-   Int_t dcsSensor=entry->GetIdDCS();
-   TString DPname = Form (amandaString,dcsSensor);
-   TPair *pair = (TPair*)dcsMap->FindObject(DPname.Data());
-   valueSet = (TObjArray*)pair->Value();
-   TGraph *graph = MakeGraph(valueSet);
-   values->Add(new TObjString(DPname.Data()),graph);
+   TString stringID = entry->GetStringID();
+   TPair *pair = (TPair*)dcsMap->FindObject(stringID.Data());
+   if ( pair ) {                            // only try to read values
+                                            // if DCS object available
+     valueSet = (TObjArray*)pair->Value();
+     TGraph *graph = MakeGraph(valueSet);
+     values->Add(new TObjString(stringID.Data()),graph);
+   }
  }
  return values;
 }
@@ -233,9 +292,11 @@ TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet){
   //   (spline fit parameters will subsequently be obtained from this graph) 
   //
   Int_t nentries = valueSet->GetEntriesFast(); 
+  if ( nentries == 0 ) return 0;
+  
   Float_t *x = new Float_t[nentries];
   Float_t *y = new Float_t[nentries];
-  Int_t time0=0;
+  Int_t time0=fStartTime.GetSec();
   Int_t out=0;
   Int_t skipped=0;
   AliDCSValue *val = (AliDCSValue *)valueSet->At(0);
@@ -254,23 +315,25 @@ TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet){
         value = val->GetFloat();
         break;
       case AliDCSValue::kChar:
-        value = val->GetChar();
+        value = static_cast<Float_t>(val->GetChar());
        break;
       case AliDCSValue::kInt:
-        value = val->GetInt();
+        value = static_cast<Float_t>(val->GetInt());
        break;
       case AliDCSValue::kUInt:
-        value = val->GetUInt();
+        value = static_cast<Float_t>(val->GetUInt());
        break;
       default:
         continue;
     }
-    if (TMath::Abs(value)>fValCut) continue;   // refuse values greater than cut
-    if ( out>0 && skipped<10 && TMath::Abs(value-y[out-1])>fDiffCut) {
-      skipped++;                               // refuse values changing 
-      continue;                                // by > cut  in one time step
-    }                                          
-    skipped=0;                                       
+    if (fValCut>0 && TMath::Abs(value)>fValCut) continue;   // refuse values greater than cut
+    if (fDiffCut>0 ) {
+      if ( out>0 && skipped<10 && TMath::Abs(value-y[out-1])>fDiffCut) {
+        skipped++;                               // refuse values changing 
+        continue;                                // by > cut  in one time step
+      }                                          
+      skipped=0;
+    }                                        
     if (val->GetTimeStamp()-time0>1000000) continue;
     x[out] = (val->GetTimeStamp()-time0)/kSecInHour; // give times in fractions of hours 
     y[out] = val->GetFloat();
@@ -297,7 +360,20 @@ AliDCSSensor* AliDCSSensorArray::GetSensor(Int_t IdDCS)
  return 0;
 }
 //_____________________________________________________________________________
-AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z) 
+AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID)
+{
+ //
+ //  Return sensor information for sensor specified by IdDCS
+ //
+ Int_t nsensors = fSensors->GetEntries();
+ for (Int_t isensor=0; isensor<nsensors; isensor++) {
+   AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
+   if (entry->GetStringID() == stringID) return entry;
+ }
+ return 0;
+}
+//_____________________________________________________________________________
+AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z)
 {
  //
  //  Return sensor closest to given position
@@ -315,7 +391,7 @@ AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z)
    if (dist2 < dist2min) {
       ind=isensor;
       dist2min = dist2;
-   } 
+   }
  }
  if ( ind >= 0 ) {
     return (AliDCSSensor*)fSensors->At(ind);
@@ -324,7 +400,7 @@ AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z)
  }
 }
 
-AliDCSSensor* AliDCSSensorArray::GetSensorNum(Int_t ind) 
+AliDCSSensor* AliDCSSensorArray::GetSensorNum(Int_t ind)
 {
  //
  //  Return sensor given by array index
@@ -332,6 +408,32 @@ AliDCSSensor* AliDCSSensorArray::GetSensorNum(Int_t ind)
  return (AliDCSSensor*)fSensors->At(ind);
 }
 
+void AliDCSSensorArray::RemoveSensorNum(Int_t ind)
+{
+ //
+ //  Return sensor given by array index
+ //
+
+  delete fSensors->RemoveAt(ind);
+  fSensors->Compress();
+}
+void AliDCSSensorArray::RemoveSensor(Int_t IdDCS)
+{
+ //
+ //  Deletes Sensor by given IdDCS
+ //
+
+  Int_t nsensors = fSensors->GetEntries();
+  for (Int_t isensor=0; isensor<nsensors; isensor++) { // loop over sensors
+    AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
+    if (entry->GetIdDCS()==IdDCS) {
+      delete fSensors->RemoveAt(isensor);
+      break;
+    }
+  }
+  fSensors->Compress();
+}
+
 Int_t AliDCSSensorArray::GetFirstIdDCS() const
 {
  //
@@ -356,3 +458,37 @@ Int_t AliDCSSensorArray::GetLastIdDCS() const
     return 0;
  }
 }
+void AliDCSSensorArray::ClearGraph()
+{
+  //
+  // Delete DCS graphs from all sensors in array
+  //
+   
+   Int_t nsensors = fSensors->GetEntries();
+   for ( Int_t isensor=0; isensor<nsensors; isensor++) {
+     AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
+     TGraph *gr = sensor->GetGraph();
+     if ( gr != 0 ) {
+       delete gr;
+       gr = 0;
+     }
+     sensor->SetGraph(0);
+   }
+}
+void AliDCSSensorArray::ClearFit()
+{
+  //
+  // Delete spline fits from all sensors in array
+  //
+
+   Int_t nsensors = fSensors->GetEntries();
+   for ( Int_t isensor=0; isensor<nsensors; isensor++) {
+     AliDCSSensor *sensor = (AliDCSSensor*)fSensors->At(isensor);
+     AliSplineFit *fit = sensor->GetFit();
+     if ( fit != 0 ) {
+       delete fit;
+       fit = 0;
+     }
+     sensor->SetFit(0);
+   }
+}