X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=T0%2FAliT0CalibTimeEq.cxx;h=7aabf7de1edfd42a53f75385cbecf08c49bec043;hp=128af62bd2e81d2de3ce0746542e06e54220d7c7;hb=b5e0299c8fdf3335d765848365ba77b7c18095c6;hpb=8bfd9a3e4b45c6a5c625efaf974ad803930506b6 diff --git a/T0/AliT0CalibTimeEq.cxx b/T0/AliT0CalibTimeEq.cxx index 128af62bd2e..7aabf7de1ed 100644 --- a/T0/AliT0CalibTimeEq.cxx +++ b/T0/AliT0CalibTimeEq.cxx @@ -17,43 +17,38 @@ /////////////////////////////////////////////////////////////////////////////// // // -// class for T0 calibration TM-AC-AM_6-02-2006 // +// class for T0 calibration TM-AC-AM_6-02-2006 +// equalize time shift for each time CFD channel // // /////////////////////////////////////////////////////////////////////////////// #include "AliT0CalibTimeEq.h" -#include "AliT0LookUpValue.h" #include "AliLog.h" -#include "AliRun.h" - -#include #include #include #include -#include -#include #include -#include #include - -#include -#include +#include ClassImp(AliT0CalibTimeEq) //________________________________________________________________ - AliT0CalibTimeEq::AliT0CalibTimeEq(): TNamed(), - fTimeDelayTVD(0), - fMeanT0(0) + AliT0CalibTimeEq::AliT0CalibTimeEq():TNamed(), + fMeanVertex(0), + fRmsVertex(0) { // + } //________________________________________________________________ AliT0CalibTimeEq::AliT0CalibTimeEq(const char* name):TNamed(), - fTimeDelayTVD(0), - fMeanT0(0) + fMeanVertex(0), + fRmsVertex(0) { + //constructor + TString namst = "Calib_"; namst += name; SetName(namst.Data()); @@ -61,10 +56,9 @@ AliT0CalibTimeEq::AliT0CalibTimeEq(const char* name):TNamed(), } //________________________________________________________________ -AliT0CalibTimeEq::AliT0CalibTimeEq(const AliT0CalibTimeEq& calibda) : - TNamed(calibda), - fTimeDelayTVD(0), - fMeanT0(0) +AliT0CalibTimeEq::AliT0CalibTimeEq(const AliT0CalibTimeEq& calibda):TNamed(calibda), + fMeanVertex(0), + fRmsVertex(0) { // copy constructor SetName(calibda.GetName()); @@ -87,10 +81,13 @@ AliT0CalibTimeEq &AliT0CalibTimeEq::operator =(const AliT0CalibTimeEq& calibda) AliT0CalibTimeEq::~AliT0CalibTimeEq() { // + // destrictor } //________________________________________________________________ void AliT0CalibTimeEq::Reset() { + //reset values + memset(fCFDvalue,0,120*sizeof(Float_t)); memset(fTimeEq,1,24*sizeof(Float_t)); } @@ -99,67 +96,224 @@ void AliT0CalibTimeEq::Reset() //________________________________________________________________ void AliT0CalibTimeEq::Print(Option_t*) const { + // print time values printf("\n ---- PM Arrays ----\n\n"); printf(" Time delay CFD \n"); for (Int_t i=0; i<24; i++) printf(" CFD %f ",fTimeEq[i]); + printf("\n Mean Vertex %f \n", fMeanVertex); } //________________________________________________________________ -void AliT0CalibTimeEq::ComputeOnlineParams(char* name1, char* name2, char* canv, Int_t npeaks, Double_t sigma, const char* filePhys) +Bool_t AliT0CalibTimeEq::ComputeOnlineParams(const char* filePhys) +{ + // compute online equalized time + Float_t meandiff, sigmadiff, meanver, meancfdtime, sigmacfdtime; + meandiff = sigmadiff = meanver = meancfdtime = sigmacfdtime =0; + Double_t rmsver=0; + Int_t nent=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)); + if(cfd) { + nent = Int_t(cfd->GetEntries()); + if(nent>500 ) { + if(cfd->GetRMS()>1.5 && cfd->GetRMS()<20) + GetMeanAndSigma(cfd, meandiff, sigmadiff); + if(cfd->GetRMS()<=1.5) + { + meandiff = cfd->GetMean(); + sigmadiff=cfd->GetRMS(); + } + + if(cfd->GetRMS()>20) + { + ok=false; + AliWarning(Form("Data is not good in PMT %i - mean %f rsm %f nentries %i", i,meandiff,sigmadiff , nent)); + } + } + else + { + ok=false; + AliWarning(Form(" Not enouph data in PMT %i- PMT1: %i ", i, nent)); + } + if(!cfd) AliWarning(Form("no CFD histograms collected by PHYS DA for channel %i", i)); + } + // printf(" i = %d buf1 = %s\n", i, buf1); + if(cfdtime) { + nent = Int_t(cfdtime->GetEntries()); + if(nent>500 ) { + if(cfdtime->GetRMS()>1.5 ) + GetMeanAndSigma(cfdtime,meancfdtime, sigmacfdtime); + if(cfdtime->GetRMS()<=1.5) + { + meancfdtime = cfdtime->GetMean(); + sigmacfdtime = cfdtime->GetRMS(); + } + if(sigmacfdtime>50 ) + { + ok=false; + AliWarning(Form("Data is not good enouph in PMT %i - meancfdtime %f rsm %f nentries %i", i,meancfdtime, sigmacfdtime, nent)); + } + } + } + else + { + ok=false; + AliWarning(Form(" Not enouph data in PMT in CFD peak %i - %i ", i, nent)); + } + // printf(" %i %f %f %f %f \n",i, meandiff, sigmadiff, meancfdtime, sigmacfdtime); + SetTimeEq(i,meandiff); + SetTimeEqRms(i,sigmadiff); + SetCFDvalue(i,0,meancfdtime); + SetCFDvalue(i,0,sigmacfdtime); + if (cfd) delete cfd; + if (cfdtime) delete cfdtime; + + } + TH1F *ver = (TH1F*) gFile->Get("hVertex"); + if(!ver) AliWarning("no T0 histogram collected by PHYS DA "); + if(ver) { + meanver = ver->GetMean(); + rmsver = ver->GetRMS(); + } + SetMeanVertex(meanver); + SetRmsVertex(rmsver); + + gFile->Close(); + delete gFile; + + } + return ok; +} + +//________________________________________________________________ +Bool_t AliT0CalibTimeEq::ComputeOfflineParams(const char* filePhys, Float_t *timecdb, Int_t badpmt) { - TFile *gFile = TFile::Open(filePhys); - gSystem->Load("libSpectrum"); - npeaks = 20; - sigma=3.; - Bool_t down=false; - Int_t index[20]; - TCanvas *c1 = new TCanvas(canv, canv,0,48,1280,951); - c1->Divide(4,3); - Char_t buf1[15]; - Char_t temp[10]; - Float_t p[12][3]={0.,0.,0.}; - for (Int_t i=12; i<24; i++) + // compute online equalized time + Float_t meandiff, sigmadiff, meanver, meancfdtime, sigmacfdtime; + meandiff = sigmadiff = meanver = meancfdtime = sigmacfdtime =0; + Double_t rmsver=0; + Int_t nent=0; + Bool_t ok=false; + gFile = TFile::Open(filePhys); + if(!gFile) { + AliError("No input PHYS data found "); + } + else { - c1->cd(i+1); - sprintf(buf1,name1); - sprintf(temp,"%i",i+1); - strcat (buf1,temp); - strcat (buf1,name2); - TH1F *cfd = (TH1F*) gFile->Get(buf1); - TSpectrum *s = new TSpectrum(2*npeaks,1.); - Int_t nfound = s->Search(cfd,sigma," ",0.2); - if(nfound!=0){ - Float_t *xpeak = s->GetPositionX(); - TMath::Sort(nfound, xpeak, index,down); - Float_t xp = xpeak[index[0]]; - Float_t hmax = xp+3*sigma; - Float_t hmin = xp-3*sigma; - cfd->GetXaxis()->SetRange((Int_t)hmin-20,(Int_t)hmax+20); - TF1 *g1 = new TF1("g1", "gaus", hmin, hmax); - cfd->Fit("g1","IR"); - - for(Int_t j =0; j<3; j++){ - p[i][j] = g1->GetParameter(j); - SetCFDvalue(i, j, p[i][j]); - } - SetCFDvalue(i, 3, hmin); - SetCFDvalue(i, 4, hmax); - SetTimeEq(i,p[i][2]); - // if(p[i][0]==0) - // cfd->Draw(); - - // cfd->Draw(); - } // else - // cfd->Draw(); + meandiff = sigmadiff = meanver = meancfdtime = sigmacfdtime =0; + ok=true; + TDirectory *dr = (TDirectory*) gFile->Get("T0Calib"); + TObjArray * TzeroObj = (TObjArray*) dr->Get("fTzeroObject"); + for (Int_t i=0; i<24; i++) + { + if (i != badpmt) { + TH1F *cfddiff = (TH1F*)TzeroObj->At(i); + TH1F *cfdtime = (TH1F*)TzeroObj->At(i+24); + if(!cfddiff) AliWarning(Form("no Diff histograms collected by PHYS DA for channel %i", i)); + // printf(" i = %d buf1 = %s\n", i, buf1); + if(cfddiff) { + nent = Int_t(cfddiff->GetEntries()); + if(nent>10 ) { + if(cfddiff->GetRMS()>1.5 && cfddiff->GetRMS()<30) + GetMeanAndSigma(cfddiff, meandiff, sigmadiff); + if(cfddiff->GetRMS()<=1.5) + { + meandiff = cfddiff->GetMean(); + sigmadiff = cfddiff->GetRMS(); + } + // printf(" ipmt %i meandiff %f sigmadiff %f mean %f rms %f\n", i, meandiff,sigmadiff,cfddiff->GetMean(), cfddiff->GetRMS() ); + + if(sigmadiff > 30) + { + ok=false; + AliWarning(Form("Data is not good in PMT %i - mean %f rsm %f nentries %i", i,meandiff,sigmadiff , nent)); + } + + } + else + { + ok=false; + AliWarning(Form(" Not enouph data in PMT %i- PMT1: %i ", i, nent)); + } + } + if(cfdtime) { + nent = Int_t(cfdtime->GetEntries()); + if(nent>10 ) { + if(cfdtime->GetRMS()>1.5 ) + GetMeanAndSigma(cfdtime,meancfdtime, sigmacfdtime); + if(cfdtime->GetRMS()<=1.5) + { + meancfdtime = cfdtime->GetMean(); + sigmacfdtime=cfdtime->GetRMS(); + } + if(sigmacfdtime>50) + { + ok=false; + AliWarning(Form("Data is not good enouph in PMT %i - meancfdtime %f rsm %f nentries %i", i,meancfdtime, sigmacfdtime, nent)); + } + } + else + { + ok=false; + AliWarning(Form(" Not enouph data in PMT in CFD peak %i - %i ", i, nent)); + } + } + SetTimeEq(i,timecdb[i] + meandiff); + SetTimeEqRms(i,sigmadiff); + SetCFDvalue(i,0,meancfdtime); + SetCFDvalue(i,0,sigmacfdtime); + if (cfddiff) delete cfddiff; + if (cfdtime) delete cfdtime; + } //bad pmt + } + TH1F *ver = (TH1F*) gFile->Get("hVertex"); + if(!ver) AliWarning("no T0 histogram collected by PHYS DA "); + if(ver) { + meanver = ver->GetMean(); + rmsver = ver->GetRMS(); + } + SetMeanVertex(meanver); + SetRmsVertex(rmsver); + + gFile->Close(); + delete gFile; + } - // TFile *onl = new TFile("onl.root","RECREATE"); - // this->Write("Values"); - // onl->Close(); - // delete onl; - gFile->Close(); - delete gFile; + return ok; + } + +//________________________________________________________________________ +void AliT0CalibTimeEq::GetMeanAndSigma(TH1F* hist, Float_t &mean, Float_t &sigma) { + + const double window = 5.; //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","RQ","Q"); + + mean = (Float_t) fit->GetParameter(1); + sigma = (Float_t) fit->GetParameter(2); + + delete fit; }