AliT0CalibSeasonTimeShift::AliT0CalibSeasonTimeShift():TNamed()
{
//
-
+ for (Int_t i=0; i<4; i++)
+ fMeanPar[i] = fSigmaPar[i] = 0;
}
//________________________________________________________________
TString namst = "Calib_";
namst += name;
SetName(namst.Data());
- SetTitle(namst.Data());
+ SetTitle(namst.Data());
+
+ for (Int_t i=0; i<4; i++)
+ fMeanPar[i] = fSigmaPar[i] = 0;
+
}
//________________________________________________________________
// copy constructor
SetName(calibda.GetName());
SetTitle(calibda.GetName());
+ ((AliT0CalibSeasonTimeShift &) calibda).Copy(*this);
}
// assignment operator
SetName(calibda.GetName());
SetTitle(calibda.GetName());
+ if (this != &calibda) ((AliT0CalibSeasonTimeShift &) calibda).Copy(*this);
return *this;
}
}
//________________________________________________________________
-void AliT0CalibSeasonTimeShift::SetT0Par(Float_t par[4],Float_t spar[4])
+Bool_t AliT0CalibSeasonTimeShift::SetT0Par(Float_t par[4],Float_t spar[4])
{
- for (Int_t i=0; i<4; i++)
+ Bool_t ok=false;
+ for (Int_t i=0; i<4; i++)
{
fMeanPar[i] = par[i];
fSigmaPar[i] = spar[i];
+ if ( fSigmaPar[i] == 0 || fSigmaPar[i] > 500) ok = false;
}
-
+ return ok;
}
//________________________________________________________________
-void AliT0CalibSeasonTimeShift::SetT0Par(const char* filePhys)
+Int_t AliT0CalibSeasonTimeShift::SetT0Par(const char* filePhys, Float_t *cdbtime)
{
+ // compute shifts fo T0A, T0C, T0AC and resolution
+ //Status : writeok:
+ // 0 OK
+ // 2000 - no data file
+ // 300 no one histogram or it is empty
+ //-100 peak is very narrow
+
+ Float_t mean, sigma;
+ Int_t ok = 0;
+ TH1F *cfd = NULL;
+ TObjArray * tzeroObj = NULL;
gFile = TFile::Open(filePhys);
if(!gFile) {
AliError("No input PHYS data found ");
+ return 2000;
}
- else
- {
- gFile->ls();
-
- TString histname[4]={"meanAC", "meanA", "meanC", "resolution"};
- for (Int_t i=0; i<4; i++)
- {
- TH1F *cfd = (TH1F*) gFile->Get(histname[i].Data());
- if(!cfd) AliWarning(Form("no histograms collected for %s", histname[i].Data()));
- if(cfd) {
- TF1 *g = new TF1("g", "gaus",-2,2);
- cfd->Fit("g"," ","Q",-2,2);
- Double_t par[3];
- g->GetParameters(&par[0]);
- fMeanPar[i] = par[1];
- fSigmaPar[i]=par[2];
-
+ else {
+ // gFile->ls();
+ // TDirectory *dr = (TDirectory*) gFile->Get("T0Calib");
+ tzeroObj = dynamic_cast<TObjArray*>(gFile->Get("T0Calib"));
+ TString histname[4]={"fTzeroORAplusORC", "fTzeroORA", "fTzeroORC", "fResolution"};
+ for (Int_t i=0; i<4; i++)
+ {
+ if(cfd) cfd->Reset();
+ if(tzeroObj)
+ cfd = (TH1F*)tzeroObj->FindObject( histname[i].Data());
+ else
+ cfd = (TH1F*)gFile ->Get(histname[i].Data());
+
+ if(!cfd) {
+ AliError(Form("no histograms collected for %s", histname[i].Data()));
+ return 300;
+ }
+ if(cfd) {
+ if( cfd->GetEntries() == 0) {
+ AliError(Form("%s histogram is empty", histname[i].Data()));
+ return 300;
}
- }
+ GetMeanAndSigma(cfd, mean, sigma);
+ if (sigma == 0 || sigma > 600 || cfd->GetEntries()<50 ){ //!!!
+ AliError(Form("%s low statsitics or bad histogram, OCDB value is = %f", histname[i].Data(), cdbtime[i]) );
+ return 400;
+ }
+ if ( sigma > 0 && sigma < 600 && cfd->GetEntries()>=50) //!!!
+ {
+ fMeanPar[i] = mean;
+ fSigmaPar[i] = sigma;
+ }
+ }
+ }
+ }
+ gFile->Close();
+ delete gFile;
+ return ok;
+}
+//________________________________________________________________________
+void AliT0CalibSeasonTimeShift::GetMeanAndSigma(TH1F* hist, Float_t &mean, Float_t &sigma) {
- gFile->Close();
- delete gFile;
-
- }
-
+ const double window =3.; //fit window
+
+ double meanEstimate, sigmaEstimate;
+ int maxBin;
+ maxBin = hist->GetMaximumBin(); //position of maximum
+ meanEstimate = hist->GetBinCenter( maxBin); // mean of gaussian sitting in maximum
+ 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","R","");
+
+ mean = (Float_t) fit->GetParameter(1);
+ sigma = (Float_t) fit->GetParameter(2);
+
+ delete fit;
}