#include "AliT0CalibTimeEq.h"
#include "AliLog.h"
#include <TFile.h>
#include <TMath.h>
#include <TF1.h>
#include <TSpectrum.h>
#include <TProfile.h>
#include <iostream>
ClassImp(AliT0CalibTimeEq)
AliT0CalibTimeEq::AliT0CalibTimeEq():TNamed(),
fMeanVertex(0),
fRmsVertex(0)
{
for(Int_t i=0; i<24; i++) {
fTimeEq[i] = 0;
fTimeEqRms[i] = -1;
for (Int_t ih=0; ih<5; ih++) fCFDvalue[i][ih] = 0;
}
}
AliT0CalibTimeEq::AliT0CalibTimeEq(const char* name):TNamed(),
fMeanVertex(0),
fRmsVertex(0)
{
TString namst = "Calib_";
namst += name;
SetName(namst.Data());
SetTitle(namst.Data());
for(Int_t i=0; i<24; i++) {
fTimeEq[i] = 0;
fTimeEqRms[i] = -1;
for (Int_t ih=0; ih<5; ih++) fCFDvalue[i][ih] = 0;
}
}
AliT0CalibTimeEq::AliT0CalibTimeEq(const AliT0CalibTimeEq& calibda):TNamed(calibda),
fMeanVertex(0),
fRmsVertex(0)
{
SetName(calibda.GetName());
SetTitle(calibda.GetName());
((AliT0CalibTimeEq &) calibda).Copy(*this);
}
AliT0CalibTimeEq &AliT0CalibTimeEq::operator =(const AliT0CalibTimeEq& calibda)
{
SetName(calibda.GetName());
SetTitle(calibda.GetName());
if (this != &calibda) (( AliT0CalibTimeEq &) calibda).Copy(*this);
return *this;
}
AliT0CalibTimeEq::~AliT0CalibTimeEq()
{
}
void AliT0CalibTimeEq::Reset()
{
memset(fCFDvalue,0,120*sizeof(Float_t));
memset(fTimeEq,1,24*sizeof(Float_t));
}
void AliT0CalibTimeEq::Print(Option_t*) const
{
printf("\n ---- PM Arrays ----\n\n");
printf(" Time delay CFD \n");
for (Int_t i=0; i<24; i++)
printf(" CFD %f diff %f \n",fCFDvalue[i][0],fTimeEq[i]);
}
Bool_t AliT0CalibTimeEq::ComputeOnlineParams(const char* filePhys)
{
Float_t meandiff, sigmadiff, meanver, meancfdtime, sigmacfdtime;
meandiff = sigmadiff = meanver = meancfdtime = sigmacfdtime =0;
Double_t rmsver=0;
Int_t nent=0;
Int_t okdiff=0;
Int_t oktime=0;
Bool_t ok=false;
gFile = TFile::Open(filePhys);
if(!gFile) {
AliError("No input PHYS data found ");
}
else
{
ok=true;
for (Int_t i=0; i<24; i++)
{
meandiff = sigmadiff = meanver = meancfdtime = sigmacfdtime =0;
TH1F *cfd = (TH1F*) gFile->Get(Form("CFD1minCFD%d",i+1));
TH1F *cfdtime = (TH1F*) gFile->Get(Form("CFD%d",i+1));
if(!cfd) {
AliWarning(Form("no Diff histograms collected by PHYS DA for channel %i", i));
okdiff++;
if(okdiff<4) {
meandiff = 0;
sigmadiff = 0;
}
else
ok = false;
}
if(!cfdtime) {
AliWarning(Form("no CFD histograms collected by PHYS DA for channel %i", i));
oktime++;
if(oktime<4) {
meancfdtime = 0;
}
else
ok = false;
}
if(cfd) {
nent = Int_t(cfd->GetEntries());
if( nent<=50) {
okdiff++;
if(okdiff<4) {
meandiff = 0;
sigmadiff = 0;
}
else
{
AliWarning(Form(" Not enouph data in PMT %i- PMT1: %i ", i, nent));
ok = false;
}
}
if(nent>50) {
if(cfd->GetRMS()>1.5 )
GetMeanAndSigma(cfd, meandiff, sigmadiff);
if(cfd->GetRMS()<=1.5)
{
meandiff = cfd->GetMean();
sigmadiff=cfd->GetRMS();
}
Int_t maxBin = cfd->GetMaximumBin();
Double_t meanEstimate = cfd->GetBinCenter( maxBin);
if(TMath::Abs(meanEstimate - meandiff) > 20 ) meandiff = meanEstimate;
}
}
if(cfdtime) {
nent = Int_t(cfdtime->GetEntries());
if( nent<=50 ) {
oktime++;
if(oktime<4) {
meancfdtime = 0;
}
else
{
AliWarning(Form(" Not enouph data in PMT %i: %i ", i, nent));
ok = false;
}
}
if(nent > 50 ) {
if(cfdtime->GetRMS()>1.5 )
GetMeanAndSigma(cfdtime,meancfdtime, sigmacfdtime);
if(cfdtime->GetRMS()<=1.5)
{
if(cfdtime->GetRMS()==0 ||cfdtime->GetMean()==0 ) {
ok = false;
}
meancfdtime = cfdtime->GetMean();
sigmacfdtime = cfdtime->GetRMS();
}
Int_t maxBin = cfdtime->GetMaximumBin();
Double_t meanEstimate = cfdtime->GetBinCenter( maxBin);
if(TMath::Abs(meanEstimate - meancfdtime) > 20 ) meancfdtime = meanEstimate;
}
}
SetTimeEq(i,meandiff);
SetTimeEqRms(i,sigmadiff);
SetCFDvalue(i,0,meancfdtime);
if (cfd) delete cfd;
if (cfdtime) delete cfdtime;
}
TH1F *ver = (TH1F*) gFile->Get("hVertex") ;
if(ver) {
meanver = ver->GetMean();
rmsver = ver->GetRMS();
}
SetMeanVertex(meanver);
SetRmsVertex(rmsver);
gFile->Close();
delete gFile;
}
return ok;
}
Int_t AliT0CalibTimeEq::ComputeOfflineParams(const char* filePhys, Float_t *timecdb, Float_t *cfdvalue, Int_t badpmt)
{
Float_t meandiff, sigmadiff, meanver, meancfdtime, sigmacfdtime;
meandiff = sigmadiff = meanver = meancfdtime = sigmacfdtime =0;
Int_t nent=0;
Int_t ok = 0;
Int_t okcfd=0;
TH1F *cfddiff = NULL;
TH1F *cfdtime = NULL;
TObjArray * tzeroObj = NULL;
gFile = TFile::Open(filePhys);
if(!gFile) {
AliError("No input PHYS data found ");
ok = 1000;
return ok;
}
else
{
meandiff = sigmadiff = meanver = meancfdtime = sigmacfdtime =0;
tzeroObj = dynamic_cast<TObjArray*>(gFile->Get("T0Calib"));
for (Int_t i=0; i<24; i++)
{
if (i != badpmt) {
if(tzeroObj) {
cfddiff = (TH1F*) tzeroObj->FindObject(Form("CFD1minCFD%d",i+1));
cfdtime = (TH1F*)tzeroObj->FindObject(Form("CFD%d",i+1));
}
else
{
cfddiff = (TH1F*)gFile->Get(Form("CFD1minCFD%d",i+1));
cfdtime = (TH1F*)gFile->Get(Form("CFD%d",i+1));
}
if(!cfddiff ) {
AliWarning(Form("no histograms collected by pass0 for diff channel %i\n", i));
meandiff = timecdb[i];
sigmadiff = 0;
}
if(cfddiff) {
nent = Int_t(cfddiff->GetEntries());
if ( nent == 0 ) {
AliWarning(Form("no entries in histogram for diff channel %i\n", i));
meandiff = timecdb[i];
sigmadiff = 0;
}
if(nent<=100 && nent>0) {
AliWarning(Form(" Not enouph data in PMT %i- PMT1: %i \n", i, nent));
meandiff = timecdb[i];
sigmadiff = 0;
}
if(nent>=100 ) {
{
if(cfddiff->GetRMS()>1.5 )
GetMeanAndSigma(cfddiff, meandiff, sigmadiff);
if(cfddiff->GetRMS()<=1.5)
{
meandiff = cfddiff->GetMean();
sigmadiff = cfddiff->GetRMS();
}
Int_t maxBin = cfddiff->GetMaximumBin();
Double_t meanEstimate = cfddiff->GetBinCenter( maxBin);
if(TMath::Abs(meanEstimate - meandiff) > 20 ) meandiff = meanEstimate;
}
}
}
if(!cfdtime ) {
AliWarning(Form("no histograms collected by pass0 for time channel %i", i));
meancfdtime = cfdvalue[i];
okcfd++;
if(okcfd<2) {
meancfdtime = cfdvalue[i];
}
else {
AliError(Form("no histograms collected by pass0 for time %i channels ", okcfd));
if (tzeroObj) delete tzeroObj;
return 20;
}
}
if(cfdtime) {
nent = Int_t(cfdtime->GetEntries());
if (nent == 0 ||
(cfdtime->GetRMS() == 0 || cfdtime->GetMean() ==0 ) )
{
okcfd++;
if(okcfd<2) {
meancfdtime = cfdvalue[i];
printf("!!!!bad data:: pmt %i nent%i RMS %f mean %f cdbtime %f \n",
i, nent, cfdtime->GetRMS(), cfdtime->GetMean(), cfdvalue[i] );
}
else
{
printf("!!!!fatal data:: pmt %i nent%i RMS %f mean %f cdbtime %f \n",
i, nent, cfdtime->GetRMS(), cfdtime->GetMean(), cfdvalue[i]);
AliError(Form(" histograms collected by pass0 for time %i channels are empty", okcfd));
if (tzeroObj) delete tzeroObj;
return 20;
}
}
if(nent<=100 && nent>0 )
{
okcfd++;
AliWarning(Form(" Not enouph data in PMT in CFD peak %i - %i ", i, nent));
meancfdtime = cfdvalue[i];
printf("!!!!low statstics:: pmt %i nent%i RMS %f mean %f cdbtime %f \n",
i, nent, cfdtime->GetRMS(), cfdtime->GetMean(), cfdvalue[i]);
if (okcfd>2) {
ok = -11;
if (tzeroObj) delete tzeroObj;
return ok;
}
}
if( nent>100 ) {
if(cfdtime->GetRMS()>1.5 )
GetMeanAndSigma(cfdtime,meancfdtime, sigmacfdtime);
if(cfdtime->GetRMS()<=1.5)
{
meancfdtime = cfdtime->GetMean();
sigmacfdtime=cfdtime->GetRMS();
}
Int_t maxBin = cfdtime->GetMaximumBin();
Double_t meanEstimate = cfdtime->GetBinCenter( maxBin);
if(TMath::Abs(meanEstimate - meancfdtime) > 20 ) meancfdtime = meanEstimate;
}
}
SetTimeEq(i,meandiff);
SetTimeEqRms(i,sigmadiff);
SetCFDvalue(i,0, meancfdtime );
if (cfddiff) cfddiff->Reset();
if (cfdtime) cfdtime->Reset();
}
}
gFile->Close();
delete gFile;
}
if (tzeroObj) delete tzeroObj;
return ok;
}
void AliT0CalibTimeEq::GetMeanAndSigma(TH1F* hist, Float_t &mean, Float_t &sigma) {
const double window = 5.;
double meanEstimate, sigmaEstimate;
int maxBin;
maxBin = hist->GetMaximumBin();
meanEstimate = hist->GetBinCenter( maxBin);
sigmaEstimate = hist->GetRMS();
TF1* fit= new TF1("fit","gaus", meanEstimate - window*sigmaEstimate, meanEstimate + window*sigmaEstimate);
fit->SetParameters(hist->GetBinContent(maxBin), meanEstimate, sigmaEstimate);
hist->Fit("fit","QR","");
mean = (Float_t) fit->GetParameter(1);
sigma = (Float_t) fit->GetParameter(2);
delete fit;
}