#include "AliDCSSensor.h"
#include "TDatime.h"
#include "TCanvas.h"
ClassImp(AliDCSSensor)
const Double_t kSecInHour = 3600.;
AliDCSSensor::AliDCSSensor():
fId(),
fIdDCS(0),
fStringID(),
fStartTime(0),
fEndTime(0),
fGraph(0),
fFit(0),
fX(0),
fY(0),
fZ(0)
{
}
AliDCSSensor::AliDCSSensor(const AliDCSSensor& source) :
TNamed(source),
fId(source.fId),
fIdDCS(source.fIdDCS),
fStringID(source.fStringID),
fStartTime(source.fStartTime),
fEndTime(source.fEndTime),
fGraph(0),
fFit(0),
fX(source.fX),
fY(source.fY),
fZ(source.fZ)
{
if (source.fGraph) fGraph = (TGraph*)source.fGraph->Clone();
if (source.fFit) fFit = (AliSplineFit*)source.fFit->Clone();
}
AliDCSSensor& AliDCSSensor::operator=(const AliDCSSensor& source){
if (&source == this) return *this;
new (this) AliDCSSensor(source);
return *this;
}
void AliDCSSensor::Print(const Option_t* option) const{
TString opt = option; opt.ToLower();
printf("%s:%s\n",GetTitle(), GetName());
printf("%s\n",fStringID.Data());
}
void AliDCSSensor::Draw(Option_t* option) {
TCanvas * canvas = new TCanvas((fStringID+option).Data(), (fStringID+option).Data());
if (fGraph){
Int_t npoints = fGraph->GetN();
for (Int_t i=0; i<npoints; i++){
fGraph->GetX()[i]=fGraph->GetX()[i]*3600+fStartTime;
}
fGraph->Draw("alp");
return;
}
canvas->cd();
TGraph * graph = MakeGraph(100);
graph->Draw(option);
}
Double_t AliDCSSensor::GetValue(UInt_t timeSec)
{
Bool_t inside=kTRUE;
return Eval(TTimeStamp((time_t)(fStartTime+timeSec),0),inside);
}
Double_t AliDCSSensor::GetValue(TTimeStamp time)
{
Bool_t inside=kTRUE;
return Eval(time, inside);
}
Double_t AliDCSSensor::Eval(const TTimeStamp& time, Bool_t& inside) const
{
UInt_t timeSec = time.GetSec();
UInt_t diff = timeSec-fStartTime;
inside = true;
if ( timeSec < fStartTime ) {
inside=false;
diff=0;
}
if ( timeSec > fEndTime ) {
inside=false;
diff = fEndTime-fStartTime;
}
Double_t timeHour = diff/kSecInHour;
if ( fFit ) {
return fFit->Eval(timeHour);
} else {
if ( fGraph ) {
return EvalGraph(timeHour);
} else {
return -99;
}
}
}
Double_t AliDCSSensor::EvalGraph(const TTimeStamp& time, Bool_t& inside) const
{
UInt_t timeSec = time.GetSec();
UInt_t diff = timeSec-fStartTime;
inside = true;
if ( timeSec < fStartTime ) {
inside=false;
diff=0;
}
if ( timeSec > fEndTime ) {
inside=false;
diff = fEndTime-fStartTime;
}
Double_t timeHour = diff/kSecInHour;
if ( fGraph ) {
return EvalGraph(timeHour);
} else {
return -99;
}
}
Double_t AliDCSSensor::EvalGraph(const Double_t& timeHour) const
{
Double_t x=0; Double_t y=0;
fGraph->GetPoint(0,x,y);
if ( timeHour < x ) return -99;
Int_t npoints = fGraph->GetN();
for (Int_t i=1; i<npoints; i++) {
fGraph->GetPoint(i,x,y);
if ( timeHour < x ) {
fGraph->GetPoint(i-1,x,y);
return y;
}
}
return y;
}
TGraph* AliDCSSensor::MakeGraph(Int_t nPoints, Bool_t debug) const
{
UInt_t stepTime = (fEndTime-fStartTime)/nPoints;
if (debug==kTRUE) {
printf ("Start time %d, End time %d, step time %d\n",
fStartTime,fEndTime,stepTime);
TTimeStamp t((time_t)fStartTime,0); t.Print();
TTimeStamp t2((time_t)fEndTime,0); t2.Print();
}
if ( !fFit ) return 0;
Double_t *x = new Double_t[nPoints+1];
Double_t *y = new Double_t[nPoints+1];
for (Int_t ip=0; ip<nPoints; ip++) {
x[ip] = (time_t)(fStartTime+ip*stepTime);
y[ip] = fFit->Eval(ip*stepTime/kSecInHour);
if (debug==kTRUE) {
TTimeStamp t3((time_t)x[ip],0);
printf ("x=%f, y=%f ",x[ip],y[ip]);
t3.Print();
}
}
TGraph *graph = new TGraph(nPoints,x,y);
delete [] x;
delete [] y;
graph->GetXaxis()->SetTimeDisplay(1);
graph->GetXaxis()->SetLabelOffset(0.02);
graph->GetXaxis()->SetTimeFormat("#splitline{%d/%m}{%H:%M}");
return graph;
}
TClonesArray * AliDCSSensor::ReadTree(TTree* tree) {
Int_t nentries = tree->GetEntries();
char stringId[100];
Int_t num=0;
Int_t idDCS=0;
Double_t x=0;
Double_t y=0;
Double_t z=0;
tree->SetBranchAddress("StringID",&stringId);
tree->SetBranchAddress("IdDCS",&idDCS);
tree->SetBranchAddress("Num",&num);
tree->SetBranchAddress("X",&x);
tree->SetBranchAddress("Y",&y);
tree->SetBranchAddress("Z",&z);
TClonesArray * array = new TClonesArray("AliDCSSensor",nentries);
printf ("nentries = %d\n",nentries);
for (Int_t isensor=0; isensor<nentries; isensor++){
AliDCSSensor * sens = new ((*array)[isensor])AliDCSSensor;
tree->GetEntry(isensor);
sens->SetId(isensor);
sens->SetIdDCS(idDCS);
sens->SetStringID(TString(stringId));
sens->SetX(x);
sens->SetY(y);
sens->SetZ(z);
}
return array;
}