]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliDCSSensorArray.cxx
AliESDHeader: AliTriggerConfiguration and more trigger scalers added
[u/mrichter/AliRoot.git] / STEER / AliDCSSensorArray.cxx
index de38efe6959083c5ed24e58c78b196281df947b6..64e9fa9db9991d09399f9f35e362d42623a64543 100644 (file)
 
 #include "AliDCSSensorArray.h"
 #include "AliLog.h"
+#include <TMath.h>
 
 ClassImp(AliDCSSensorArray)
 
 const Double_t kSecInHour = 3600.; // seconds in one hour
+const UInt_t   kMinMapTime = 60;   // don't fit maps shorter than one minute
 
 //_____________________________________________________________________________
 AliDCSSensorArray::AliDCSSensorArray():TNamed(), 
@@ -83,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,
@@ -219,16 +225,22 @@ void AliDCSSensorArray::MakeSplineFit(TMap *map, Bool_t keepMap)
       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);
-    fit->Cleanup();
-    if (fit) {
-      entry->SetFit(fit);
-    } else {
-      AliWarning(Form("sensor %s: no fit performed, DCS graph kept.",stringID.Data()));
+    UInt_t timeDiff = entry->GetEndTime() - entry->GetStartTime();
+    if ( timeDiff < kMinMapTime ) {
+      AliWarning(Form("sensor %s: map length < 60 s, DCS graph kept.",stringID.Data()));
       entry->SetGraph((TGraph*)gr->Clone());
+    } else {
+      AliSplineFit *fit = new AliSplineFit();
+      fit->SetMinPoints(fMinGraph);
+      fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
+      fit->SplineFit(fFitReq);
+      fit->Cleanup();
+      if (fit->GetKnots()>0) {
+        entry->SetFit(fit);
+      } else {
+        AliWarning(Form("sensor %s: no fit performed, DCS graph kept.",stringID.Data()));
+        entry->SetGraph((TGraph*)gr->Clone());
+      }
     }
     if (keepMap) entry->SetGraph((TGraph*)gr->Clone());
   }
@@ -276,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);
@@ -301,14 +313,15 @@ Int_t AliDCSSensorArray::NumFits() const
   return nfit;
 }
 //_____________________________________________________________________________
-Double_t AliDCSSensorArray::GetValue(UInt_t timeSec, Int_t sensor)
+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);
+  return entry->GetValue(TTimeStamp((time_t)fStartTime.GetSec()+timeSec,0));
 }
 
 
@@ -352,6 +365,7 @@ TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap, Bool_t keepStart)
  return values;
 }
 
+
 //_____________________________________________________________________________
 TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet, Bool_t keepStart){
   //
@@ -363,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) { 
@@ -374,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);
@@ -410,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();
@@ -422,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) 
@@ -440,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++) {
@@ -485,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)
 {