/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * 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. * **************************************************************************/ /* $Id$ */ /////////////////////////////////////////////////////////////////////////////// // // // class for ZDC reconstruction // // // /////////////////////////////////////////////////////////////////////////////// #include #include "AliRunLoader.h" #include "AliRawReader.h" #include "AliESD.h" #include "AliZDCDigit.h" #include "AliZDCRawStream.h" #include "AliZDCReco.h" #include "AliZDCReconstructor.h" #include "AliZDCCalibData.h" ClassImp(AliZDCReconstructor) //_____________________________________________________________________________ AliZDCReconstructor:: AliZDCReconstructor() { // **** Default constructor fStorage = 0; // --- Number of generated spectator nucleons and impact parameter // -------------------------------------------------------------------------------------------------- // [1] ### Results from a new production -> 0 0 0GetMeanPed(jj); AliLoader* loader = runLoader->GetLoader("ZDCLoader"); if (!loader) return; loader->LoadDigits("read"); loader->LoadRecPoints("recreate"); AliZDCDigit digit; AliZDCDigit* pdigit = &digit; // Event loop for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) { runLoader->GetEvent(iEvent); // load digits loader->LoadDigits(); TTree* treeD = loader->TreeD(); if (!treeD) continue; treeD->SetBranchAddress("ZDC", &pdigit); // loop over digits Float_t zncorr=0, zpcorr=0, zemcorr=0; for (Int_t iDigit = 0; iDigit < treeD->GetEntries(); iDigit++) { treeD->GetEntry(iDigit); if (!pdigit) continue; if(digit.GetSector(0) == 1) zncorr += (Float_t) (digit.GetADCValue(0)-meanPed[digit.GetSector(1)]); // ped 4 high gain ZN ADCs else if(digit.GetSector(0) == 2) zpcorr += (Float_t) (digit.GetADCValue(0)-meanPed[digit.GetSector(1)+10]); // ped 4 high gain ZP ADCs else if(digit.GetSector(0) == 3){ if(digit.GetSector(1)==1) zemcorr += (Float_t) (digit.GetADCValue(0)-meanPed[digit.GetSector(1)+20]); // ped 4 high gain ZEM1 ADCs else if(digit.GetSector(1)==2) zemcorr += (Float_t) (digit.GetADCValue(0)-meanPed[digit.GetSector(1)+22]); // ped 4 high gain ZEM2 ADCs } } if(zncorr<0) zncorr=0; if(zpcorr<0) zpcorr=0; if(zemcorr<0) zemcorr=0; // reconstruct the event //printf("\n \t ZDCReco from digits-> Ev.#%d ZN = %.0f, ZP = %.0f, ZEM = %.0f\n",iEvent,zncorr,zpcorr,zemcorr); ReconstructEvent(loader, zncorr, zpcorr, zemcorr); } loader->UnloadDigits(); loader->UnloadRecPoints(); } //_____________________________________________________________________________ void AliZDCReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* rawReader) const { // *** Local ZDC reconstruction for raw data Float_t meanPed[47]; for(Int_t jj=0; jj<47; jj++) meanPed[jj] = fCalibData->GetMeanPed(jj); AliLoader* loader = runLoader->GetLoader("ZDCLoader"); if (!loader) return; loader->LoadRecPoints("recreate"); // Event loop Int_t iEvent = 0; while (rawReader->NextEvent()) { runLoader->GetEvent(iEvent++); // loop over raw data digits Float_t zncorr=0, zpcorr=0, zemcorr=0; AliZDCRawStream digit(rawReader); while (digit.Next()) { if(digit.IsADCDataWord()){ if(digit.GetADCGain() == 0){ if(digit.GetSector(0) == 1) zncorr += (Float_t) (digit.GetADCValue()-meanPed[digit.GetSector(1)]); // pedestals for high gain ZN ADCs; else if(digit.GetSector(0) == 2) zpcorr += (Float_t) (digit.GetADCValue()-meanPed[digit.GetSector(1)+10]); // pedestals for high gain ZP ADCs; else if(digit.GetSector(0) == 3) zemcorr += (Float_t) (digit.GetADCValue()-meanPed[digit.GetSector(1)+20]); // pedestals for high gain ZEM ADCs; } } } if(zncorr<0) zncorr=0; if(zpcorr<0) zpcorr=0; if(zemcorr<0) zemcorr=0; // reconstruct the event //printf("\n\t ZDCReco from raw-> Ev.#%d ZN = %.0f, ZP = %.0f, ZEM = %.0f\n",iEvent,zncorr,zpcorr,zemcorr); ReconstructEvent(loader, zncorr, zpcorr, zemcorr); } loader->UnloadRecPoints(); } //_____________________________________________________________________________ void AliZDCReconstructor::ReconstructEvent(AliLoader* loader, Float_t zncorr, Float_t zpcorr, Float_t zemcorr) const { // ***** Reconstruct one event // --- ADCchannel -> photoelectrons // NB-> PM gain = 10^(5), ADC resolution = 6.4*10^(-7) // Move to V965 (E.S.,15/09/04) NB-> PM gain = 10^(5), ADC resolution = 8*10^(-7) Float_t znphe, zpphe, zemphe, convFactor = 0.08; znphe = zncorr/convFactor; zpphe = zpcorr/convFactor; zemphe = zemcorr/convFactor; //if AliDebug(1,Form("\n znphe = %f, zpphe = %f, zemphe = %f\n",znphe, zpphe, zemphe); // --- Energy calibration // Conversion factors for hadronic ZDCs goes from phe yield to TRUE // incident energy (conversion from GeV to TeV is included); while for EM // calos conversion is from light yield to detected energy calculated by // GEANT NB -> ZN and ZP conversion factors are constant since incident // spectators have all the same energy, ZEM energy is obtained through a // fit over the whole range of incident particle energies // (obtained with full HIJING simulations) Float_t znenergy, zpenergy, zemenergy, zdcenergy; Float_t znphexTeV=329., zpphexTeV=369.; znenergy = znphe/znphexTeV; zpenergy = zpphe/zpphexTeV; zdcenergy = znenergy+zpenergy; zemenergy = -4.81+0.3238*zemphe; if(zemenergy<0) zemenergy=0; // if AliDebug(1,Form(" znenergy = %f TeV, zpenergy = %f TeV, zdcenergy = %f GeV, " // "\n zemenergy = %f TeV\n", znenergy, zpenergy, // zdcenergy, zemenergy); // if(zdcenergy==0) // if AliDebug(1,Form("\n\n ### ATTENZIONE!!! -> ev# %d: znenergy = %f TeV, zpenergy = %f TeV, zdcenergy = %f GeV, " // " zemenergy = %f TeV\n\n", fMerger->EvNum(), znenergy, zpenergy, zdcenergy, zemenergy); // --- Number of incident spectator nucleons Int_t nDetSpecN, nDetSpecP; nDetSpecN = (Int_t) (znenergy/2.760); nDetSpecP = (Int_t) (zpenergy/2.760); // if AliDebug(1,Form("\n nDetSpecN = %d, nDetSpecP = %d\n",nDetSpecN, nDetSpecP); Int_t nGenSpecN=0, nGenSpecP=0, nGenSpec=0; Double_t impPar=0; // Cut value for Ezem (GeV) // [2] ### Results from a new production -> 0 (eZEMCut+deltaEZEMSup)){ nGenSpecN = (Int_t) (fZNCen->Eval(znenergy)); nGenSpecP = (Int_t) (fZPCen->Eval(zpenergy)); nGenSpec = (Int_t) (fZDCCen->Eval(zdcenergy)); impPar = fbCen->Eval(zdcenergy); } else if(zemenergy < (eZEMCut-deltaEZEMInf)){ nGenSpecN = (Int_t) (fZNPer->Eval(znenergy)); nGenSpecP = (Int_t) (fZPPer->Eval(zpenergy)); nGenSpec = (Int_t) (fZDCPer->Eval(zdcenergy)); impPar = fbPer->Eval(zdcenergy); } else if(zemenergy >= (eZEMCut-deltaEZEMInf) && zemenergy <= (eZEMCut+deltaEZEMSup)){ nGenSpecN = (Int_t) (fZEMn->Eval(zemenergy)); nGenSpecP = (Int_t) (fZEMp->Eval(zemenergy)); nGenSpec = (Int_t)(fZEMsp->Eval(zemenergy)); impPar = fZEMb->Eval(zemenergy); } // [2] ### Results from a new production -> 0162.) nGenSpecN = (Int_t) (fZEMn->Eval(zemenergy)); if(zpenergy>59.75) nGenSpecP = (Int_t) (fZEMp->Eval(zemenergy)); if(zdcenergy>221.5) nGenSpec = (Int_t)(fZEMsp->Eval(zemenergy)); if(zdcenergy>220.) impPar = fZEMb->Eval(zemenergy); if(nGenSpecN>125) nGenSpecN=125; else if(nGenSpecN<0) nGenSpecN=0; if(nGenSpecP>82) nGenSpecP=82; else if(nGenSpecP<0) nGenSpecP=0; if(nGenSpec>207) nGenSpec=207; else if(nGenSpec<0) nGenSpec=0; // --- Number of participants Int_t nPart, nPartTot; nPart = 207-nGenSpecN-nGenSpecP; nPartTot = 207-nGenSpec; //printf("\t ZDCeventReco-> ZNEn = %.0f GeV, ZPEn = %.0f GeV, ZEMEn = %.0f GeV\n", // znenergy, zpenergy, zemenergy); // create the output tree loader->MakeTree("R"); TTree* treeR = loader->TreeR(); AliZDCReco reco(znenergy, zpenergy, zdcenergy, zemenergy, nDetSpecN, nDetSpecP, nGenSpecN, nGenSpecP, nGenSpec, nPartTot, impPar); AliZDCReco* preco = &reco; const Int_t kBufferSize = 4000; treeR->Branch("ZDC", "AliZDCReco", &preco, kBufferSize); // write the output tree treeR->Fill(); loader->WriteRecPoints("OVERWRITE"); } //_____________________________________________________________________________ void AliZDCReconstructor::FillESD(AliRunLoader* runLoader, AliESD* esd) const { // fill energies and number of participants to the ESD AliLoader* loader = runLoader->GetLoader("ZDCLoader"); if (!loader) return; loader->LoadRecPoints(); TTree* treeR = loader->TreeR(); if (!treeR) return; AliZDCReco reco; AliZDCReco* preco = &reco; treeR->SetBranchAddress("ZDC", &preco); treeR->GetEntry(0); esd->SetZDC(reco.GetZNenergy(), reco.GetZPenergy(), reco.GetZEMenergy(), reco.GetNPart()); loader->UnloadRecPoints(); } //_____________________________________________________________________________ AliCDBStorage* AliZDCReconstructor::SetStorage(const char *uri) { //printf("\n\t AliZDCReconstructor::SetStorage \n"); Bool_t deleteManager = kFALSE; AliCDBManager *manager = AliCDBManager::Instance(); AliCDBStorage *defstorage = manager->GetDefaultStorage(); if(!defstorage || !(defstorage->Contains("ZDC"))){ AliWarning("No default storage set or default storage doesn't contain ZDC!"); manager->SetDefaultStorage(uri); deleteManager = kTRUE; } AliCDBStorage *storage = manager->GetDefaultStorage(); if(deleteManager){ AliCDBManager::Instance()->UnsetDefaultStorage(); defstorage = 0; // the storage is killed by AliCDBManager::Instance()->Destroy() } return storage; } //_____________________________________________________________________________ AliZDCCalibData* AliZDCReconstructor::GetCalibData(int runNumber) const { //printf("\n\t AliZDCReconstructor::GetCalibData \n"); AliCDBEntry *entry = fStorage->Get("ZDC/Calib/Data",runNumber); AliZDCCalibData *calibdata = (AliZDCCalibData*) entry->GetObject(); if (!calibdata) AliWarning("No calibration data from calibration database !"); return calibdata; }