X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PWG0%2FAliCorrectionMatrix.cxx;h=7cf9901d7cb201ccc8e769196928805ced3072f2;hb=ca468d448d20bd7bb1172d80536cfc740e6676bc;hp=04686cef5b253109d5a8b9eb5da1fe5f55b6dfe4;hpb=1afae8ff2009d0df7b55b38dec35c3c08058dabd;p=u%2Fmrichter%2FAliRoot.git diff --git a/PWG0/AliCorrectionMatrix.cxx b/PWG0/AliCorrectionMatrix.cxx index 04686cef5b2..7cf9901d7cb 100644 --- a/PWG0/AliCorrectionMatrix.cxx +++ b/PWG0/AliCorrectionMatrix.cxx @@ -27,6 +27,7 @@ AliCorrectionMatrix::AliCorrectionMatrix() : TNamed(), // default constructor } +//____________________________________________________________________ AliCorrectionMatrix::AliCorrectionMatrix(const Char_t* name, const Char_t* title) : TNamed(name, title), fhMeas(0), fhGene(0), @@ -36,8 +37,10 @@ AliCorrectionMatrix::AliCorrectionMatrix(const Char_t* name, const Char_t* title } //____________________________________________________________________ -AliCorrectionMatrix::AliCorrectionMatrix(const AliCorrectionMatrix& c) - : TNamed(c) +AliCorrectionMatrix::AliCorrectionMatrix(const AliCorrectionMatrix& c) : TNamed(c), + fhMeas(0), + fhGene(0), + fhCorr(0) { // copy constructor ((AliCorrectionMatrix &)c).Copy(*this); @@ -74,7 +77,7 @@ AliCorrectionMatrix &AliCorrectionMatrix::operator=(const AliCorrectionMatrix &c { // assigment operator - if (this != &c) + if (this != &c) ((AliCorrectionMatrix &) c).Copy(*this); return *this; @@ -99,7 +102,7 @@ void AliCorrectionMatrix::Copy(TObject& c) const //________________________________________________________________________ void AliCorrectionMatrix::SetAxisTitles(const Char_t* titleX, const Char_t* titleY, const Char_t* titleZ) -{ +{ // // method for setting the axis titles of the histograms // @@ -154,11 +157,13 @@ Long64_t AliCorrectionMatrix::Merge(TCollection* list) void AliCorrectionMatrix::Divide() { // - // divide the histograms to get the correction - // + // divides generated by measured to get the correction + // - if (!fhMeas || !fhGene) + if (!fhMeas || !fhGene || !fhCorr) { + AliDebug(AliLog::kError, "measured or generated histograms not available"); return; + } fhCorr->Divide(fhGene, fhMeas, 1, 1, "B"); @@ -170,41 +175,86 @@ void AliCorrectionMatrix::Divide() ++emptyBins; if (emptyBins > 0) - printf("INFO: In %s we have %d empty bins (of %d) in the correction map\n", GetName(), emptyBins, fhCorr->GetNbinsX() * fhCorr->GetNbinsY() * fhCorr->GetNbinsZ()); + printf("INFO: In %s we have %d empty bins (of %d) in the correction map\n", GetTitle(), emptyBins, fhCorr->GetNbinsX() * fhCorr->GetNbinsY() * fhCorr->GetNbinsZ()); +} + +//____________________________________________________________________ +void AliCorrectionMatrix::Multiply() +{ + // + // multiplies measured with correction to get the generated + // + + if (!fhMeas || !fhGene || !fhCorr) + return; + + fhGene->Multiply(fhMeas, fhCorr, 1, 1, "B"); } //____________________________________________________________________ -Bool_t AliCorrectionMatrix::LoadHistograms(Char_t* fileName, Char_t* dir) +void AliCorrectionMatrix::Add(AliCorrectionMatrix* aMatrixToAdd, Float_t c) { + // + // adds the measured and generated of aMatrixToAdd to measured and generated of this + // + // NB: the correction will naturally stay the same + + fhMeas->Add(aMatrixToAdd->GetMeasuredHistogram(), c); + fhGene->Add(aMatrixToAdd->GetGeneratedHistogram(), c); +} + + +//____________________________________________________________________ +Bool_t AliCorrectionMatrix::LoadHistograms(const Char_t* dir) { // // loads the histograms from a file + // if dir is empty a directory with the name of this object is taken (like in SaveHistogram) // - TFile* fin = TFile::Open(fileName); + if (!dir) + dir = GetName(); - if(!fin) { - //Info("LoadHistograms",Form(" %s file does not exist",fileName)); + if (!gDirectory->cd(dir)) return kFALSE; + + if (fhGene) + { + delete fhGene; + fhGene=0; } - - if(fhGene) {delete fhGene; fhGene=0;} - if(fhCorr) {delete fhCorr; fhCorr=0;} - if(fhMeas) {delete fhMeas; fhMeas=0;} - - fhMeas = (TH2F*)fin->Get(Form("%s/meas_%s", dir,GetName())); - if(!fhMeas) Info("LoadHistograms","No meas hist available"); - - fhGene = (TH2F*)fin->Get(Form("%s/gene_%s",dir, GetName())); - if(!fhGene) Info("LoadHistograms","No gene hist available"); - - fhCorr = (TH2F*)fin->Get(Form("%s/corr_%s",dir, GetName())); - if(!fhCorr) + + if (fhCorr) { - Info("LoadHistograms","No corr hist available"); - return kFALSE; + delete fhCorr; + fhCorr=0; + } + + if (fhMeas) + { + delete fhMeas; + fhMeas=0; } - - return kTRUE; + + fhMeas = dynamic_cast (gDirectory->Get("measured")); + if (!fhMeas) + Info("LoadHistograms", "No measured hist available"); + + fhGene = dynamic_cast (gDirectory->Get("generated")); + if (!fhGene) + Info("LoadHistograms", "No generated hist available"); + + fhCorr = dynamic_cast (gDirectory->Get("correction")); + + Bool_t success = kTRUE; + if (!fhCorr) + { + Info("LoadHistograms", "No correction hist available"); + success = kFALSE; + } + + gDirectory->cd(".."); + + return success; } //____________________________________________________________________ @@ -214,37 +264,125 @@ void AliCorrectionMatrix::SaveHistograms() // saves the histograms // - fhMeas ->Write(); - fhGene ->Write(); + gDirectory->mkdir(GetName()); + gDirectory->cd(GetName()); + + if (fhMeas) + fhMeas ->Write(); + + if (fhGene) + fhGene ->Write(); if (fhCorr) fhCorr->Write(); + + gDirectory->cd(".."); } //____________________________________________________________________ -void AliCorrectionMatrix::DrawHistograms() +void AliCorrectionMatrix::DrawHistograms(const Char_t* canvasName) { // - // draws all the four histograms on one TCanvas + // draws all histograms on one TCanvas + // if canvasName is 0 the name of this object is taken // - TCanvas* canvas = new TCanvas(Form("correction_%s",fName.Data()), - Form("correction_%s",fName.Data()), 800, 800); - canvas->Divide(2, 2); + if (!canvasName) + canvasName = Form("%s_canvas", GetName()); + + TCanvas* canvas = new TCanvas(canvasName, GetTitle(), 1200, 400); + canvas->Divide(3, 1); canvas->cd(1); if (fhMeas) fhMeas->Draw("COLZ"); - + canvas->cd(2); if (fhGene) + { + // work around ROOT bug #22011 + if (fhGene->GetEntries() == 0) + fhGene->SetEntries(1); fhGene->Draw("COLZ"); + } canvas->cd(3); if (fhCorr) fhCorr->Draw("COLZ"); +} + +//____________________________________________________________________ +void AliCorrectionMatrix::ReduceInformation() +{ + // this function deletes the measured and generated histograms to reduce the amount of data + // in memory + + if (fhMeas) + { + delete fhMeas; + fhMeas = 0; + } - canvas->cd(4); + if (fhGene) + { + delete fhGene; + fhGene = 0; + } +} + +//____________________________________________________________________ +void AliCorrectionMatrix::Reset(Option_t* option) +{ + // resets the histograms + + if (fhGene) + fhGene->Reset(option); + + if (fhMeas) + fhMeas->Reset(option); + + if (fhCorr) + fhCorr->Reset(option); +} + +//____________________________________________________________________ +void AliCorrectionMatrix::SetCorrectionToUnity() +{ + // sets the correction matrix to unity + + if (!fhCorr) + return; + + for (Int_t x=0; x<=fhCorr->GetNbinsX()+1; ++x) + for (Int_t y=0; y<=fhCorr->GetNbinsY()+1; ++y) + for (Int_t z=0; z<=fhCorr->GetNbinsZ()+1; ++z) + { + fhCorr->SetBinContent(x, y, z, 1); + fhCorr->SetBinError(x, y, z, 0); + } +} + +//____________________________________________________________________ +void AliCorrectionMatrix::Scale(Double_t factor) +{ + // scales the generated and measured histogram with the given factor + + Printf("Scaling histograms with %f", factor); + + fhMeas->Scale(factor); + fhGene->Scale(factor); +} + +//____________________________________________________________________ +void AliCorrectionMatrix::ResetErrorsOnCorrections() +{ + // set the errors on the correction matrix to 0 + + if (!fhCorr) + return; - // add: draw here the stat. errors of the correction histogram + for (Int_t x=0; x<=fhCorr->GetNbinsX()+1; ++x) + for (Int_t y=0; y<=fhCorr->GetNbinsY()+1; ++y) + for (Int_t z=0; z<=fhCorr->GetNbinsZ()+1; ++z) + fhCorr->SetBinError(x, y, z, 0); }