#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(),
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) {
+ 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());
}
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));
}
return values;
}
+
//_____________________________________________________________________________
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) {
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();
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)
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++) {
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)
{