From 2d9c70ab3552118d4a60383fca71a19059980cdc Mon Sep 17 00:00:00 2001 From: coppedis Date: Thu, 27 May 2010 14:12:30 +0000 Subject: [PATCH] Changes for Pb-Pb reco at 2.76 A TeV + some code simplification --- ZDC/AliZDCDigitizer.cxx | 152 +++++++++++++++++------------------ ZDC/AliZDCDigitizer.h | 9 +-- ZDC/AliZDCQAChecker.cxx | 2 +- ZDC/AliZDCQADataMakerRec.cxx | 84 +++++++++---------- ZDC/AliZDCRawStream.cxx | 4 +- ZDC/AliZDCRecoParam.cxx | 12 ++- ZDC/AliZDCRecoParam.h | 10 ++- ZDC/AliZDCRecoParamPbPb.cxx | 69 ++++++++++++---- ZDC/AliZDCRecoParamPbPb.h | 12 +-- ZDC/AliZDCReconstructor.cxx | 42 ++-------- ZDC/AliZDCReconstructor.h | 2 - ZDC/GlauberMCDist.root | Bin 0 -> 5075 bytes ZDC/SpectatorSignal.root | Bin 0 -> 12528 bytes 13 files changed, 209 insertions(+), 189 deletions(-) create mode 100644 ZDC/GlauberMCDist.root create mode 100644 ZDC/SpectatorSignal.root diff --git a/ZDC/AliZDCDigitizer.cxx b/ZDC/AliZDCDigitizer.cxx index 6145813a9f9..33c6acb3e5a 100644 --- a/ZDC/AliZDCDigitizer.cxx +++ b/ZDC/AliZDCDigitizer.cxx @@ -47,8 +47,6 @@ class AliCDBStorage; class AliZDCPedestals; -class AliZDCEnCalib; -class AliZDCTowerCalib; ClassImp(AliZDCDigitizer) @@ -59,9 +57,8 @@ AliZDCDigitizer::AliZDCDigitizer() : fIsSignalInADCGate(kFALSE), fFracLostSignal(0.), fPedData(0), - fEnCalibData(0), - fTowCalibData(0), - fSpectators2Track(kFALSE) + fSpectators2Track(kFALSE), + fBeamEnergy(0.) { // Default constructor @@ -74,9 +71,8 @@ AliZDCDigitizer::AliZDCDigitizer(AliRunDigitizer* manager): fIsSignalInADCGate(kFALSE), fFracLostSignal(0.), fPedData(GetPedData()), - fEnCalibData(GetEnCalibData()), - fTowCalibData(GetTowCalibData()), - fSpectators2Track(kFALSE) + fSpectators2Track(kFALSE), + fBeamEnergy(0.) { // Get calibration data if(fIsCalibration!=0) printf("\n\t AliZDCDigitizer -> Creating calibration data (pedestals)\n"); @@ -101,9 +97,8 @@ AliZDCDigitizer::AliZDCDigitizer(const AliZDCDigitizer &digitizer): fIsSignalInADCGate(digitizer.fIsSignalInADCGate), fFracLostSignal(digitizer.fFracLostSignal), fPedData(digitizer.fPedData), - fEnCalibData(digitizer.fEnCalibData), - fTowCalibData(digitizer.fTowCalibData), - fSpectators2Track(digitizer.fSpectators2Track) + fSpectators2Track(digitizer.fSpectators2Track), + fBeamEnergy(digitizer.fBeamEnergy) { // Copy constructor @@ -144,37 +139,41 @@ Bool_t AliZDCDigitizer::Init() AliError("\t UNKNOWN beam type from GRP obj -> PMT gains not set in ZDC digitizer!!!\n"); } - Float_t beamEnergy = grpData->GetBeamEnergy(); - if(beamEnergy==AliGRPObject::GetInvalidFloat()){ + fBeamEnergy = grpData->GetBeamEnergy(); + if(fBeamEnergy==AliGRPObject::GetInvalidFloat()){ AliWarning("GRP/GRP/Data entry: missing value for the beam energy ! Using 0."); AliError("\t UNKNOWN beam type from GRP obj -> PMT gains not set in ZDC digitizer!!!\n"); - beamEnergy = 0.; + fBeamEnergy = 0.; } - if((beamType.CompareTo("P-P")) == 0){ + if((beamType.CompareTo("P-P")) == 0 || (beamType.CompareTo("p-p")) == 0){ //PTM gains rescaled to beam energy for p-p - if(beamEnergy != 0){ + if(fBeamEnergy != 0){ for(Int_t j = 0; j < 5; j++){ - fPMGain[0][j] = (661.444/beamEnergy+0.000740671)*10000000; - fPMGain[1][j] = (864.350/beamEnergy+0.002344)*10000000; - fPMGain[2][j] = (1.32312-0.000101515*beamEnergy)*10000000; + fPMGain[0][j] = (661.444/fBeamEnergy+0.000740671)*10000000; + fPMGain[1][j] = (864.350/fBeamEnergy+0.002344)*10000000; + fPMGain[2][j] = (1.32312-0.000101515*fBeamEnergy)*10000000; fPMGain[3][j] = fPMGain[0][j]; fPMGain[4][j] = fPMGain[1][j] ; } - AliInfo(Form(" PMT gains for p-p @ %1.0f+%1.0f: ZN(%1.0f), ZP(%1.0f), ZEM(%1.0f)\n", - beamEnergy, beamEnergy, fPMGain[0][0], fPMGain[1][0], fPMGain[2][0])); + AliInfo(Form(" PMT gains for p-p @ %1.0f+%1.0f GeV: ZN(%1.0f), ZP(%1.0f), ZEM(%1.0f)\n", + fBeamEnergy, fBeamEnergy, fPMGain[0][0], fPMGain[1][0], fPMGain[2][0])); } } else if((beamType.CompareTo("A-A")) == 0){ - // PTM gains for Pb-Pb @ 2.7_2.7 A TeV *************** + // PTM gains for Pb-Pb @ 2.7+2.7 A TeV *************** + // rescaled for Pb-Pb @ 1.38+1.38 A TeV *************** + Float_t scalGainFactor = fBeamEnergy/2760.; for(Int_t j = 0; j < 5; j++){ - fPMGain[0][j] = 50000.; - fPMGain[1][j] = 100000.; - fPMGain[2][j] = 100000.; - fPMGain[3][j] = 50000.; - fPMGain[4][j] = 100000.; - fPMGain[5][j] = 100000.; + fPMGain[0][j] = 50000./scalGainFactor; + fPMGain[1][j] = 100000./scalGainFactor; + fPMGain[2][j] = 100000./scalGainFactor; + fPMGain[3][j] = 50000./scalGainFactor; + fPMGain[4][j] = 100000./scalGainFactor; + fPMGain[5][j] = 100000./scalGainFactor; } + AliInfo(Form(" PMT gains for Pb-Pb @ %1.0f+%1.0f A GeV: ZN(%1.0f), ZP(%1.0f), ZEM(%1.0f)\n", + fBeamEnergy, fBeamEnergy, fPMGain[0][0], fPMGain[1][0], fPMGain[2][0])); } // ADC Caen V965 @@ -450,27 +449,57 @@ void AliZDCDigitizer::SpectatorSignal(Int_t SpecType, Int_t numEvents, { // add signal of the spectators - TString hfn; - if(SpecType == 1) { // --- Signal for projectile spectator neutrons - hfn = "$ALICE_ROOT/ZDC/ZNCSignal.root"; - } - else if(SpecType == 2) { // --- Signal for projectile spectator protons - hfn = "$ALICE_ROOT/ZDC/ZPCSignal.root"; + TFile *specSignalFile = TFile::Open("$ALICE_ROOT/ZDC/SpectatorSignal.root"); + if(!specSignalFile || !specSignalFile->IsOpen()) { + AliError((" Opening file $ALICE_ROOT/ZDC/SpectatorSignal.root failed\n")); + return; } - else if(SpecType == 3) { // --- Signal for target spectator neutrons - hfn = "$ALICE_ROOT/ZDC/ZNASignal.root"; + + TNtuple* zdcSignal; + + Float_t sqrtS = 2*fBeamEnergy; + // + if(TMath::Abs(sqrtS-5500) < 100.){ + specSignalFile->cd("energy5500"); + // + if(SpecType == 1) { // --- Signal for projectile spectator neutrons + specSignalFile->GetObject("energy5500/ZNCSignal;1",zdcSignal); + if(!zdcSignal) AliError(" PROBLEM!!! Can't retrieve ZNCSignal from SpectatorSignal.root file"); + } + else if(SpecType == 2) { // --- Signal for projectile spectator protons + specSignalFile->GetObject("energy5500/ZPCSignal;1",zdcSignal); + if(!zdcSignal) AliError(" PROBLEM!!! Can't retrieve ZPCSignal from SpectatorSignal.root file"); + } + else if(SpecType == 3) { // --- Signal for target spectator neutrons + specSignalFile->GetObject("energy5500/ZNASignal;1",zdcSignal); + if(!zdcSignal) AliError(" PROBLEM!!! Can't retrieve ZNASignal from SpectatorSignal.root file"); + } + else if(SpecType == 4) { // --- Signal for target spectator protons + specSignalFile->GetObject("energy5500/ZPASignal;1",zdcSignal); + if(!zdcSignal) AliError(" PROBLEM!!! Can't retrieve ZPASignal from SpectatorSignal.root file"); + } } - else if(SpecType == 4) { // --- Signal for target spectator protons - hfn = "$ALICE_ROOT/ZDC/ZPASignal.root"; + else if(TMath::Abs(sqrtS-2760) < 100.){ + specSignalFile->cd("energy2760"); + // + if(SpecType == 1) { // --- Signal for projectile spectator neutrons + specSignalFile->GetObject("energy2760/ZNCSignal;1",zdcSignal); + if(!zdcSignal) AliError(" PROBLEM!!! Can't retrieve ZNCSignal from SpectatorSignal.root file"); + } + else if(SpecType == 2) { // --- Signal for projectile spectator protons + specSignalFile->GetObject("energy2760/ZPCSignal;1",zdcSignal); + if(!zdcSignal) AliError(" PROBLEM!!! Can't retrieve ZPCSignal from SpectatorSignal.root file"); + } + else if(SpecType == 3) { // --- Signal for target spectator neutrons + specSignalFile->GetObject("energy2760/ZNASignal;1",zdcSignal); + if(!zdcSignal) AliError(" PROBLEM!!! Can't retrieve ZNASignal from SpectatorSignal.root file"); + } + else if(SpecType == 4) { // --- Signal for target spectator protons + specSignalFile->GetObject("energy2760/ZPASignal;1",zdcSignal); + if(!zdcSignal) AliError(" PROBLEM!!! Can't retrieve ZPASignal from SpectatorSignal.root file"); + } } - TFile* file = TFile::Open(hfn); - if(!file || !file->IsOpen()) { - AliError((Form(" Opening file %s failed\n",hfn.Data()))); - return; - } - - TNtuple* zdcSignal = (TNtuple*) file->Get("ZDCSignal"); Int_t nentries = (Int_t) zdcSignal->GetEntries(); Float_t *entry; @@ -516,8 +545,8 @@ void AliZDCDigitizer::SpectatorSignal(Int_t SpecType, Int_t numEvents, } }while(ievClose(); - delete file; + specSignalFile->Close(); + delete specSignalFile; } @@ -609,32 +638,3 @@ AliZDCPedestals* AliZDCDigitizer::GetPedData() const return calibdata; } -//_____________________________________________________________________________ -AliZDCEnCalib* AliZDCDigitizer::GetEnCalibData() const -{ - - // Getting calibration object for ZDC set - - AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/EnergyCalib"); - if(!entry) AliFatal("No calibration data loaded!"); - - AliZDCEnCalib *calibdata = dynamic_cast (entry->GetObject()); - if(!calibdata) AliFatal("Wrong calibration object in calibration file!"); - - return calibdata; -} - -//_____________________________________________________________________________ -AliZDCTowerCalib* AliZDCDigitizer::GetTowCalibData() const -{ - - // Getting calibration object for ZDC set - - AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/TowerCalib"); - if(!entry) AliFatal("No calibration data loaded!"); - - AliZDCTowerCalib *calibdata = dynamic_cast (entry->GetObject()); - if(!calibdata) AliFatal("Wrong calibration object in calibration file!"); - - return calibdata; -} diff --git a/ZDC/AliZDCDigitizer.h b/ZDC/AliZDCDigitizer.h index 27d1a8f7610..b8ffa3712eb 100644 --- a/ZDC/AliZDCDigitizer.h +++ b/ZDC/AliZDCDigitizer.h @@ -13,8 +13,6 @@ #include "AliCDBManager.h" #include "AliCDBStorage.h" #include "AliZDCPedestals.h" -#include "AliZDCEnCalib.h" -#include "AliZDCTowerCalib.h" class AliRunDigitizer; @@ -46,8 +44,6 @@ public: void SetCalibrationOn() {fIsCalibration=1;} AliCDBStorage *SetStorage(const char* uri); AliZDCPedestals *GetPedData() const; - AliZDCEnCalib *GetEnCalibData() const; - AliZDCTowerCalib *GetTowCalibData() const; void SetSpectators2Track() {fSpectators2Track=kTRUE;} @@ -72,11 +68,10 @@ private: Float_t fFracLostSignal; // fraction of lost signal AliZDCPedestals *fPedData; //! pedestal calibration data - AliZDCEnCalib *fEnCalibData; //! energy and equalization calibration data - AliZDCTowerCalib *fTowCalibData; //! energy and equalization calibration data Bool_t fSpectators2Track; // should digitizer track spectators + Float_t fBeamEnergy; // beam energy taken from GRP object - ClassDef(AliZDCDigitizer, 10) // digitizer for ZDC + ClassDef(AliZDCDigitizer, 11) // digitizer for ZDC }; #endif diff --git a/ZDC/AliZDCQAChecker.cxx b/ZDC/AliZDCQAChecker.cxx index 9414fe39c31..b952601d6d5 100644 --- a/ZDC/AliZDCQAChecker.cxx +++ b/ZDC/AliZDCQAChecker.cxx @@ -34,7 +34,7 @@ void AliZDCQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArra // Checks the QA histograms on the input list: // const char* taskName = AliQAv1::GetAliTaskName(index); - printf("\n\tAliZDCQAChecker -> checking QA histos for task %s\n",taskName); + //printf("\n\tAliZDCQAChecker -> checking QA histos for task %s\n",taskName); // for(Int_t specie = 0; specieFill(pedSubVal); + GetRawsData(10)->Fill(zncpmC); } } } @@ -476,7 +476,7 @@ void AliZDCQADataMakerRec::MakeRaws(AliRawReader *rawReader) if(quad!=0) zpcSumQ += pedSubVal; else{ zpcpmC = pedSubVal; - GetRawsData(12)->Fill(pedSubVal); + GetRawsData(12)->Fill(zpcpmC); } } } @@ -504,7 +504,7 @@ void AliZDCQADataMakerRec::MakeRaws(AliRawReader *rawReader) if(quad!=0) znaSumQ += pedSubVal; else{ znapmC = pedSubVal; - GetRawsData(11)->Fill(pedSubVal); + GetRawsData(11)->Fill(znapmC); } } } @@ -517,7 +517,7 @@ void AliZDCQADataMakerRec::MakeRaws(AliRawReader *rawReader) if(quad!=0) zpaSumQ += pedSubVal; else{ zpapmC = pedSubVal; - GetRawsData(13)->Fill(pedSubVal); + GetRawsData(13)->Fill(zpapmC); } } } @@ -525,23 +525,23 @@ void AliZDCQADataMakerRec::MakeRaws(AliRawReader *rawReader) // if(isZNCFired){ GetRawsData(0)->Fill(zncSignal); - GetRawsData(6)->Fill(zncSumQ); - GetRawsData(10)->Fill(zncpmC); + GetRawsData(6)->Fill(zncSumQ, zncpmC); + GetRawsData(14)->Fill(zncSumQ); } if(isZPCFired){ GetRawsData(2)->Fill(zpcSignal); - GetRawsData(8)->Fill(zncSumQ); - GetRawsData(11)->Fill(zpcpmC); + GetRawsData(8)->Fill(zpcSumQ, zpcpmC); + GetRawsData(15)->Fill(zpcSumQ); } if(isZNAFired){ GetRawsData(1)->Fill(znaSignal); - GetRawsData(7)->Fill(znaSumQ); - GetRawsData(12)->Fill(znapmC); + GetRawsData(7)->Fill(znaSumQ, znapmC); + GetRawsData(16)->Fill(znaSumQ); } if(isZPAFired){ GetRawsData(3)->Fill(zpaSignal); - GetRawsData(9)->Fill(znaSumQ); - GetRawsData(13)->Fill(zpapmC); + GetRawsData(9)->Fill(znaSumQ, zpapmC); + GetRawsData(17)->Fill(znaSumQ); } } //IsADCDataWord && signal ADCs @@ -620,7 +620,7 @@ void AliZDCQADataMakerRec::MakeESDs(AliESDEvent * esd) ||((beamType.CompareTo("PP"))==0) || ((beamType.CompareTo("P-P"))==0)){ zdcESD->GetZNCentroidInpp(centr_ZNC, centr_ZNA); } - else if((beamType.CompareTo("A-A")) == 0){ + else if((beamType.CompareTo("A-A")) == 0 || (beamType.CompareTo("Pb-Pb")) == 0){ Float_t beamEne = esd->GetBeamEnergy(); zdcESD->GetZNCentroidInPbPb(beamEne, centr_ZNC, centr_ZNA); } diff --git a/ZDC/AliZDCRawStream.cxx b/ZDC/AliZDCRawStream.cxx index 02344cdc4ef..c0d2a87c36d 100644 --- a/ZDC/AliZDCRawStream.cxx +++ b/ZDC/AliZDCRawStream.cxx @@ -375,7 +375,7 @@ Bool_t AliZDCRawStream::Next() // fIsHeaderMapping = kFALSE; fIsChMapping = kFALSE; fIsADCHeader = kFALSE; fIsADCDataWord = kFALSE; fIsADCEOB = kFALSE; - fIsADDChannel = kFALSE; fIsADDTDCHeader= kFALSE; fIsADDTDCdatum=kFALSE; + fIsZDCTDCdatum = kFALSE; fIsADDChannel = kFALSE; fIsADDTDCdatum=kFALSE; fIsUnderflow = kFALSE; fIsOverflow = kFALSE; fIsScalerWord = kFALSE; fSector[0] = fSector[1] = -1; for(Int_t kl=0; kl<4; kl++) fCPTInput[kl] = 0; @@ -861,6 +861,7 @@ Bool_t AliZDCRawStream::Next() fIsADCDataWord=kFALSE; fIsScalerWord=kFALSE; if(((fBuffer & 0xf0000000)==0x00000000) && (((fBuffer & 0x08000000) >> 27) == 0)){ // TDC datum fADCChannel = (Int_t) ((fBuffer & 0x3e00000) >> 21); + fIsZDCTDCdatum = kTRUE; fZDCTDCdatum = (Int_t) (fBuffer & 0x1fffff); // Ch. debug //printf(" AliZDCRawStream -> ZDC TDC mod. %d ch. %d datum %d\n",fADCModule,fADCChannel,fZDCTDCdatum); @@ -878,6 +879,7 @@ Bool_t AliZDCRawStream::Next() fIsADCDataWord=kFALSE; fIsScalerWord=kFALSE; if(((fBuffer & 0xf0000000)==0x00000000) && (((fBuffer & 0x08000000) >> 27) == 0)){ // TDC datum fADCChannel = (Int_t) ((fBuffer & 0x3e00000) >> 21); + fIsADDTDCdatum = kTRUE; fADDTDCdatum = (Int_t) (fBuffer & 0x1fffff); // Ch. debug //printf(" AliZDCRawStream -> ADD TDC mod. %d ch. %d datum %d\n",fADCModule,fADCChannel,fADDTDCdatum); diff --git a/ZDC/AliZDCRecoParam.cxx b/ZDC/AliZDCRecoParam.cxx index cec1413f7ac..b531c1dde55 100644 --- a/ZDC/AliZDCRecoParam.cxx +++ b/ZDC/AliZDCRecoParam.cxx @@ -29,14 +29,24 @@ ClassImp(AliZDCRecoParam) //_____________________________________________________________________________ AliZDCRecoParam::AliZDCRecoParam() : - AliDetectorRecoParam() + AliDetectorRecoParam(), + fBeamEnergy(0) { // //Default constructor } + //_____________________________________________________________________________ AliZDCRecoParam::~AliZDCRecoParam() { // destructor } + +//_____________________________________________________________________________ +void AliZDCRecoParam::SetGlauberMCDist(Float_t beamEnergy) +{ + // Implemented in AliZDCRecoParamPbPb + fBeamEnergy = beamEnergy; + printf("Setting beam energy = %1.0f\n"); +} diff --git a/ZDC/AliZDCRecoParam.h b/ZDC/AliZDCRecoParam.h index be9a2b07c26..a5b6d37da46 100644 --- a/ZDC/AliZDCRecoParam.h +++ b/ZDC/AliZDCRecoParam.h @@ -20,19 +20,25 @@ class AliZDCRecoParam : public AliDetectorRecoParam { public: AliZDCRecoParam(); virtual ~AliZDCRecoParam(); - + + virtual Float_t GetBeamEnergy() {return fBeamEnergy;} virtual TH1D* GethNpartDist() const = 0; virtual TH1D* GethbDist() const = 0; virtual Float_t GetClkCenter() const = 0; virtual void PrintParameters() const {;} + virtual void SetGlauberMCDist(Float_t beamEnergy); + virtual void SetBeamEnergy(Float_t beamEnergy) {fBeamEnergy = beamEnergy;} + protected: AliZDCRecoParam(const AliZDCRecoParam&); AliZDCRecoParam& operator =(const AliZDCRecoParam&); + + Float_t fBeamEnergy; // beam energy - ClassDef(AliZDCRecoParam, 2) + ClassDef(AliZDCRecoParam, 3) }; diff --git a/ZDC/AliZDCRecoParamPbPb.cxx b/ZDC/AliZDCRecoParamPbPb.cxx index 838ded0dd6f..32192cf9bd0 100644 --- a/ZDC/AliZDCRecoParamPbPb.cxx +++ b/ZDC/AliZDCRecoParamPbPb.cxx @@ -89,39 +89,78 @@ AliZDCRecoParamPbPb::~AliZDCRecoParamPbPb() } //_____________________________________________________________________________ -void AliZDCRecoParamPbPb::SetGlauberMCDist() +void AliZDCRecoParamPbPb::SetGlauberMCDist(Float_t beamEnergy) { // Setting Glauber MC distributions // from histos file stored in $ALICE_ROOT/ZDC - TFile * fileHistos = TFile::Open("$ALICE_ROOT/ZDC/GlauberMCHistos.root"); + TH1::AddDirectory(0); + TH2::AddDirectory(0); + + TFile *fileGlauberMC = TFile::Open("$ALICE_ROOT/ZDC/GlauberMCDist.root"); + if(!fileGlauberMC) { + AliError((" Opening file $ALICE_ROOT/ZDC/SpectatorSignal.root failed\n")); + return; + } + + Float_t sqrtS = 2*beamEnergy; + // + if(TMath::Abs(sqrtS-5500) < 100.){ + AliDebug(2, " ZDC -> Looking for energy5500 in file $ALICE_ROOT/ZDC/GlauberMCDist.root"); + fileGlauberMC->cd("energy5500"); + fileGlauberMC->GetObject("energy5500/hNpartGlauber;1", fhNpartDist); + if(!fhNpartDist) AliError(" PROBLEM!!! Can't get Glauber MC Npart distribution from file GlauberMCDist.root\n"); + fileGlauberMC->GetObject("energy5500/hbGlauber;1", fhbDist); + if(!fhbDist) AliError(" PROBLEM!!! Can't get Glauber MC b distribution from file GlauberMCDist.root\n"); + } + else if(TMath::Abs(sqrtS-2760) < 100.){ + AliDebug(2, " ZDC -> Looking for energy2760 in file $ALICE_ROOT/ZDC/GlauberMCDist.root"); + fileGlauberMC->cd("energy2760"); + fileGlauberMC->GetObject("energy2760/hNpartGlauber;1", fhNpartDist); + if(!fhNpartDist) AliError(" PROBLEM!!! Can't get Glauber MC Npart distribution from file GlauberMCDist.root\n"); + fileGlauberMC->GetObject("energy2760/hbGlauber;1", fhbDist); + if(!fhbDist) AliError(" PROBLEM!!! Can't get Glauber MC b distribution from file GlauberMCDist.root\n"); + } + else AliError(Form(" No AliZDCRecoParam provided for Pb-Pb @ sqrt(s) = %1.0f GeV\n", sqrtS)); // - fhNpartDist = (TH1D*) fileHistos->Get("hDist"); fhNpartDist->SetDirectory(0); - fhbDist = (TH1D*) fileHistos->Get("hbDist"); fhbDist->SetDirectory(0); - fileHistos->Close(); + fileGlauberMC->Close(); } //_____________________________________________________________________________ -AliZDCRecoParamPbPb *AliZDCRecoParamPbPb::GetHighFluxParam() +AliZDCRecoParamPbPb *AliZDCRecoParamPbPb::GetHighFluxParam(Float_t beamEnergy) { // Create high flux reco parameter TH1::AddDirectory(0); TH2::AddDirectory(0); // - TFile * fileHistos = TFile::Open("$ALICE_ROOT/ZDC/GlauberMCHistos.root"); - fileHistos->cd(); - // - TH1D* hDist = (TH1D*) fileHistos->Get("hDist"); - hDist->SetDirectory(0); + TFile *fileGlauberMC = TFile::Open("$ALICE_ROOT/ZDC/GlauberMCDist.root"); + if(!fileGlauberMC) printf(" AliZDCRecoParamPbPb::GetHighFluxParam() ERROR opening file $ALICE_ROOT/ZDC/SpectatorSignal.root\n"); + + TH1D *hNpartDist, *hbDist; + if(TMath::Abs(beamEnergy-5500)<100.){ + fileGlauberMC->cd("energy5500"); + fileGlauberMC->GetObject("energy5500/hNpartGlauber;1", hNpartDist); + if(!hNpartDist) printf(" AliZDCRecoParamPbPb::GetHighFluxParam() PROBLEM!!! Can't get Glauber MC Npart distribution from file GlauberMCDist.root\n"); + fileGlauberMC->GetObject("energy5500/hbGlauber;1", hbDist); + if(!hbDist) printf(" AliZDCRecoParamPbPb::GetHighFluxParam() PROBLEM!!! Can't get Glauber MC b distribution from file GlauberMCDist.root\n"); + } + else if(TMath::Abs(beamEnergy-2760)<100.){ + fileGlauberMC->cd("energy2760"); + fileGlauberMC->GetObject("energy2760/hNpartGlauber;1", hNpartDist); + if(!hNpartDist) printf(" PROBLEM!!! Can't get Glauber MC Npart distribution from file GlauberMCDist.root\n"); + fileGlauberMC->GetObject("energy2760/hbGlauber;1", hbDist); + if(!hbDist) printf(" AliZDCRecoParamPbPb::GetHighFluxParam() PROBLEM!!! Can't get Glauber MC b distribution from file GlauberMCDist.root\n"); + } + else printf(" No AliZDCRecoParam provided for Pb-Pb @ sqrt(s) = %1.0f GeV\n", beamEnergy); // - TH1D* hbDist = (TH1D*) fileHistos->Get("hbDist"); + hNpartDist->SetDirectory(0); hbDist->SetDirectory(0); - - AliZDCRecoParamPbPb* zdcRecoParam = new AliZDCRecoParamPbPb(hDist, hbDist, 0.1); + + AliZDCRecoParamPbPb* zdcRecoParam = new AliZDCRecoParamPbPb(hNpartDist, hbDist, 0.1); // - fileHistos->Close(); + fileGlauberMC->Close(); return zdcRecoParam; diff --git a/ZDC/AliZDCRecoParamPbPb.h b/ZDC/AliZDCRecoParamPbPb.h index 33a6cea2ae3..2f0e50de892 100644 --- a/ZDC/AliZDCRecoParamPbPb.h +++ b/ZDC/AliZDCRecoParamPbPb.h @@ -26,16 +26,16 @@ class AliZDCRecoParamPbPb : public AliZDCRecoParam { // make reco parameters for A-A collisions - static AliZDCRecoParamPbPb *GetHighFluxParam(); + static AliZDCRecoParamPbPb *GetHighFluxParam(Float_t beamEnergy); TH1D* GethNpartDist() const {return fhNpartDist;} TH1D* GethbDist() const {return fhbDist;} Float_t GetClkCenter() const {return fClkCenter;} - + void SetNpartDist(TH1D *hDist) {fhNpartDist = hDist;} void SetbDist(TH1D *hbDist) {fhbDist = hbDist;} void SetClkCenter(Float_t xValue) {fClkCenter = xValue;} - void SetGlauberMCDist(); + void SetGlauberMCDist(Float_t beamEnergy); //void Print(Option_t *) const; @@ -43,9 +43,9 @@ class AliZDCRecoParamPbPb : public AliZDCRecoParam { // *** PARAMETERS FOR Pb-Pb COLLISIONS // --- Correlation E_ZDC vs. E_ZEM - TH1D * fhNpartDist; // Npart distribution from Glauber MC - TH1D * fhbDist; // b distribution from Glauber MC - Float_t fClkCenter; // clock center: value of x-axis + TH1D * fhNpartDist; // Npart distribution from Glauber MC + TH1D * fhbDist; // b distribution from Glauber MC + Float_t fClkCenter; // clock center: value of x-axis ClassDef(AliZDCRecoParamPbPb, 3) diff --git a/ZDC/AliZDCReconstructor.cxx b/ZDC/AliZDCReconstructor.cxx index 81d5887b84c..b40ce9f3b48 100644 --- a/ZDC/AliZDCReconstructor.cxx +++ b/ZDC/AliZDCReconstructor.cxx @@ -106,7 +106,7 @@ void AliZDCReconstructor::Init() ||((beamType.CompareTo("PP"))==0) || ((beamType.CompareTo("P-P"))==0)){ fRecoMode=1; } - else if((beamType.CompareTo("A-A")) == 0){ + else if((beamType.CompareTo("A-A")) == 0 || (beamType.CompareTo("AA")) == 0){ fRecoMode=2; } @@ -114,7 +114,8 @@ void AliZDCReconstructor::Init() if(fBeamEnergy<0.01) AliWarning(" Beam energy value missing -> E_beam = 0"); if(fIsCalibrationMB==kFALSE) - printf("\n\n ***** ZDC reconstruction initialized for %s @ %1.0f GeV *****\n\n",beamType.Data(), fBeamEnergy); + printf("\n\n ***** ZDC reconstruction initialized for %s @ %1.0f + %1.0f GeV *****\n\n", + beamType.Data(), fBeamEnergy, fBeamEnergy); } @@ -924,9 +925,10 @@ void AliZDCReconstructor::ReconstructEventPbPb(TTree *clustersTree, if(fIsCalibrationMB == kFALSE){ // ****** Reconstruction parameters ------------------ - if (!fgRecoParam) fgRecoParam = const_cast(GetRecoParam()); if(!fgMBCalibData) fgMBCalibData = const_cast(GetMBCalibData()); - + if(!fgRecoParam) fgRecoParam = const_cast(GetRecoParam()); + fgRecoParam->SetGlauberMCDist(fBeamEnergy); + TH2F *hZDCvsZEM = fgMBCalibData->GethZDCvsZEM(); TH2F *hZDCCvsZEM = fgMBCalibData->GethZDCCvsZEM(); TH2F *hZDCAvsZEM = fgMBCalibData->GethZDCAvsZEM(); @@ -1310,35 +1312,3 @@ AliZDCMBCalib* AliZDCReconstructor::GetMBCalibData() const return calibdata; } - -//_____________________________________________________________________________ -AliZDCRecoParampp* AliZDCReconstructor::GetppRecoParamFromOCDB() const -{ - - // Getting reconstruction parameters from OCDB - - AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/RecoParampp"); - if(!entry) AliFatal("No RecoParam data found in OCDB!"); - - AliZDCRecoParampp *param = dynamic_cast (entry->GetObject()); - if(!param) AliFatal("No RecoParam object in OCDB entry!"); - - return param; - -} - -//_____________________________________________________________________________ -AliZDCRecoParamPbPb* AliZDCReconstructor::GetPbPbRecoParamFromOCDB() const -{ - - // Getting reconstruction parameters from OCDB - - AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/RecoParamPbPb"); - if(!entry) AliFatal("No RecoParam data found in OCDB!"); - - AliZDCRecoParamPbPb *param = dynamic_cast (entry->GetObject()); - if(!param) AliFatal("No RecoParam object in OCDB entry!"); - - return param; - -} diff --git a/ZDC/AliZDCReconstructor.h b/ZDC/AliZDCReconstructor.h index 180edfc2adc..66a414f9675 100644 --- a/ZDC/AliZDCReconstructor.h +++ b/ZDC/AliZDCReconstructor.h @@ -65,8 +65,6 @@ public: AliZDCEnCalib *GetEnergyCalibData() const; AliZDCTowerCalib *GetTowerCalibData() const; AliZDCMBCalib *GetMBCalibData() const; - AliZDCRecoParampp *GetppRecoParamFromOCDB() const; - AliZDCRecoParamPbPb *GetPbPbRecoParamFromOCDB() const; private: AliZDCReconstructor(const AliZDCReconstructor&); //Not implemented diff --git a/ZDC/GlauberMCDist.root b/ZDC/GlauberMCDist.root new file mode 100644 index 0000000000000000000000000000000000000000..ed5bcdc0e2082af744290cf3c9680bf5c3909cba GIT binary patch literal 5075 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