X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=T0%2FAliT0CalibTimeEq.cxx;h=472c8c3fd7ae9deede70dde211467119eeb7f81b;hb=bf855ed55e14ce679bc89663041a53cbc9f53da7;hp=195ecc57e60dc2dcc000817f0060058af1a49160;hpb=b95e8d876a19c14438c4d9721e768b0a5a3abda9;p=u%2Fmrichter%2FAliRoot.git diff --git a/T0/AliT0CalibTimeEq.cxx b/T0/AliT0CalibTimeEq.cxx index 195ecc57e60..472c8c3fd7a 100644 --- a/T0/AliT0CalibTimeEq.cxx +++ b/T0/AliT0CalibTimeEq.cxx @@ -1,3 +1,4 @@ + /************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * @@ -34,14 +35,22 @@ ClassImp(AliT0CalibTimeEq) //________________________________________________________________ - AliT0CalibTimeEq::AliT0CalibTimeEq():TNamed() + AliT0CalibTimeEq::AliT0CalibTimeEq():TNamed(), + fMeanVertex(0), + fRmsVertex(0) { // - + for(Int_t i=0; i<24; i++) { + fTimeEq[i] = 0; // Time Equalized for OCDB + fTimeEqRms[i] = -1; // RMS of Time Equalized for OCDB + for (Int_t ih=0; ih<5; ih++) fCFDvalue[i][ih] = 0; + } } //________________________________________________________________ -AliT0CalibTimeEq::AliT0CalibTimeEq(const char* name):TNamed() +AliT0CalibTimeEq::AliT0CalibTimeEq(const char* name):TNamed(), + fMeanVertex(0), + fRmsVertex(0) { //constructor @@ -49,15 +58,22 @@ AliT0CalibTimeEq::AliT0CalibTimeEq(const char* name):TNamed() namst += name; SetName(namst.Data()); SetTitle(namst.Data()); + for(Int_t i=0; i<24; i++) { + fTimeEq[i] = 0; // Time Equalized for OCDB + fTimeEqRms[i] = -1; // RMS of Time Equalized for OCDB + for (Int_t ih=0; ih<5; ih++) fCFDvalue[i][ih] = 0; + } } //________________________________________________________________ -AliT0CalibTimeEq::AliT0CalibTimeEq(const AliT0CalibTimeEq& calibda):TNamed(calibda) +AliT0CalibTimeEq::AliT0CalibTimeEq(const AliT0CalibTimeEq& calibda):TNamed(calibda), + fMeanVertex(0), + fRmsVertex(0) { // copy constructor SetName(calibda.GetName()); SetTitle(calibda.GetName()); - + ((AliT0CalibTimeEq &) calibda).Copy(*this); } @@ -68,6 +84,7 @@ AliT0CalibTimeEq &AliT0CalibTimeEq::operator =(const AliT0CalibTimeEq& calibda) SetName(calibda.GetName()); SetTitle(calibda.GetName()); + if (this != &calibda) (( AliT0CalibTimeEq &) calibda).Copy(*this); return *this; } @@ -94,42 +111,304 @@ 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 ",fTimeEq[i]); - printf("\n Mean Vertex %f \n", fMeanVertex); + for (Int_t i=0; i<24; i++) + printf(" CFD %f diff %f \n",fCFDvalue[i][0],fTimeEq[i]); } //________________________________________________________________ -void AliT0CalibTimeEq::ComputeOnlineParams(const char* filePhys) +Bool_t AliT0CalibTimeEq::ComputeOnlineParams(const char* filePhys) { // compute online equalized time - Double_t mean=0, meanver=0; + 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 { - Char_t buf1[30]; + ok=true; for (Int_t i=0; i<24; i++) { - sprintf(buf1,"CFD1-CFD%d",i+1); - TH1F *cfd = (TH1F*) gFile->Get(buf1); - if(!cfd) AliWarning(Form("no histograms collected by PHYS DA for channel %i", i)); - // printf(" i = %d buf1 = %s\n", i, buf1); - if(cfd) mean=cfd->GetMean(); - SetTimeEq(i,mean); + 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++; + // printf(" pmt %i nent %i cfd->GetRMS() %f cfd->GetMean() %f \n", + // i, nent, cfd->GetRMS(), cfd->GetMean() ); + if(okdiff<4) { + meandiff = 0; + sigmadiff = 0; + } + else + { + // printf(" OK fsle:: pmt %i nent %i cfd->GetRMS() %f cfd->GetMean() %f \n", + // i, nent, cfd->GetRMS(), cfd->GetMean() ); + 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) AliWarning("no Vertex histograms collected by PHYS DA for Zvertex"); - if(ver) meanver = ver->GetMean(); + 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) +{ + // fStatus implementation: + //ok means + // 1000 - can not open file + // for timediff + // 20 >3 histos are empty + // -11 low statistics oe empty histos in few channels; for these channels OCDB value will be written back WARNING + // for cfd + // 20 >2 histos are empty or with low statistic + // -11 if less 3 channels are empty or low statistics in few channels ;for these channels OCDB value will be written back WARNING + // + // compute offline equalized time + 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; + // TDirectory *dr = (TDirectory*) gFile->Get("T0Calib"); + tzeroObj = dynamic_cast(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]; + // ok = -11; + } + else { + AliError(Form("no histograms collected by pass0 for time %i channels ", okcfd)); + 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]; + // ok = -11; + 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)); + 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]; + ok = -11; + printf("!!!!low statstics:: pmt %i nent%i RMS %f mean %f cdbtime %f \n", + i, nent, cfdtime->GetRMS(), cfdtime->GetMean(), cfdvalue[i]); + if (okcfd>3) 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(); + } //bad pmt + } 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(); + // sigmaEstimate = 10; + 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; +}