]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliDCSSensorArray.cxx
- Protection added for null or empty input chains
[u/mrichter/AliRoot.git] / STEER / AliDCSSensorArray.cxx
index 8c94ecaf08606a382925252c0131e86a7c106f3a..94341a434199a6c3ecb6194c95e47289e14ea16b 100644 (file)
@@ -22,6 +22,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "AliDCSSensorArray.h"
+#include "AliLog.h"
 
 ClassImp(AliDCSSensorArray)
 
@@ -46,7 +47,7 @@ AliDCSSensorArray::AliDCSSensorArray():TNamed(),
 
 }
 //_____________________________________________________________________________
-AliDCSSensorArray::AliDCSSensorArray(TClonesArray *arr):TNamed(), 
+AliDCSSensorArray::AliDCSSensorArray(TClonesArray *arr):TNamed(),
   fMinGraph(10),
   fMinPoints(10),
   fIter(10),
@@ -64,7 +65,7 @@ AliDCSSensorArray::AliDCSSensorArray(TClonesArray *arr):TNamed(),
 
 }
 //_____________________________________________________________________________
-AliDCSSensorArray::AliDCSSensorArray(Int_t run, const char* dbEntry) : 
+AliDCSSensorArray::AliDCSSensorArray(Int_t run, const char* dbEntry) :
   TNamed(),
   fMinGraph(10),
   fMinPoints(10),
@@ -80,8 +81,8 @@ AliDCSSensorArray::AliDCSSensorArray(Int_t run, const char* dbEntry) :
   //
   // Read configuration from OCDB
   //
-  
-  AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry,run); 
+
+  AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry,run);
   TTree *tree = (TTree*) entry->GetObject();
   fSensors = AliDCSSensor::ReadTree(tree);
 }
@@ -102,7 +103,7 @@ AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t endTime,
 
 {
   //
-  // AliDCSSensorArray constructor for Shuttle preprocessor 
+  // AliDCSSensorArray constructor for Shuttle preprocessor
   //  (confTree read from OCDB)
   //
   fSensors = AliDCSSensor::ReadTree(confTree);
@@ -112,6 +113,29 @@ AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t 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),
@@ -131,8 +155,7 @@ AliDCSSensorArray::AliDCSSensorArray(const AliDCSSensorArray &c):TNamed(c),
   // AliDCSSensorArray copy constructor
   //
 
-  ((AliDCSSensorArray &) c).Copy(*this);
-
+  fSensors = (TClonesArray*)c.fSensors->Clone();
 }
 
 ///_____________________________________________________________________________
@@ -152,80 +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) 
+void AliDCSSensorArray::SetGraph(TMap *map)
 {
-  // 
-  // Read graphs from DCS maps 
+  //
+  // Read graphs from DCS maps
   //
   Int_t nsensors = fSensors->GetEntries();
   for ( Int_t isensor=0; isensor<nsensors; isensor++) {
     AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
-    TString stringID = entry->GetStringID();    
+    TString stringID = entry->GetStringID();
     TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
     if ( gr !=0 ) {
        entry->SetGraph((TGraph*)gr->Clone());
-    } else { 
+    } else {
        entry->SetGraph(0);
     }
-  } 
-}  
+  }
+}
 //_____________________________________________________________________________
-void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap) 
+void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap)
 {
-  // 
-  // Make spline fits from DCS maps 
+  //
+  // 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);
-    TString stringID = entry->GetStringID();    
+    TString stringID = entry->GetStringID();
     TGraph *gr = (TGraph*)map->GetValue(stringID.Data());
-    if (gr==0 || gr->GetN() < fMinGraph) { 
+    if (!gr ) {
       entry->SetFit(0);
-      continue;    
+      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) 
+TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap)
 {
  //
  // Extract temperature graphs from DCS maps
@@ -235,9 +273,9 @@ TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap)
  Int_t nsensors = fSensors->GetEntries();
  for ( Int_t isensor=0; isensor<nsensors; isensor++) {
    AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
-   TString stringID = entry->GetStringID();    
+   TString stringID = entry->GetStringID();
    TPair *pair = (TPair*)dcsMap->FindObject(stringID.Data());
-   if ( pair ) {                            // only try to read values 
+   if ( pair ) {                            // only try to read values
                                             // if DCS object available
      valueSet = (TObjArray*)pair->Value();
      TGraph *graph = MakeGraph(valueSet);
@@ -258,7 +296,7 @@ TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet){
   
   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);
@@ -322,7 +360,7 @@ AliDCSSensor* AliDCSSensorArray::GetSensor(Int_t IdDCS)
  return 0;
 }
 //_____________________________________________________________________________
-AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID) 
+AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID)
 {
  //
  //  Return sensor information for sensor specified by IdDCS
@@ -335,7 +373,7 @@ AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID)
  return 0;
 }
 //_____________________________________________________________________________
-AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z) 
+AliDCSSensor* AliDCSSensorArray::GetSensor(Double_t x, Double_t y, Double_t z)
 {
  //
  //  Return sensor closest to given position
@@ -353,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);
@@ -362,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
@@ -370,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
 {
  //
@@ -409,14 +473,14 @@ void AliDCSSensorArray::ClearGraph()
        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);
@@ -426,5 +490,5 @@ void AliDCSSensorArray::ClearFit()
        fit = 0;
      }
      sensor->SetFit(0);
-   }    
-}  
+   }
+}