/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: Ana Marin, Kathrin Koch, Kenneth Aamodt * * Version 1.1 * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ //////////////////////////////////////////////// //--------------------------------------------- // Class used to do analysis on conversion pairs //--------------------------------------------- //////////////////////////////////////////////// #include "AliGammaConversionHistograms.h" #include "TMath.h" #include "TObjString.h" #include "TMap.h" #include "TList.h" #include "TH1F.h" #include "TH2F.h" #include "TH3F.h" #include "AliLog.h" using namespace std; ClassImp(AliGammaConversionHistograms) AliGammaConversionHistograms::AliGammaConversionHistograms() : fHistogramMap(new TMap()), fNPhiIndex(0), fNRIndex(0), fNZIndex(0), // fRBinLimits(0), // fZBinLimits(0), fMinRadius(0.), fMaxRadius(0.), fDeltaR(0.), fMinPhi(0.), fMaxPhi(0.), fDeltaPhi(0.), fMappingContainer(NULL), fBackgroundContainer(NULL), fDebugContainer(NULL), fResolutionContainer(NULL), fMatchContainer(NULL), fESDContainer(NULL), fMCContainer(NULL), fTableContainer(NULL), fOtherContainer(NULL), f3DContainer(NULL), fHadContainer(NULL) { // see header file for documenation for(Int_t i=0;i<14;i++){ fRBinLimits[i]=0.; } for(Int_t i=0;i<12;i++){ fZBinLimits[i]=0.; } } AliGammaConversionHistograms::AliGammaConversionHistograms(const AliGammaConversionHistograms & original) : fHistogramMap(original.fHistogramMap), fNPhiIndex(original.fNPhiIndex), fNRIndex(original.fNRIndex), fNZIndex(original.fNZIndex), // fRBinLimits(original.fRBinLimits), // fZBinLimits(original.fZBinLimits), fMinRadius(original.fMinRadius), fMaxRadius(original.fMaxRadius), fDeltaR(original.fDeltaR), fMinPhi(original.fMinPhi), fMaxPhi(original.fMaxPhi), fDeltaPhi(original.fDeltaPhi), fMappingContainer(original.fMappingContainer), fBackgroundContainer(original.fBackgroundContainer), fDebugContainer(original.fDebugContainer), fResolutionContainer(original.fResolutionContainer), fMatchContainer(original.fMatchContainer), fESDContainer(original.fESDContainer), fMCContainer(original.fMCContainer), fTableContainer(original.fTableContainer), fOtherContainer(original.fOtherContainer), f3DContainer(original.f3DContainer), fHadContainer(original.fHadContainer) { //see header file for documentation for(Int_t i=0;i<14;i++){ fRBinLimits[i]= original.fRBinLimits[i]; } for(Int_t i=0;i<12;i++){ fZBinLimits[i]=original.fZBinLimits[i]; } } AliGammaConversionHistograms & AliGammaConversionHistograms::operator = (const AliGammaConversionHistograms & /*original*/) { // assignment operator return *this; } AliGammaConversionHistograms::~AliGammaConversionHistograms() { //destructor } void AliGammaConversionHistograms::AddHistogram(TString histogramName, TString histogramTitle, Int_t nXBins, Double_t firstX,Double_t lastX,TString xAxisTitle, TString yAxisTitle){ // see header file for documentation if( fHistogramMap->Contains(histogramName.Data()) == kFALSE ){ TH1F *tmp = new TH1F(histogramName, histogramTitle,nXBins,firstX,lastX); tmp->GetXaxis()->SetTitle(xAxisTitle); tmp->GetYaxis()->SetTitle(yAxisTitle); TObjString* tobjstring = new TObjString(histogramName.Data()); fHistogramMap->Add((TObject*)tobjstring,(TObject*)tmp); } else{ cout << "Warning: Histogram ( "<Contains(histogramName.Data()) == kFALSE ){ TH2F *tmp = new TH2F(histogramName, histogramTitle,nXBins,firstX,lastX,nYBins,firstY,lastY); tmp->GetXaxis()->SetTitle(xAxisTitle); tmp->GetYaxis()->SetTitle(yAxisTitle); TObjString *tobjstring = new TObjString(histogramName.Data()); fHistogramMap->Add((TObject*)tobjstring,(TObject*)tmp); if(logAxis >= 0){ BinLogAxis(histogramName.Data(), logAxis); } } else{ cout << "Warning: Histogram ( "<Contains(histogramName.Data()) == kFALSE ){ TH3F *tmp = new TH3F(histogramName, histogramTitle,nXBins,firstX,lastX,nYBins,firstY,lastY,nZBins,firstZ,lastZ); tmp->GetXaxis()->SetTitle(xAxisTitle); tmp->GetYaxis()->SetTitle(yAxisTitle); tmp->GetZaxis()->SetTitle(zAxisTitle); TObjString *tobjstring = new TObjString(histogramName.Data()); fHistogramMap->Add((TObject*)tobjstring,(TObject*)tmp); if(logAxis >= 0){ BinLogAxis(histogramName.Data(), logAxis); } } else{ cout << "Warning: Histogram ( "<GetValue(name); TAxis *axis = 0x0; if(o->InheritsFrom("TH1")){ axis = (dynamic_cast(o))->GetXaxis(); } if(o->InheritsFrom("TH2")){ if(0 == dim){ axis = (dynamic_cast(o))->GetXaxis(); } else if(1 == dim){ axis = (dynamic_cast(o))->GetYaxis(); } else{ // AliError("Only dim = 0 or 1 possible for TH2F"); } } // if(o->InheritsFrom("THnSparse")){ // axis = (dynamic_cast(o))->GetAxis(dim); //} if(!axis){ //AliError(Form("Axis '%d' could not be identified in the object '%s'\n", dim, name)); return kFALSE; } Int_t bins = axis->GetNbins(); Double_t from = axis->GetXmin(); if(from <= 0){ // AliError(Form(" Log binning not possible for object '%s'because the '%d' axis starts from '%f\n'", name, dim, from)); return kFALSE; } Double_t to = axis->GetXmax(); Double_t *newBins = new Double_t[bins+1]; newBins[0] = from; Double_t factor = TMath::Power(to/from, 1./bins); for(Int_t i=1; i<=bins; ++i){ newBins[i] = factor * newBins[i-1]; } axis->Set(bins, newBins); delete [] newBins; return kTRUE; } void AliGammaConversionHistograms::AddTable(TString tableName,TString tableTitle,Int_t nXBins,const char * axesLabel[]){ //see header file for documentation if( fHistogramMap->Contains(tableName.Data()) == kFALSE ){ TH1F *tmp = new TH1F(tableName,tableTitle,nXBins,0,nXBins); for(Int_t xbin=1; xbin<=nXBins; xbin++){ tmp->GetXaxis()->SetBinLabel(xbin,axesLabel[xbin-1]); } tmp->SetStats(0); TObjString *tobjstring = new TObjString(tableName.Data()); fHistogramMap->Add((TObject*)tobjstring,(TObject*)tmp); } else{ cout << "Warning: Table ( "<Contains(tableName.Data()) == kFALSE ){ TH2F *tmp = new TH2F(tableName,tableTitle,nXBins,0,nXBins,nYBins,0,nYBins); for(Int_t xbin=1; xbin<=nXBins; xbin++){ tmp->GetXaxis()->SetBinLabel(xbin,axesXLabel[xbin-1]); } for(Int_t ybin=1; ybin<=nYBins; ybin++){ tmp->GetYaxis()->SetBinLabel(ybin,axesYLabel[ybin-1]); } tmp->SetStats(0); TObjString *tobjstring = new TObjString(tableName.Data()); fHistogramMap->Add((TObject*)tobjstring,(TObject*)tmp); } else{ cout << "Warning: Table ( "<Contains(tableName.Data()) == kFALSE ){ TH3F *tmp = new TH3F(tableName,tableTitle,nXBins,0,nXBins,nYBins,0,nYBins,nZBins,0,nZBins); for(Int_t xbin=1; xbin<=nXBins; xbin++){ tmp->GetXaxis()->SetBinLabel(xbin,axesXLabel[xbin-1]); } for(Int_t ybin=1; ybin<=nYBins; ybin++){ tmp->GetYaxis()->SetBinLabel(ybin,axesYLabel[ybin-1]); } for(Int_t zbin=1; zbin<=nZBins; zbin++){ tmp->GetZaxis()->SetBinLabel(zbin,axesZLabel[zbin-1]); } tmp->SetStats(0); TObjString *tobjstring = new TObjString(tableName.Data()); fHistogramMap->Add((TObject*)tobjstring,(TObject*)tmp); } else{ cout << "Warning: Table ( "<GetValue(tableName.Data()); if(tmp){ tmp->Fill(xValue); } } void AliGammaConversionHistograms::FillTable(TString tableName,Double_t xValue,Double_t yValue) const { //see header file for documentation TH2 *tmp = (TH2*)fHistogramMap->GetValue(tableName.Data()); if(tmp){ tmp->Fill(xValue,yValue); } } void AliGammaConversionHistograms::FillTable(TString tableName,Double_t xValue,Double_t yValue, Double_t zValue) const { //see header file for documentation TH3 *tmp = (TH3*)fHistogramMap->GetValue(tableName.Data()); if(tmp){ tmp->Fill(xValue,yValue,zValue); } } void AliGammaConversionHistograms::FillHistogram(TString histogramName, Double_t xValue) const{ //see header file for documentation TH1 *tmp = (TH1*)fHistogramMap->GetValue(histogramName.Data()); if(tmp){ tmp->Fill(xValue); } } void AliGammaConversionHistograms::FillHistogram(TString histogramName, Float_t* xValue, Int_t nPoints) const{ //see header file for documentation TH1 *tmp = (TH1*)fHistogramMap->GetValue(histogramName.Data()); if(tmp){ for( Int_t ii = 1; ii < nPoints+1; ii++){ tmp->SetBinContent(ii,xValue[ii]); } } } void AliGammaConversionHistograms::FillHistogram(TString histogramName, Double_t xValue, Double_t yValue) const{ //see header file for documentation TH1 *tmp = (TH1*)fHistogramMap->GetValue(histogramName.Data()); if(tmp){ tmp->Fill(xValue, yValue); } } void AliGammaConversionHistograms::FillHistogram(TString histogramName, Double_t xValue, Double_t yValue, Double_t zValue) const{ //see header file for documentation TH3 *tmp = (TH3*)fHistogramMap->GetValue(histogramName.Data()); if(tmp){ tmp->Fill(xValue, yValue, zValue); } } TObject* AliGammaConversionHistograms::GetValue(const TString& name) { //Get pointer to histogram with name return fHistogramMap->GetValue(name.Data()); } void AliGammaConversionHistograms::GetOutputContainer(TList *fOutputContainer){ //checking if the container is alrerady created if(fOutputContainer == NULL){ cout<<"WARNING: GetOutputContainer: output container object is NULL"<GetString(); if(histogramString.Contains("Mapping")){// means it should be put in the mapping folder if(fMappingContainer == NULL){ fMappingContainer = new TList(); fMappingContainer->SetOwner(kTRUE); fMappingContainer->SetName("Mapping histograms"); } fMappingContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else if(histogramString.Contains("HadInt")){// means it should be put in the Table Folder if(fHadContainer == NULL){ fHadContainer = new TList(); fHadContainer->SetOwner(kTRUE); fHadContainer->SetName("Hadronic Interactions histograms"); } fHadContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else if(histogramString.Contains("Background")){// means it should be put in the background folder if(fBackgroundContainer == NULL){ fBackgroundContainer = new TList(); fBackgroundContainer->SetOwner(kTRUE); fBackgroundContainer->SetName("Background histograms"); } fBackgroundContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else if(histogramString.Contains("Debug")){// means it should be put in the debug folder if(fDebugContainer == NULL){ fDebugContainer = new TList(); fDebugContainer->SetOwner(kTRUE); fDebugContainer->SetName("Debug histograms"); } fDebugContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else if(histogramString.Contains("Resolution")){// means it should be put in the resolution folder if(fResolutionContainer == NULL){ fResolutionContainer = new TList(); fResolutionContainer->SetOwner(kTRUE); fResolutionContainer->SetName("Resolution histograms"); } fResolutionContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else if(histogramString.Contains("TrueConv")){// means it should be put in the true conv folder if(fMatchContainer == NULL){ fMatchContainer = new TList(); fMatchContainer->SetOwner(kTRUE); fMatchContainer->SetName("True conversion histograms"); } fMatchContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else if(histogramString.Contains("ESD")){// means it should be put in the ESD folder if(fESDContainer == NULL){ fESDContainer = new TList(); fESDContainer->SetOwner(kTRUE); fESDContainer->SetName("ESD histograms"); } fESDContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else if(histogramString.Contains("MC")){// means it should be put in the MC folder if(fMCContainer == NULL){ fMCContainer = new TList(); fMCContainer->SetOwner(kTRUE); fMCContainer->SetName("MC histograms"); } fMCContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else if(histogramString.Contains("Table")){// means it should be put in the Table Folder if(fTableContainer == NULL){ fTableContainer = new TList(); fTableContainer->SetOwner(kTRUE); fTableContainer->SetName("Tables"); } fTableContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else if(histogramString.Contains("3DPlots")){// means it should be put in the Table Folder if(f3DContainer == NULL){ f3DContainer = new TList(); f3DContainer->SetOwner(kTRUE); f3DContainer->SetName("3D histograms"); } f3DContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else if(histogramString.Contains("HadInt")){// means it should be put in the Table Folder if(fHadContainer == NULL){ fHadContainer = new TList(); fHadContainer->SetOwner(kTRUE); fHadContainer->SetName("Hadronic Interactions histograms"); } fHadContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } else{ if(fOtherContainer == NULL){ fOtherContainer = new TList(); fOtherContainer->SetOwner(kTRUE); fOtherContainer->SetName("Other histograms"); } fOtherContainer->Add((TH1*)fHistogramMap->GetValue(histogramString.Data())); } histogramName = NULL; } // end while if(fMappingContainer != NULL){ fOutputContainer->Add(fMappingContainer); } if(fBackgroundContainer != NULL){ fOutputContainer->Add(fBackgroundContainer); } if(fDebugContainer != NULL){ fOutputContainer->Add(fDebugContainer); } if(fResolutionContainer != NULL){ fOutputContainer->Add(fResolutionContainer); } if(fMatchContainer != NULL){ fOutputContainer->Add(fMatchContainer); } if(fESDContainer != NULL){ fOutputContainer->Add(fESDContainer); } if(fMCContainer != NULL){ fOutputContainer->Add(fMCContainer); } if(fTableContainer != NULL){ fOutputContainer->Add(fTableContainer); } if(f3DContainer != NULL){ fOutputContainer->Add(f3DContainer); } if(fHadContainer != NULL){ fOutputContainer->Add(fHadContainer); } if(fOtherContainer != NULL){ fOutputContainer->Add(fOtherContainer); } } } Int_t AliGammaConversionHistograms::GetRBin(Double_t radius) const{ // see header file for documentation Int_t iResult=0; // if(fDeltaR>0){ // iResult = (Int_t)((radius - fMinRadius)/fDeltaR); // } for(Int_t i=0;i=fRBinLimits[i] && radius=fZBinLimits[i] && zPos0){ if(phi>TMath::Pi()){ phi-=2*TMath::Pi(); } iResult = (Int_t)((phi - fMinPhi)/fDeltaPhi); } return iResult; } void AliGammaConversionHistograms::InitializeMappingValues(Int_t nPhiIndex, Int_t nRIndex, Int_t nBinsR, Double_t minRadius, Double_t maxRadius,Int_t nBinsPhi, Double_t minPhi, Double_t maxPhi){ // Initializing the valuse for the mapping fNPhiIndex = nPhiIndex; if(nRIndex<=14){ fNRIndex = nRIndex; }else{ fNRIndex=14; } fNZIndex = 13; // fRBinLimits= new Double_t[8]; Kenneth: moved from pointer to fixed array /* fRBinLimits[0]=0.; fRBinLimits[1]=13.; //changed from 12 to 13: A. Marin 01.03.10 fRBinLimits[2]=21.; //changed from 22 to 21: A. Marin 01.03.10 fRBinLimits[3]=35.; fRBinLimits[4]=55.; fRBinLimits[5]=72.; fRBinLimits[6]=90.; fRBinLimits[7]=500.; */ fRBinLimits[0]=0.; fRBinLimits[1]=3.5; fRBinLimits[2]=5.75; fRBinLimits[3]=9.5; fRBinLimits[4]=13.; fRBinLimits[5]=21.; fRBinLimits[6]=27.5; fRBinLimits[7]=35.; fRBinLimits[8]=42.; fRBinLimits[9]=55.; fRBinLimits[10]=72.; fRBinLimits[11]=79.5; // change from 81.5 to 79.5 to have CE in 1 r bin 81.05 fRBinLimits[12]=90.; fRBinLimits[13]=500.; // fZBinLimits= new Double_t[7]; Kenneth: moved from pointer to fixed array fZBinLimits[0]=-500.; fZBinLimits[1]=-200.; fZBinLimits[2]=-100.; fZBinLimits[3]=-50.; fZBinLimits[4]=-30.; fZBinLimits[5]=-15.; fZBinLimits[6]= 0.; fZBinLimits[7]= 15.; fZBinLimits[8]= 30.; fZBinLimits[9]= 50.; fZBinLimits[10]=100.; fZBinLimits[11]=200.; fZBinLimits[12]=500.; fMinRadius = minRadius; fMaxRadius = maxRadius; if(nBinsR>0 && nRIndex!=0){ fDeltaR = (fMaxRadius - fMinRadius)/nRIndex; } fMinPhi = minPhi; fMaxPhi = maxPhi; if(nBinsPhi>0 && nPhiIndex!=0){ fDeltaPhi = (fMaxPhi-fMinPhi)/nPhiIndex; } } //mapping void AliGammaConversionHistograms::AddMappingHistograms(Int_t nPhiIndex, Int_t nRIndex,Int_t nXBins, Double_t firstX, Double_t lastX, Int_t nYBins, Double_t firstY, Double_t lastY, TString xAxisTitle, TString yAxisTitle){ // see header file for documentation Double_t tmptogetridofwarning = firstX + lastX + nYBins + firstY + lastY; if(tmptogetridofwarning < 0){ cout<<"Less than zero"<