X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=EMCAL%2FAliEMCALSDigitizer.cxx;h=7652203ee537be0fd8b2ff4540b78aa867444ad7;hb=1c01b4f8f320d56f005be7b75122808a22c8328e;hp=c35611561be492fa016a65bb1dae365d5b9de019;hpb=173558f22860f7dcd2985ea5eaf8b1bf750b3639;p=u%2Fmrichter%2FAliRoot.git diff --git a/EMCAL/AliEMCALSDigitizer.cxx b/EMCAL/AliEMCALSDigitizer.cxx index c35611561be..7652203ee53 100644 --- a/EMCAL/AliEMCALSDigitizer.cxx +++ b/EMCAL/AliEMCALSDigitizer.cxx @@ -1,954 +1,376 @@ /************************************************************************* - * 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$ */ - - //_________________________________________________________________________ - // This is a TTask that makes SDigits out of Hits - // A Summable Digits is the sum of all hits originating - // from one in one tower of the EMCAL - // A threshold for assignment of the primary to SDigit is applied - // SDigits are written to TreeS, branch "EMCAL" - // AliEMCALSDigitizer with all current parameters is written - // to TreeS branch "AliEMCALSDigitizer". - // Both branches have the same title. If necessary one can produce - // another set of SDigits with different parameters. Two versions - // can be distunguished using titles of the branches. - // User case: - // root [0] AliEMCALSDigitizer * s = new AliEMCALSDigitizer("galice.root") - // Warning in : object already instantiated - // root [1] s->ExecuteTask() - // // Makes SDigitis for all events stored in galice.root - // root [2] s->SetPedestalParameter(0.001) - // // One can change parameters of digitization - // root [3] s->SetSDigitsBranch("Redestal 0.001") - // // and write them into the new branch - // root [4] s->ExeciteTask("deb all tim") - // // available parameters: - // deb - print # of produced SDigitis - // deb all - print # and list of produced SDigits - // tim - print benchmarking information - // - //*-- Author : Sahal Yacoob (LBL) - // based on : AliPHOSSDigitzer - // Modif: - // August 2002 Yves Schutz: clone PHOS as closely as possible and intoduction - // of new IO (à la PHOS) - ////////////////////////////////////////////////////////////////////////////// - - - - // --- ROOT system --- - #include "TFile.h" - -#include "TTask.h" - -#include "TTree.h" - -#include "TSystem.h" - #include "TROOT.h" - -#include "TFolder.h" - #include "TBenchmark.h" -#include "TGeometry.h" - - - // --- Standard library --- -#include - - - // --- AliRoot header files --- - #include "AliRun.h" - -#include "AliHeader.h" - #include "AliEMCALDigit.h" - -#include "AliEMCALGeometry.h" - #include "AliEMCALGetter.h" - #include "AliEMCALHit.h" - #include "AliEMCALSDigitizer.h" - - +#include "AliEMCALGeometry.h" ClassImp(AliEMCALSDigitizer) - - - - //____________________________________________________________________________ - - AliEMCALSDigitizer::AliEMCALSDigitizer():TTask("AliEMCALSDigitizer","") - + AliEMCALSDigitizer::AliEMCALSDigitizer():TTask("","") { - // ctor - InitParameters() ; - fDefaultInit = kTRUE ; - } - - //____________________________________________________________________________ - -AliEMCALSDigitizer::AliEMCALSDigitizer(const char* headerFile, const char *sDigitsTitle, const Bool_t toSplit): - -TTask(sDigitsTitle, headerFile) - +AliEMCALSDigitizer::AliEMCALSDigitizer(const char * alirunFileName, const char * eventFolderName): + TTask("EMCAL"+AliConfig::fgkSDigitizerTaskName, alirunFileName), + fEventFolderName(eventFolderName) { - // ctor - - InitParameters() ; - - fToSplit = toSplit ; - Init(); - + InitParameters() ; fDefaultInit = kFALSE ; - } - //____________________________________________________________________________ - -AliEMCALSDigitizer::~AliEMCALSDigitizer() - -{ - - // dtor - - - - fSplitFile = 0 ; - +AliEMCALSDigitizer::AliEMCALSDigitizer(const AliEMCALSDigitizer & sd) { + //cpy ctor + + fA = sd.fA ; + fB = sd.fB ; + fPREPrimThreshold = sd.fPREPrimThreshold ; + fECPrimThreshold = sd.fECPrimThreshold ; + fHCPrimThreshold = sd.fHCPrimThreshold ; + fSDigitsInRun = sd.fSDigitsInRun ; + SetName(sd.GetName()) ; + SetTitle(sd.GetTitle()) ; + fEventFolderName = sd.fEventFolderName; } - //____________________________________________________________________________ - void AliEMCALSDigitizer::Init(){ - - - // Initialization: open root-file, allocate arrays for hits and sdigits, - // attach task SDigitizer to the list of EMCAL tasks - // - // Initialization can not be done in the default constructor - //============================================================= YS - // The initialisation is now done by the getter - - - if( strcmp(GetTitle(), "") == 0 ) - - SetTitle("galice.root") ; - - - - AliEMCALGetter * gime = AliEMCALGetter::GetInstance(GetTitle(), GetName(), fToSplit) ; - + fInit = kTRUE ; + + AliEMCALGetter * gime = AliEMCALGetter::Instance(GetTitle(), fEventFolderName.Data()); if ( gime == 0 ) { - - cerr << "ERROR: AliEMCALSDigitizer::Init -> Could not obtain the Getter object !" - - << endl ; - + Fatal("Init", "Could not obtain the Getter objectfor file %s and event %s !", GetTitle(), fEventFolderName.Data()) ; return ; - } - - - - gime->PostSDigits( GetName(), GetTitle() ) ; - - - fSplitFile = 0 ; - - if(fToSplit){ - - // construct the name of the file as /path/EMCAL.SDigits.root - - // First - extract full path if necessary - - TString sDigitsFileName(GetTitle()) ; - - Ssiz_t islash = sDigitsFileName.Last('/') ; - - if(islash(gROOT->GetFile(sDigitsFileName.Data())); - - if(!fSplitFile) - - fSplitFile = TFile::Open(sDigitsFileName.Data(),"update") ; - + TString opt("SDigits") ; + if(gime->VersionExists(opt) ) { + Error( "Init", "Give a version name different from %s", fEventFolderName.Data() ) ; + fInit = kFALSE ; } - - - - TString sdname(GetName() ); - - sdname.Append(":") ; - - sdname.Append(GetTitle() ) ; - - SetName(sdname) ; - - gime->PostSDigitizer(this) ; - + + gime->PostSDigitizer(this); + gime->EmcalLoader()->GetSDigitsDataLoader()->GetBaseTaskLoader()->SetDoNotReload(kTRUE); + } - - //____________________________________________________________________________ - -void AliEMCALSDigitizer::InitParameters(){ - +void AliEMCALSDigitizer::InitParameters() +{ fA = 0; - fB = 10000000.; - fTowerPrimThreshold = 0.01 ; - - fPreShowerPrimThreshold = 0.0001 ; - - fPhotonElectronFactor = 5000. ; // photoelectrons per GeV - - fSplitFile = 0 ; - - fToSplit = kFALSE ; + AliEMCALGetter * gime = AliEMCALGetter::Instance() ; + const AliEMCALGeometry * geom = gime->EMCALGeometry() ; + if (geom->GetSampling() == 0.) { + Error("InitParameters", "Sampling factor not set !") ; + abort() ; + } + else + Info("InitParameters", "Sampling factor set to %f\n", geom->GetSampling()) ; + + // this threshold corresponds approximately to 100 MeV + fECPrimThreshold = 100E-3 / ( geom->GetSampling() * ( geom->GetNPRLayers() + geom->GetNECLayers()) ) * geom->GetNECLayers() ; + fPREPrimThreshold = 100E-3 / ( geom->GetSampling() * ( geom->GetNPRLayers() + geom->GetNECLayers()) ) * geom->GetNPRLayers() ; + fHCPrimThreshold = fECPrimThreshold/5. ; // 5 is totally arbitrary } - - //____________________________________________________________________________ - -void AliEMCALSDigitizer::Exec(Option_t *option) { - - - -// Collects all hits in the same active volume into digit - - - - if( strcmp(GetName(), "") == 0 ) - - Init() ; - +void AliEMCALSDigitizer::Exec(Option_t *option) +{ + // Collects all hits in the section (PRE/ECAL/HCAL) of the same tower into digit - if (strstr(option, "print") ) { - Print("") ; - return ; - } - - if(strstr(option,"tim")) - gBenchmark->Start("EMCALSDigitizer"); - - - //Check, if this branch already exits - - AliEMCALGetter * gime = AliEMCALGetter::GetInstance() ; - - if(gime->BranchExists("SDigits") ) - - return; - - - - TString sdname(GetName()) ; - - sdname.Remove(sdname.Index(GetTitle())-1) ; - - - + AliEMCALGetter * gime = AliEMCALGetter::Instance() ; + + //switch off reloading of this task while getting event + if (!fInit) { // to prevent overwrite existing file + Error( "Exec", "Give a version name different from %s", fEventFolderName.Data() ) ; + return ; + } + Int_t nevents = gime->MaxEvent() ; + Int_t ievent ; + for(ievent = 0; ievent < nevents; ievent++){ + + gime->Event(ievent,"H") ; - Int_t ievent ; - - for(ievent = 0; ievent < nevents; ievent++){ - - gime->Event(ievent,"H") ; - - const TClonesArray * hits = gime->Hits() ; - - TClonesArray * sdigits = gime->SDigits(sdname.Data()) ; - + TTree * treeS = gime->TreeS(); + TClonesArray * hits = gime->Hits() ; + TClonesArray * sdigits = gime->SDigits() ; sdigits->Clear(); - Int_t nSdigits = 0 ; - - - - //Collects all hits in the same active volume into digit - - - //Now make SDigits from hits, for EMCAL it is the same, so just copy - - Int_t nPrim = static_cast((gAlice->TreeH())->GetEntries()) ; - + Int_t nPrim = static_cast((gime->TreeH())->GetEntries()) ; // Attention nPrim is the number of primaries tracked by Geant - // and this number could be different to the number of Primaries in TreeK; - Int_t iprim ; - for ( iprim = 0 ; iprim < nPrim ; iprim++ ) { - - //=========== Get the EMCAL branch from Hits Tree for the Primary iprim - - gime->Track(iprim) ; - - Int_t i; - - for ( i = 0 ; i < hits->GetEntries() ; i++ ) { - - AliEMCALHit * hit = dynamic_cast(hits->At(i)) ; - - AliEMCALDigit * curSDigit = 0 ; + for ( iprim = 0 ; iprim < nPrim ; iprim++ ) { + //=========== Get the EMCAL branch from Hits Tree for the Primary iprim + gime->Track(iprim) ; + Int_t i; + for ( i = 0 ; i < hits->GetEntries() ; i++ ) { + AliEMCALHit * hit = dynamic_cast(hits->At(i)) ; + AliEMCALDigit * curSDigit = 0 ; + AliEMCALDigit * sdigit = 0 ; + Bool_t newsdigit = kTRUE; - AliEMCALDigit * sdigit = 0 ; + // Assign primary number only if deposited energy is significant - Bool_t newsdigit = kTRUE; - - // Assign primary number only if deposited energy is significant - - - - if( (!hit->IsInPreShower() && hit->GetEnergy() > fTowerPrimThreshold) || - - (hit->IsInPreShower() && hit->GetEnergy() > fPreShowerPrimThreshold)) + AliEMCALGeometry * geom = gime->EMCALGeometry() ; + if( geom->IsInPRE(hit->GetId()) ) + if( hit->GetEnergy() > fPREPrimThreshold ) curSDigit = new AliEMCALDigit( hit->GetPrimary(), - - hit->GetIparent(),Layer2TowerID(hit->GetId(),hit->IsInPreShower()), - + hit->GetIparent(), hit->GetId(), Digitize(hit->GetEnergy()), hit->GetTime() ) ; - - else - + else curSDigit = new AliEMCALDigit( -1 , - -1 , - - Layer2TowerID(hit->GetId(),hit->IsInPreShower()), - - Digitize(hit->GetEnergy()), hit->GetTime() ) ; - - Int_t check = 0 ; - - for(check= 0; check < nSdigits ; check++) { - - sdigit = dynamic_cast(sdigits->At(check)) ; - - if( sdigit->GetId() == curSDigit->GetId()) { // Are we in the same tower or the same preshower ? - - *sdigit = *sdigit + *curSDigit; - - newsdigit = kFALSE; - - } - - } - - if (newsdigit) { - - new((*sdigits)[nSdigits]) AliEMCALDigit(*curSDigit); - - nSdigits++ ; - - } - - } // loop over all hits (hit = deposited energy/layer/entering particle) - - } // loop over iprim - - - - sdigits->Sort() ; - - - - nSdigits = sdigits->GetEntriesFast() ; - - fSDigitsInRun += nSdigits ; - - sdigits->Expand(nSdigits) ; - - - - const AliEMCALGeometry * geom = gime->EMCALGeometry() ; - - - - Int_t lastPreShowerIndex = nSdigits - 1 ; - - if (!(dynamic_cast(sdigits->At(lastPreShowerIndex))->IsInPreShower())) - - lastPreShowerIndex = -2; - - Int_t firstPreShowerIndex = 100000 ; - - Int_t index ; - - AliEMCALDigit * sdigit = 0 ; - - for ( index = 0; index < nSdigits ; index++) { - - sdigit = dynamic_cast(sdigits->At(index) ) ; - - if (sdigit->IsInPreShower() ){ - - firstPreShowerIndex = index ; - - break ; - - } - - } - + hit->GetId(), + Digitize(hit->GetEnergy()), hit->GetTime() ) ; + else if( geom->IsInECA(hit->GetId()) ) + if( hit->GetEnergy() > fECPrimThreshold ) + curSDigit = new AliEMCALDigit( hit->GetPrimary(), + hit->GetIparent(), hit->GetId(), + Digitize(hit->GetEnergy()), hit->GetTime() ) ; + else + curSDigit = new AliEMCALDigit( -1 , + -1 , + hit->GetId(), + Digitize(hit->GetEnergy()), hit->GetTime() ) ; + else if( geom->IsInHCA(hit->GetId()) ) + if( hit->GetEnergy() > fHCPrimThreshold ) + + curSDigit = new AliEMCALDigit( hit->GetPrimary(), + hit->GetIparent(), hit->GetId(), + Digitize(hit->GetEnergy()), hit->GetTime() ) ; + else + curSDigit = new AliEMCALDigit( -1 , + -1 , + hit->GetId(), + Digitize(hit->GetEnergy()), hit->GetTime() ) ; - - AliEMCALDigit * preshower ; - - AliEMCALDigit * tower ; - - Int_t lastIndex = lastPreShowerIndex +1 ; - - - - for (index = firstPreShowerIndex ; index <= lastPreShowerIndex; index++) { - - preshower = dynamic_cast(sdigits->At(index) ); - - Bool_t towerFound = kFALSE ; - - Int_t jndex ; - - for (jndex = 0; jndex < firstPreShowerIndex; jndex++) { - - tower = dynamic_cast(sdigits->At(jndex) ); - - if ( (preshower->GetId() - (geom->GetNZ() * geom->GetNPhi()) ) == tower->GetId() ) { - - Float_t towerEnergy = static_cast(tower->GetAmp()) ; - - Float_t preshoEnergy = static_cast(preshower->GetAmp()) ; - - towerEnergy +=preshoEnergy ; - - *tower = *tower + *preshower ; // and add preshower multiplied by layer ratio to tower - - tower->SetAmp(static_cast(TMath::Ceil(towerEnergy))) ; - - towerFound = kTRUE ; - + Int_t check = 0 ; + for(check= 0; check < nSdigits ; check++) { + sdigit = dynamic_cast(sdigits->At(check)) ; + if( sdigit->GetId() == curSDigit->GetId()) { // Are we in the same ECAL/HCAL/preshower tower ? + *sdigit = *sdigit + *curSDigit; + newsdigit = kFALSE; } - } - - if ( !towerFound ) { - - - - new((*sdigits)[lastIndex]) AliEMCALDigit(*preshower); - - AliEMCALDigit * temp = dynamic_cast(sdigits->At(lastIndex)) ; - - temp->SetId(temp->GetId() - (geom->GetNZ() * geom->GetNPhi()) ) ; - - lastIndex++ ; - + if (newsdigit) { + new((*sdigits)[nSdigits]) AliEMCALDigit(*curSDigit); + nSdigits++ ; } + delete curSDigit ; + } // loop over all hits (hit = deposited energy/layer/entering particle) + } // loop over iprim + + sdigits->Sort() ; + + nSdigits = sdigits->GetEntriesFast() ; + fSDigitsInRun += nSdigits ; + sdigits->Expand(nSdigits) ; + + Int_t NPrimarymax = -1 ; + Int_t i ; + for (i = 0 ; i < sdigits->GetEntriesFast() ; i++) { + AliEMCALDigit * sdigit = dynamic_cast(sdigits->At(i)) ; + sdigit->SetIndexInList(i) ; + } + + for (i = 0 ; i < sdigits->GetEntriesFast() ; i++) { + if (((dynamic_cast(sdigits->At(i)))->GetNprimary()) > NPrimarymax) + NPrimarymax = ((dynamic_cast(sdigits->At(i)))->GetNprimary()) ; + } + + // Now write SDigits + + //First list of sdigits - } - - - - sdigits->Sort() ; - - Int_t NPrimarymax = -1 ; - - Int_t i ; - - for (i = 0 ; i < sdigits->GetEntriesFast() ; i++) { - - sdigit = dynamic_cast(sdigits->At(i)) ; - - sdigit->SetIndexInList(i) ; - - } - - - - for (i = 0 ; i < sdigits->GetEntriesFast() ; i++) { - - if (((dynamic_cast(sdigits->At(i)))->GetNprimary()) > NPrimarymax) - - NPrimarymax = ((dynamic_cast(sdigits->At(i)))->GetNprimary()) ; - - } - - - - //Now write SDigits - - - - if(gAlice->TreeS() == 0 || (fSplitFile)) //<--- To be checked: we should not create TreeS if it is already here - - gAlice->MakeTree("S",fSplitFile); - - - - if(fSplitFile) - - fSplitFile->cd() ; - - - - //First list of sdigits - - Int_t bufferSize = 32000 ; - - TBranch * sdigitsBranch = gAlice->TreeS()->Branch("EMCAL",&sdigits,bufferSize); - - sdigitsBranch->SetTitle(sdname); - - - - //NEXT - SDigitizer - - Int_t splitlevel = 0 ; - - AliEMCALSDigitizer * sd = this ; - - TBranch * sdigitizerBranch = gAlice->TreeS()->Branch("AliEMCALSDigitizer","AliEMCALSDigitizer", - - &sd,bufferSize,splitlevel); - - sdigitizerBranch->SetTitle(sdname); - - - - sdigitsBranch->Fill() ; - - sdigitizerBranch->Fill() ; - - gAlice->TreeS()->AutoSave() ; - - - - if(strstr(option,"deb")) - - PrintSDigits(option) ; - - - - } - - - - if(strstr(option,"tim")){ - - gBenchmark->Stop("EMCALSDigitizer"); - - cout << "AliEMCALSDigitizer:" << endl ; - - cout << " took " << gBenchmark->GetCpuTime("EMCALSDigitizer") << " seconds for SDigitizing " - - << gBenchmark->GetCpuTime("EMCALSDigitizer") << " seconds per event " << endl ; - - cout << endl ; - - } - -} - - - -//__________________________________________________________________ - -void AliEMCALSDigitizer::SetSDigitsBranch(const char * title ){ - + Int_t bufferSize = 32000 ; + TBranch * sdigitsBranch = treeS->Branch("EMCAL",&sdigits,bufferSize); + sdigitsBranch->Fill() ; - // Setting title to branch SDigits - - - - TString stitle(title) ; - - - - // check if branch with title already exists - - TBranch * sdigitsBranch = - - static_cast(gAlice->TreeS()->GetListOfBranches()->FindObject("EMCAL")) ; - - TBranch * sdigitizerBranch = - - static_cast(gAlice->TreeS()->GetListOfBranches()->FindObject("AliEMCALSDigitizer")) ; - - const char * sdigitsTitle = sdigitsBranch ->GetTitle() ; - - const char * sdigitizerTitle = sdigitizerBranch ->GetTitle() ; - - if ( stitle.CompareTo(sdigitsTitle)==0 || stitle.CompareTo(sdigitizerTitle)==0 ){ - - cerr << "ERROR: AliEMCALSdigitizer::SetSDigitsBranch -> Cannot overwrite existing branch with title " << title << endl ; - - return ; + gime->WriteSDigits("OVERWRITE"); + + //NEXT - SDigitizer + gime->WriteSDigitizer("OVERWRITE"); + + if(strstr(option,"deb")) + PrintSDigits(option) ; } + Unload(); - - cout << "AliEMCALSdigitizer::SetSDigitsBranch -> Changing SDigits file from " << GetName() << " to " << title << endl ; - - - - SetName(title) ; - - - - // Post to the WhiteBoard - - AliEMCALGetter * gime = AliEMCALGetter::GetInstance() ; - - gime->PostSDigits( title, GetTitle()) ; - + gime->EmcalLoader()->GetSDigitsDataLoader()->GetBaseTaskLoader()->SetDoNotReload(kTRUE); + + if(strstr(option,"tim")){ + gBenchmark->Stop("EMCALSDigitizer"); + Info("Exec", "took %f seconds for SDigitizing %f seconds per event", + gBenchmark->GetCpuTime("EMCALSDigitizer"), gBenchmark->GetCpuTime("EMCALSDigitizer") ) ; + } } - - - //__________________________________________________________________ - void AliEMCALSDigitizer::Print(Option_t* option)const - { - // Prints parameters of SDigitizer - - - - cout << "------------------- "<< GetName() << " -------------" << endl ; - - cout << " Writing SDigitis to branch with title " << GetName() << endl ; - - cout << " with digitization parameters A = " << fA << endl ; - - cout << " B = " << fB << endl ; - - cout << " Threshold for Primary assignment in Tower = " << fTowerPrimThreshold << endl ; - - cout << " Threshold for Primary assignment in PreShower = " << fPreShowerPrimThreshold << endl ; - - cout << "---------------------------------------------------"<SDigits(sdname.Data()) ; - + AliEMCALGetter * gime = AliEMCALGetter::Instance() ; + const TClonesArray * sdigits = gime->SDigits() ; - - cout << "AliEMCALSDigitiser: event " << gAlice->GetEvNumber() << endl ; - - cout << " Number of entries in SDigits list " << sdigits->GetEntriesFast() << endl ; - - cout << endl ; - + TString message("\n") ; + message += "event " ; + message += gAlice->GetEvNumber() ; + message += "\n Number of entries in SDigits list " ; + message += sdigits->GetEntriesFast() ; if(strstr(option,"all")||strstr(option,"EMC")){ - - - + //loop over digits - AliEMCALDigit * digit; - - cout << "SDigit Id " << " Amplitude " << " Time " << " Index " << " Nprim " << " Primaries list " << endl; - + message += "\n Id Amplitude Time Index Nprim: Primaries list \n" ; Int_t index ; - + char * tempo = new char[8192]; for (index = 0 ; index < sdigits->GetEntries() ; index++) { - digit = dynamic_cast( sdigits->At(index) ) ; - - cout << setw(6) << digit->GetId() << " " << setw(10) << digit->GetAmp() << " " << digit->GetTime() - - << setw(6) << digit->GetIndexInList() << " " - - << setw(5) << digit->GetNprimary() <<" "; - + sprintf(tempo, "\n%6d %8d %6.5e %4d %2d :", + digit->GetId(), digit->GetAmp(), digit->GetTime(), digit->GetIndexInList(), digit->GetNprimary()) ; + message += tempo ; - Int_t iprimary; - - for (iprimary=0; iprimaryGetNprimary(); iprimary++) - - cout << " " << digit->GetPrimary(iprimary+1) << " "; - - cout << endl; - + for (iprimary=0; iprimaryGetNprimary(); iprimary++) { + sprintf(tempo, "%d ",digit->GetPrimary(iprimary+1) ) ; + message += tempo ; + } } - - cout <EMCALGeometry(); - - Int_t ieta = ((ihit-1)/geom->GetNPhi())%geom->GetNZ(); // eta Tower Index - - Int_t iphi = (ihit-1)%(geom->GetNPhi())+1; //phi Tower Index - - Int_t it = -10; - - Int_t ipre = 0; - - - - if (preshower)ipre = 1; - - if (iphi > 0 && ieta >= 0){ - - it = iphi+ieta*geom->GetNPhi() + ipre*geom->GetNPhi()*geom->GetNZ(); - - return it; - - }else{ - - cerr << " AliEMCALSDigitizer::Layer2TowerID() -- there is an error "<< endl << "Eta number = " - - << ieta << "Phi number = " << iphi << endl ; - - return it; - - } // end if iphi>0 && ieta>0 - -} - -//_______________________________________________________________________________________ - -// void AliEMCALSDigitizer::TestTowerID(void) - -// { - -// Int_t j; - - - -// Bool_t preshower = kFALSE; - -// for (j = 0 ; j < 10 ; j++){ // loop over hit id - -// Int_t i; - -// for (i = 0 ; i <= 2 ; i++){ // loop over - -// Int_t k = i*96*144+j*144+1; - -// cout << " Hit Index = " << k << " " << j*10 << " TOWERID = " << Layer2TowerID(k, preshower) << endl ; - -// } - -// } - -// } - - - //____________________________________________________________________________ - -void AliEMCALSDigitizer::UseHitsFrom(const char * filename) - +void AliEMCALSDigitizer::Unload() const { - - SetTitle(filename) ; - - Init() ; - + AliEMCALGetter * gime = AliEMCALGetter::Instance() ; + AliEMCALLoader * loader = gime->EmcalLoader() ; + loader->UnloadHits() ; + loader->UnloadSDigits() ; } -