/************************************************************************** * 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 // --- 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 zn1corr=0, zp1corr=0, zn2corr=0, zp2corr=0, zemcorr=0; for (Int_t iDigit = 0; iDigit < treeD->GetEntries(); iDigit++) { treeD->GetEntry(iDigit); if (!pdigit) continue; if(digit.GetSector(0) == 1) zn1corr += (Float_t) (digit.GetADCValue(0)-meanPed[digit.GetSector(1)]); // high gain ZN1 ADCs else if(digit.GetSector(0) == 2) zp1corr += (Float_t) (digit.GetADCValue(0)-meanPed[digit.GetSector(1)+10]); // high gain ZP1 ADCs else if(digit.GetSector(0) == 3){ if(digit.GetSector(1)==1) zemcorr += (Float_t) (digit.GetADCValue(0)-meanPed[digit.GetSector(1)+20]); // high gain ZEM1 ADCs else if(digit.GetSector(1)==2) zemcorr += (Float_t) (digit.GetADCValue(0)-meanPed[digit.GetSector(1)+22]); // high gain ZEM2 ADCs } else if(digit.GetSector(0) == 4) zn2corr += (Float_t) (digit.GetADCValue(0)-meanPed[digit.GetSector(1)+24]); // high gain ZN2 ADCs else if(digit.GetSector(0) == 5) zp2corr += (Float_t) (digit.GetADCValue(0)-meanPed[digit.GetSector(1)+34]); // high gain ZP2 ADCs } if(zn1corr<0) zn1corr=0; if(zp1corr<0) zp1corr=0; if(zn2corr<0) zn2corr=0; if(zp2corr<0) zp2corr=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, zn1corr, zp1corr, zemcorr, zn2corr, zp2corr); } 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 zn1corr=0, zp1corr=0, zn2corr=0, zp2corr=0,zemcorr=0; AliZDCRawStream digit(rawReader); while (digit.Next()) { if(digit.IsADCDataWord()){ if(digit.GetADCGain() == 0){ if(digit.GetSector(0) == 1) zn1corr += (Float_t) (digit.GetADCValue()-meanPed[digit.GetSector(1)]); // high gain ZN1 ADCs; else if(digit.GetSector(0) == 2) zp1corr += (Float_t) (digit.GetADCValue()-meanPed[digit.GetSector(1)+10]); // high gain ZP1 ADCs; else if(digit.GetSector(0) == 3) if(digit.GetSector(1)==1) zemcorr += (Float_t) (digit.GetADCValue()-meanPed[digit.GetSector(1)+20]); // high gain ZEM1 ADCs else if(digit.GetSector(1)==2) zemcorr += (Float_t) (digit.GetADCValue()-meanPed[digit.GetSector(1)+22]); // high gain ZEM2 ADCs else if(digit.GetSector(0) == 4) zn2corr += (Float_t) (digit.GetADCValue()-meanPed[digit.GetSector(1)+24]); // high gain ZN2 ADCs; else if(digit.GetSector(0) == 5) zp2corr += (Float_t) (digit.GetADCValue()-meanPed[digit.GetSector(1)+34]); // high gain ZP2 ADCs; } } } if(zn1corr<0) zn1corr=0; if(zp1corr<0) zp1corr=0; if(zn2corr<0) zn2corr=0; if(zp2corr<0) zp2corr=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, zn1corr, zp1corr, zemcorr, zn2corr, zp2corr); } loader->UnloadRecPoints(); } //_____________________________________________________________________________ void AliZDCReconstructor::ReconstructEvent(AliLoader* loader, Float_t zn1corr, Float_t zp1corr, Float_t zemcorr, Float_t zn2corr, Float_t zp2corr) 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 zn1phe, zp1phe, zemphe, zn2phe, zp2phe, convFactor = 0.08; zn1phe = zn1corr/convFactor; zp1phe = zp1corr/convFactor; zemphe = zemcorr/convFactor; zn2phe = zn2corr/convFactor; zp2phe = zp2corr/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 zn1energy, zp1energy, zemenergy, zdc1energy, zn2energy, zp2energy, zdc2energy; Float_t zn1phexTeV=329., zp1phexTeV=369., zn2phexTeV=329., zp2phexTeV=369.; zn1energy = zn1phe/zn1phexTeV; zp1energy = zp1phe/zp1phexTeV; zdc1energy = zn1energy+zp1energy; zn2energy = zn2phe/zn2phexTeV; zp2energy = zp2phe/zp2phexTeV; zdc2energy = zn2energy+zp2energy; 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 detected spectator nucleons // *** N.B. -> It works only in Pb-Pb Int_t nDetSpecNLeft, nDetSpecPLeft, nDetSpecNRight, nDetSpecPRight; nDetSpecNLeft = (Int_t) (zn1energy/2.760); nDetSpecPLeft = (Int_t) (zp1energy/2.760); nDetSpecNRight = (Int_t) (zn2energy/2.760); nDetSpecPRight = (Int_t) (zp2energy/2.760); // --- Number of generated spectator nucleons (from HIJING parameterization) // *** N.B. -> Only one side!!! Int_t nGenSpecN=0, nGenSpecP=0, nGenSpec=0; Double_t impPar=0; // Cut value for Ezem (GeV) // ### Results from production -> 0 (eZEMCut+deltaEZEMSup)){ nGenSpecN = (Int_t) (fZNCen->Eval(zn1energy)); nGenSpecP = (Int_t) (fZPCen->Eval(zp1energy)); nGenSpec = (Int_t) (fZDCCen->Eval(zdc1energy)); impPar = fbCen->Eval(zdc1energy); } else if(zemenergy < (eZEMCut-deltaEZEMInf)){ nGenSpecN = (Int_t) (fZNPer->Eval(zn1energy)); nGenSpecP = (Int_t) (fZPPer->Eval(zp1energy)); nGenSpec = (Int_t) (fZDCPer->Eval(zdc1energy)); impPar = fbPer->Eval(zdc1energy); } 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); } // ### Results from production -> 0162.) nGenSpecN = (Int_t) (fZEMn->Eval(zemenergy)); if(zp1energy>59.75) nGenSpecP = (Int_t) (fZEMp->Eval(zemenergy)); if(zdc1energy>221.5) nGenSpec = (Int_t)(fZEMsp->Eval(zemenergy)); if(zdc1energy>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 generated participants (from HIJING parameterization) 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(zn1energy, zp1energy, zdc1energy, zemenergy, zn2energy, zp2energy, zdc2energy, nDetSpecNLeft, nDetSpecPLeft, nDetSpecNRight, nDetSpecPRight, 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.GetZN1energy(), reco.GetZP1energy(), reco.GetZEMenergy(), reco.GetZN2energy(), reco.GetZP2energy(), 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() const { // Getting calibration object for ZDC set AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/Data"); AliZDCCalibData *calibdata = (AliZDCCalibData*) entry->GetObject(); if (!calibdata) AliWarning("No calibration data from calibration database !"); return calibdata; }