#include "AliADDataDCS.h"
#include "AliDCSValue.h"
#include "AliLog.h"
#include <TGraph.h>
#include <TAxis.h>
#include <TCanvas.h>
#include <TTimeStamp.h>
#include <TMap.h>
#include <TString.h>
#include <TObjString.h>
#include <TH1F.h>
class TH2;
class AliCDBMetaData;
class TDatime;
ClassImp(AliADDataDCS)
AliADDataDCS::AliADDataDCS():
TObject(),
fRun(0),
fStartTime(0),
fEndTime(0),
fDaqStartTime(0),
fDaqEndTime(0),
fCtpStartTime(0),
fCtpEndTime(0),
fGraphs("TGraph",kNGraphs),
fFEEParameters(NULL),
fIsProcessed(kFALSE)
{
for(int i=0;i<kNHvChannel;i++) {
fDeadChannel[i] = kFALSE;
fMeanHV[i] = 100.0;
fWidthHV[i] = 0.0;
fHv[i] = NULL;
}
}
AliADDataDCS::AliADDataDCS(Int_t nRun, UInt_t startTime, UInt_t endTime, UInt_t daqStartTime, UInt_t daqEndTime, UInt_t ctpStartTime, UInt_t ctpEndTime):
TObject(),
fRun(nRun),
fStartTime(startTime),
fEndTime(endTime),
fDaqStartTime(daqStartTime),
fDaqEndTime(daqEndTime),
fCtpStartTime(ctpStartTime),
fCtpEndTime(ctpEndTime),
fGraphs("TGraph",kNGraphs),
fFEEParameters(new TMap()),
fIsProcessed(kFALSE)
{
for(int i=0;i<kNHvChannel;i++) {
fDeadChannel[i] = kFALSE;
fMeanHV[i] = 100.0;
fWidthHV[i] = 0.0;
}
AliInfo(Form("\n\tRun %d \n\tTime Created %s \n\tTime Completed %s \n\tDAQ start %s \n\tDAQ end %s \n\tCTP start %s \n\tCTP end %s ", nRun,
TTimeStamp(startTime).AsString(),
TTimeStamp(endTime).AsString(),
TTimeStamp(daqStartTime).AsString(),
TTimeStamp(daqEndTime).AsString(),
TTimeStamp(ctpStartTime).AsString(),
TTimeStamp(ctpEndTime).AsString()
));
fFEEParameters->SetOwnerValue();
Init();
}
AliADDataDCS::~AliADDataDCS() {
fGraphs.Clear("C");
delete fFEEParameters;
}
Bool_t AliADDataDCS::ProcessData(TMap& aliasMap){
Bool_t success = kTRUE;
if(!(fAliasNames[0])) Init();
TObjArray *aliasArr;
AliDCSValue* aValue;
for(int iAlias=0; iAlias<kNAliases; iAlias++){
aliasArr = (TObjArray*) aliasMap.GetValue(fAliasNames[iAlias].Data());
if(!aliasArr){
AliError(Form("Alias %s not found!", fAliasNames[iAlias].Data()));
success = kFALSE;
continue;
}
if(aliasArr->GetEntries()<2){
AliWarning(Form("Alias %s has just %d entries!",
fAliasNames[iAlias].Data(),aliasArr->GetEntries()));
}
TIter iterarray(aliasArr);
if(iAlias<kNHvChannel){
Int_t nentries = aliasArr->GetEntries();
Double_t *times = new Double_t[nentries];
Double_t *values = new Double_t[nentries];
UInt_t iValue=0;
Float_t variation = 0.0;
while((aValue = (AliDCSValue*) iterarray.Next())) {
UInt_t currentTime = aValue->GetTimeStamp();
values[iValue] = aValue->GetFloat();
times[iValue] = (Double_t) (currentTime);
if(iValue>0) {
if(values[iValue-1]>0.) variation = TMath::Abs(values[iValue]-values[iValue-1])/values[iValue-1];
if(variation > 0.01) fDeadChannel[GetOfflineChannel(iAlias)] = kTRUE;
}
fHv[iAlias]->Fill(values[iValue]);
printf("%s : %s : %f Dead=%d\n",fAliasNames[iAlias].Data(),TTimeStamp(currentTime).AsString(),values[iValue],fDeadChannel[GetOfflineChannel(iAlias)]);
iValue++;
}
CreateGraph(iAlias, aliasArr->GetEntries(), times, values);
Int_t iChannel = GetOfflineChannel(iAlias);
fMeanHV[iChannel] = fHv[iAlias]->GetMean();
fWidthHV[iChannel] = fHv[iAlias]->GetRMS();
delete[] values;
delete[] times;
} else {
AliDCSValue * lastVal = NULL;
while((aValue = (AliDCSValue*) iterarray.Next())) lastVal = aValue;
fFEEParameters->Add(new TObjString(fAliasNames[iAlias].Data()),lastVal);
}
}
fIsProcessed=kTRUE;
return success;
}
void AliADDataDCS::Init(){
TString sindex;
int iAlias = 0;
for(int iPM = 0; iPM<16 ; iPM++){
fAliasNames[iAlias] = Form("AD0/HV/PM%d",iPM);
fHv[iAlias] = new TH1F(fAliasNames[iAlias].Data(),fAliasNames[iAlias].Data(), 3000, kHvMin, kHvMax);
fHv[iAlias]->GetXaxis()->SetTitle("Hv");
iAlias++;
}
for(int iCIU = 0; iCIU<2 ; iCIU++){
fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/TimeResolution",iCIU);
fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/WidthResolution",iCIU);
}
for(int iCIU = 0; iCIU<2 ; iCIU++){
fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/MatchWindow",iCIU);
fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/SearchWindow",iCIU);
fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/TriggerCountOffset",iCIU);
fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/RollOver",iCIU);
}
for(int iCIU = 0; iCIU<2 ; iCIU++){
for(int iCh=1;iCh<=8;iCh++){
fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/DelayHit%d",iCIU,iCh);
}
}
for(int iCIU = 0; iCIU<2 ; iCIU++){
for(int iCh=1;iCh<=8;iCh++){
fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/DiscriThr%d",iCIU,iCh);
}
}
if(iAlias!=kNAliases)
AliError(Form("Number of DCS Aliases defined not correct"));
}
void AliADDataDCS::Introduce(UInt_t numAlias, const TObjArray* aliasArr)const
{
int entries=aliasArr->GetEntries();
AliInfo(Form("************ Alias: %s **********",fAliasNames[numAlias].Data()));
AliInfo(Form(" %d DP values collected",entries));
}
void AliADDataDCS::CreateGraph(int i, int dim, const Double_t *x, const Double_t *y)
{
TGraph *gr = new(fGraphs[fGraphs.GetEntriesFast()]) TGraph(dim, x, y);
gr->GetXaxis()->SetTimeDisplay(1);
gr->SetTitle(fAliasNames[i].Data());
AliInfo(Form("Array entries: %d",fGraphs.GetEntriesFast()));
}
void AliADDataDCS::Draw(const Option_t* )
{
if(!fIsProcessed) return;
if(fGraphs.GetEntries()==0) return;
TCanvas *cHV = new TCanvas("AD0_HV","AD0_HV");
cHV->Divide(4,4);
for(int iPM = 0; iPM<16 ; iPM++){
cHV->cd(iPM+1);
((TGraph*) fGraphs.UncheckedAt(iPM))->SetMarkerStyle(20);
((TGraph*) fGraphs.UncheckedAt(iPM))->Draw("ALP");
}
}