]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliDCSSensorArray.cxx
Fixing in/out tags in documentation
[u/mrichter/AliRoot.git] / STEER / AliDCSSensorArray.cxx
index 7d922375a973700d299d2d8aa6fafe56a4229799..64e9fa9db9991d09399f9f35e362d42623a64543 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "AliDCSSensorArray.h"
 #include "AliLog.h"
+#include <TMath.h>
 
 ClassImp(AliDCSSensorArray)
 
@@ -84,8 +85,12 @@ AliDCSSensorArray::AliDCSSensorArray(Int_t run, const char* dbEntry) :
   //
 
   AliCDBEntry *entry = AliCDBManager::Instance()->Get(dbEntry,run);
-  TTree *tree = (TTree*) entry->GetObject();
-  fSensors = AliDCSSensor::ReadTree(tree);
+  if (entry) {
+    TTree *tree = (TTree*) entry->GetObject();
+    fSensors = AliDCSSensor::ReadTree(tree);
+  } else {
+    AliError("Unable to load configuration from CDB!");
+  }
 }
 //_____________________________________________________________________________
 AliDCSSensorArray::AliDCSSensorArray(UInt_t startTime, UInt_t endTime,
@@ -230,7 +235,7 @@ void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap)
       fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
       fit->SplineFit(fFitReq);
       fit->Cleanup();
-      if (fit) {
+      if (fit->GetKnots()>0) {
         entry->SetFit(fit);
       } else {
         AliWarning(Form("sensor %s: no fit performed, DCS graph kept.",stringID.Data()));
@@ -283,7 +288,7 @@ void AliDCSSensorArray::MakeSplineFitAddPoints(TMap *map)
     fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
     fit->SplineFit(fFitReq);
     fit->Cleanup();
-    if (fit) {
+    if (fit->GetKnots()>0) {
       AliSplineFit *oldFit = entry->GetFit();
       if (oldFit) delete oldFit;
       entry->SetFit(fit);
@@ -360,6 +365,7 @@ TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap, Bool_t keepStart)
  return values;
 }
 
+
 //_____________________________________________________________________________
 TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet, Bool_t keepStart){
   //
@@ -371,7 +377,7 @@ TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet, Bool_t keepStart){
   
   Float_t *x = new Float_t[nentries];
   Float_t *y = new Float_t[nentries];
-  Int_t time0=0;
+  Int_t time0=0, previousTime=0;
   TTimeStamp firstTime(0);
   TTimeStamp lastTime(0);
   if (keepStart) { 
@@ -382,7 +388,11 @@ TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet, Bool_t keepStart){
   Int_t skipped=0;
   AliDCSValue *val = (AliDCSValue *)valueSet->At(0);
   AliDCSValue::Type type = val->GetType();
-  if ( type == AliDCSValue::kInvalid || type == AliDCSValue::kBool ) return 0;
+  if ( type == AliDCSValue::kInvalid || type == AliDCSValue::kBool ) {
+     delete [] x;
+     delete [] y;
+     return 0;
+  }
   Float_t value;
   for (Int_t i=0; i<nentries; i++){
     val = (AliDCSValue *)valueSet->At(i);
@@ -418,6 +428,8 @@ TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet, Bool_t keepStart){
       skipped=0;
     }                                        
     if (val->GetTimeStamp()-time0>1000000) continue;
+    if (val->GetTimeStamp()-previousTime < 1 ) continue;   // refuse duplicate recordings
+    previousTime=val->GetTimeStamp();
     lastTime=TTimeStamp((time_t)val->GetTimeStamp(),0);
     x[out] = (val->GetTimeStamp()-time0)/kSecInHour; // give times in fractions of hours 
     y[out] = val->GetFloat();
@@ -430,6 +442,31 @@ TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet, Bool_t keepStart){
   delete [] y;
   return graph;
 }
+
+//_____________________________________________________________________________
+void AliDCSSensorArray::RemoveGraphDuplicates(Double_t tolerance){
+//
+//   Remove points with same y value as the previous measured point
+//   (to save space for non-fitted graphs -- i.e. last measured point used)
+//
+  Int_t nsensors = fSensors->GetEntries();
+  for ( Int_t isensor=0; isensor<nsensors; isensor++) {
+    AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
+    TGraph *graph = entry->GetGraph();
+    Double_t x=-999.,y=-999., x0=-999.,y0=-999.;
+    if (graph) {
+      Int_t npoints=graph->GetN();
+      if (npoints>1) {
+        for (Int_t i=npoints-1;i>0;i--) {
+          graph->GetPoint(i,x,y);
+          graph->GetPoint(i-1,x0,y0);
+          if ( TMath::Abs(y-y0) < TMath::Abs(tolerance*y0) ) graph->RemovePoint(i);
+        }
+      }
+    }
+   }
+}    
+
   
 //_____________________________________________________________________________
 AliDCSSensor* AliDCSSensorArray::GetSensor(Int_t IdDCS) 
@@ -448,7 +485,7 @@ AliDCSSensor* AliDCSSensorArray::GetSensor(Int_t IdDCS)
 AliDCSSensor* AliDCSSensorArray::GetSensor(const TString& stringID)
 {
  //
- //  Return sensor information for sensor specified by IdDCS
+ //  Return sensor information for sensor specified by stringID
  //
  Int_t nsensors = fSensors->GetEntries();
  for (Int_t isensor=0; isensor<nsensors; isensor++) {
@@ -493,6 +530,33 @@ AliDCSSensor* AliDCSSensorArray::GetSensorNum(Int_t ind)
  return (AliDCSSensor*)fSensors->At(ind);
 }
 
+//_____________________________________________________________________________
+Int_t AliDCSSensorArray::SetSensor(const TString& stringID,
+                          const  AliDCSSensor& sensor)
+{
+ //
+ //  Update sensor information for sensor specified by stringID
+ //
+ Int_t nsensors = fSensors->GetEntries();
+ for (Int_t isensor=0; isensor<nsensors; isensor++) {
+   AliDCSSensor *entry = (AliDCSSensor*)fSensors->At(isensor);
+   if (entry->GetStringID() == stringID) 
+     {
+      new ((*fSensors)[isensor])AliDCSSensor(sensor);
+      return isensor;
+     }
+ }
+ return -1;
+}
+//_____________________________________________________________________________
+void AliDCSSensorArray::SetSensorNum(const Int_t ind, const AliDCSSensor& sensor)
+{
+ //
+ //  Update sensor information for sensor at index ind
+ //
+   new ((*fSensors)[ind])AliDCSSensor(sensor);
+   return;
+}
 //_____________________________________________________________________________
 void AliDCSSensorArray::RemoveSensorNum(Int_t ind)
 {