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);
+ 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 {
- AliWarning(Form("sensor %s: no fit performed, DCS graph kept.",stringID.Data()));
- entry->SetGraph(gr);
+ 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(gr);
+ if (keepMap) entry->SetGraph((TGraph*)gr->Clone());
}
}
//_____________________________________________________________________________
-void AliDCSSensorArray::StoreGraph(TMap *map)
+void AliDCSSensorArray::MakeSplineFitAddPoints(TMap *map)
{
//
- // Store graphs extracted from DCS
+ // 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);
+
+ // fetch old points from existing graph
+
+ TGraph *gr = entry->GetGraph();
+ if (!gr) {
+ gr = new TGraph();
+ entry->SetGraph(gr);
+ }
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;
+
+ // fetch new points from DCS map
+
+ TGraph *grAdd = (TGraph*)map->GetValue(stringID.Data());
+ if (!grAdd ) return;
+
+ // add new points to end of graph
+
+ Int_t nPointsOld=gr->GetN();
+ Int_t nPointsAdd=grAdd->GetN();
+ gr->Expand(nPointsOld+nPointsAdd);
+ gr->Set(nPointsOld+nPointsAdd);
+ Double_t *addX=grAdd->GetX();
+ Double_t *addY=grAdd->GetY();
+ for (Int_t i=0;i<nPointsAdd;i++) {
+ gr->SetPoint(nPointsOld+i,addX[i],addY[i]);
+ }
+
+ // make fit to complete graph
+
+ AliSplineFit *fit = new AliSplineFit();
+ fit->SetMinPoints(fMinGraph);
+ fit->InitKnots(gr,fMinPoints,fIter,fMaxDelta);
+ fit->SplineFit(fFitReq);
+ fit->Cleanup();
+ if (fit) {
+ AliSplineFit *oldFit = entry->GetFit();
+ if (oldFit) delete oldFit;
+ entry->SetFit(fit);
+ } else {
+ AliWarning(Form("sensor %s: no new fit performed. If available, old fit kept.",stringID.Data()));
}
- entry->SetFit(0);
- entry->SetGraph(gr);
}
}
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));
}
//_____________________________________________________________________________
-TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap)
+TMap* AliDCSSensorArray::ExtractDCS(TMap *dcsMap, Bool_t keepStart)
{
//
// Extract temperature graphs from DCS maps
if ( pair ) { // only try to read values
// if DCS object available
valueSet = (TObjArray*)pair->Value();
- TGraph *graph = MakeGraph(valueSet); // MakeGraph sets start/end time
+ TGraph *graph = MakeGraph(valueSet,keepStart); // MakeGraph sets start/end time
// per sensor
values->Add(new TObjString(stringID.Data()),graph);
entry->SetStartTime(fStartTime);
}
//_____________________________________________________________________________
-TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet){
+TGraph* AliDCSSensorArray::MakeGraph(TObjArray* valueSet, Bool_t keepStart){
//
// Make graph of temperature values read from DCS map
// (spline fit parameters will subsequently be obtained from this graph)
Int_t time0=0;
TTimeStamp firstTime(0);
TTimeStamp lastTime(0);
+ if (keepStart) {
+ firstTime = fStartTime;
+ time0 = firstTime.GetSec();
+ }
Int_t out=0;
Int_t skipped=0;
AliDCSValue *val = (AliDCSValue *)valueSet->At(0);
time0=val->GetTimeStamp();
firstTime= TTimeStamp((time_t)val->GetTimeStamp(),0);
lastTime=TTimeStamp((time_t)val->GetTimeStamp(),0);
- }
+ }
switch ( type )
{
case AliDCSValue::kFloat:
y[out] = val->GetFloat();
out++;
}
- fStartTime=firstTime;
+ if (!keepStart) fStartTime=firstTime;
fEndTime=lastTime;
TGraph * graph = new TGraph(out,x,y);
delete [] x;