X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOSSDigitizer.cxx;h=cd106de44ec39278d4c383a9ab8d83d3b03cc5cf;hb=eea478d336f5bd7c271e88819a26d882eb4f45d4;hp=9780671a2df3534a48c786c125ead502f053e2b8;hpb=990119d6135a6dabeff252828891563af675574e;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSSDigitizer.cxx b/PHOS/AliPHOSSDigitizer.cxx index 9780671a2df..cd106de44ec 100644 --- a/PHOS/AliPHOSSDigitizer.cxx +++ b/PHOS/AliPHOSSDigitizer.cxx @@ -13,210 +13,349 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ + /* $Id$ */ //_________________________________________________________________________ -// This is a TTask that constructs SDigits out of Hits -// A Summable Digits is the sum of all hits in a cell -// A threshold is applied +// This is a TTask that makes SDigits out of Hits +// The name of the TTask is also the title of the branch that will contain +// the created SDigits +// The title of the TTAsk is the name of the file that contains the hits from +// which the SDigits are created +// A Summable Digits is the sum of all hits originating +// from one primary in one active cell +// A threshold for assignment of the primary to SDigit is applied +// SDigits are written to TreeS, branch "PHOS" +// AliPHOSSDigitizer with all current parameters is written +// to TreeS branch "AliPHOSSDigitizer". +// 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] AliPHOSSDigitizer * s = new AliPHOSSDigitizer("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("Pedestal 0.001") +// // and write them into the new branch +// root [4] s->ExecuteTask("deb all tim") +// // available parameters: +// deb - print # of produced SDigitis +// deb all - print # and list of produced SDigits +// tim - print benchmarking information // //*-- Author : Dmitri Peressounko (SUBATECH & KI) ////////////////////////////////////////////////////////////////////////////// + // --- ROOT system --- -#include "TTask.h" -#include "TTree.h" -#include "TSystem.h" +#include "TBenchmark.h" + //#include "TObjectTable.h" + // --- Standard library --- // --- AliRoot header files --- - +#include "AliLog.h" +#include "AliPHOSGeometry.h" #include "AliPHOSDigit.h" +#include "AliPHOSGetter.h" #include "AliPHOSHit.h" -#include "AliPHOSv1.h" #include "AliPHOSSDigitizer.h" - -#include "TROOT.h" -#include "TFolder.h" + //#include "AliMemoryWatcher.h" ClassImp(AliPHOSSDigitizer) //____________________________________________________________________________ - AliPHOSSDigitizer::AliPHOSSDigitizer():TTask("AliPHOSSDigitizer","") + AliPHOSSDigitizer::AliPHOSSDigitizer():TTask("","") { // ctor - fA = 0; - fB = 10000000. ; - fPrimThreshold = 0.01 ; - fNevents = 0 ; // Number of events to digitize, 0 means all evens in current file - // add Task to //root/Tasks folder - TTask * roottasks = (TTask*)gROOT->GetRootFolder()->FindObject("Tasks") ; - roottasks->Add(this) ; - + fFirstEvent = fLastEvent = 0 ; + fDefaultInit = kTRUE ; } + //____________________________________________________________________________ -AliPHOSSDigitizer::AliPHOSSDigitizer(char* HeaderFile, char *SDigitsFile):TTask("AliPHOSSDigitizer","") +AliPHOSSDigitizer::AliPHOSSDigitizer(const char * alirunFileName, + const char * eventFolderName): + TTask("PHOS"+AliConfig::Instance()->GetSDigitizerTaskName(), alirunFileName), + fEventFolderName(eventFolderName) { + // ctor - fA = 0; - fB = 10000000.; - fPrimThreshold = 0.01 ; - fNevents = 0 ; // Number of events to digitize, 0 means all events in current file - fSDigitsFile = SDigitsFile ; - fHeadersFile = HeaderFile ; - //add Task to //root/Tasks folder - TTask * roottasks = (TTask*)gROOT->GetRootFolder()->FindObject("Tasks") ; - roottasks->Add(this) ; - + fFirstEvent = fLastEvent = 0 ; // runs one event by defaut + InitParameters() ; + Init(); + fDefaultInit = kFALSE ; } //____________________________________________________________________________ - AliPHOSSDigitizer::~AliPHOSSDigitizer() +AliPHOSSDigitizer::AliPHOSSDigitizer(const AliPHOSSDigitizer & sd) + : TTask(sd) { - // dtor -} - + //cpy ctor -//____________________________________________________________________________ -void AliPHOSSDigitizer::Exec(Option_t *option) { - //Collects all hits in the same active volume into digit - - TFile * file = 0; + fFirstEvent = sd.fFirstEvent ; + fLastEvent = sd.fLastEvent ; + fA = sd.fA ; + fB = sd.fB ; + fPrimThreshold = sd.fPrimThreshold ; + fSDigitsInRun = sd.fSDigitsInRun ; + SetName(sd.GetName()) ; + SetTitle(sd.GetTitle()) ; + fEventFolderName = sd.fEventFolderName; +} - // if(gAlice->TreeE()==0) //If gAlice not yet read/constructed - if(fHeadersFile.IsNull()) - file = new TFile("galice.root", "update") ; - else - file = new TFile(fHeadersFile.Data(),"update") ; - gAlice = (AliRun *) file->Get("gAlice") ; +//____________________________________________________________________________ +AliPHOSSDigitizer::~AliPHOSSDigitizer() { + //dtor + // AliPHOSGetter * gime = + // AliPHOSGetter::Instance(GetTitle(),fEventFolderName.Data()); + AliPHOSGetter * gime = + AliPHOSGetter::Instance(); + gime->PhosLoader()->CleanSDigitizer(); +} +//____________________________________________________________________________ +void AliPHOSSDigitizer::Init() +{ + // Uses the getter to access the required files + fInit = kTRUE ; + AliPHOSGetter * gime = AliPHOSGetter::Instance(GetTitle(), fEventFolderName.Data()); + if ( gime == 0 ) { + Fatal("Init" ,"Could not obtain the Getter object for file %s and event %s !", GetTitle(), fEventFolderName.Data()) ; + return ; + } - TClonesArray * sdigits = new TClonesArray("AliPHOSDigit",1000) ; + TString opt("SDigits") ; + if(gime->VersionExists(opt) ) { + Error( "Init", "Give a version name different from %s", fEventFolderName.Data() ) ; + fInit = kFALSE ; + } + + gime->PostSDigitizer(this); + gime->PhosLoader()->GetSDigitsDataLoader()->GetBaseTaskLoader()->SetDoNotReload(kTRUE); + +} + +//____________________________________________________________________________ +void AliPHOSSDigitizer::InitParameters() +{ + // initializes the parameters for digitization + fA = 0; + fB = 10000000.; + fPrimThreshold = 0.01 ; + fSDigitsInRun = 0 ; +} - AliPHOS * PHOS = (AliPHOS *) gAlice->GetDetector("PHOS") ; +//____________________________________________________________________________ +void AliPHOSSDigitizer::Exec(Option_t *option) +{ + // Steering method to produce summable digits for events + // in the range from fFirstEvent to fLastEvent. + // This range is optionally set by SetEventRange(). + // if fLastEvent=-1 (by default), then process events until the end. + // + // Summable digit is a sum of all hits in the same active + // volume into digit - - if(fNevents == 0) - fNevents = (Int_t) gAlice->TreeE()->GetEntries() ; + if (strstr(option, "print") ) { + Print() ; + return ; + } + + if(strstr(option,"tim")) + gBenchmark->Start("PHOSSDigitizer"); - Int_t ievent ; - for(ievent = 0; ievent < fNevents; ievent++){ - gAlice->GetEvent(ievent) ; - gAlice->SetEvent(ievent) ; - - if(gAlice->TreeH()==0){ - cout << "AliPHOSSDigitizer: There is no Hit Tree" << endl; - return ; - } - - if(gAlice->TreeS() == 0) - gAlice->MakeTree("S") ; - - TClonesArray * hits = PHOS->Hits() ; - - sdigits->Clear(); - Int_t nSdigits = 0 ; - - //Make branches - char branchname[20]; - sprintf(branchname,"%s",PHOS->GetName()); - - Int_t bufferSize = 16000 ; - char * file =0; - if(!fSDigitsFile.IsNull()) - file = (char*) fSDigitsFile.Data() ; //ievent ; - else - if(gSystem->Getenv("CONFIG_SPLIT_FILE")){ //generating file name - file = new char[30] ; - // sprintf(file,"PHOS.SDigits%d.root",ievent) ; - sprintf(file,"PHOS.SDigits.root") ; - } - else - file = 0 ; - - gAlice->MakeBranchInTree(gAlice->TreeS(),branchname,&sdigits,bufferSize,file); + AliPHOSGetter * gime = AliPHOSGetter::Instance() ; + //switch off reloading of this task while getting event + if (!fInit) { // to prevent overwrite existing file + AliError( Form("Give a version name different from %s", fEventFolderName.Data()) ) ; + return ; + } - Int_t splitlevel = 0 ; - sprintf(branchname,"AliPHOSSDigitizer"); - AliPHOSSDigitizer * sd = this ; - gAlice->MakeBranchInTree(gAlice->TreeS(),branchname,"AliPHOSSDigitizer",&sd, bufferSize, splitlevel,file); - + if (fLastEvent == -1) + fLastEvent = gime->MaxEvent() - 1 ; + else + fLastEvent = TMath::Min(fFirstEvent, gime->MaxEvent()); // only ine event at the time + Int_t nEvents = fLastEvent - fFirstEvent + 1; + + Int_t ievent ; - //Now made SDigits from hits, for PHOS it is the same + //AliMemoryWatcher memwatcher; - Int_t itrack ; - for (itrack=0; itrackGetNtrack(); itrack++){ - - //=========== Get the Hits Tree for the Primary track itrack - gAlice->ResetHits(); - gAlice->TreeH()->GetEvent(itrack); - - Int_t i; - for ( i = 0 ; i < hits->GetEntries() ; i++ ) { - AliPHOSHit * hit = (AliPHOSHit*)hits->At(i) ; - AliPHOSDigit * newdigit ; + for (ievent = fFirstEvent; ievent <= fLastEvent; ievent++) { + gime->Event(ievent,"H") ; + TTree * treeS = gime->TreeS(); + TClonesArray * hits = gime->Hits() ; + TClonesArray * sdigits = gime->SDigits() ; + sdigits->Clear(); + Int_t nSdigits = 0 ; + //Now make SDigits from hits, for PHOS it is the same, so just copy + 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 ; - // Assign primary number only if contribution is significant + for (iprim = 0 ; iprim < nPrim ; iprim ++) { + //=========== Get the PHOS branch from Hits Tree for the Primary iprim + gime->Track(iprim) ; + Int_t i; + for ( i = 0 ; i < hits->GetEntries() ; i++ ) { + AliPHOSHit * hit = dynamic_cast(hits->At(i)) ; + // Assign primary number only if contribution is significant + if( hit->GetEnergy() > fPrimThreshold) - newdigit = new AliPHOSDigit( hit->GetPrimary(), hit->GetId(), Digitize( hit->GetEnergy() ) ) ; + new((*sdigits)[nSdigits]) AliPHOSDigit(hit->GetPrimary(),hit->GetId(), + Digitize(hit->GetEnergy()), hit->GetTime()) ; else - newdigit = new AliPHOSDigit( -1 , hit->GetId(), Digitize( hit->GetEnergy() ) ) ; + new((*sdigits)[nSdigits]) AliPHOSDigit( -1 , hit->GetId(), + Digitize(hit->GetEnergy()), hit->GetTime()) ; + nSdigits++ ; - new((*sdigits)[nSdigits]) AliPHOSDigit(* newdigit) ; - nSdigits++ ; - - delete newdigit ; - } - - } // loop over tracks - + } + + } // loop over iprim + sdigits->Sort() ; - - nSdigits = sdigits->GetEntries() ; + + nSdigits = sdigits->GetEntriesFast() ; + + fSDigitsInRun += nSdigits ; sdigits->Expand(nSdigits) ; - + Int_t i ; for (i = 0 ; i < nSdigits ; i++) { - AliPHOSDigit * digit = (AliPHOSDigit *) sdigits->At(i) ; + AliPHOSDigit * digit = dynamic_cast(sdigits->At(i)) ; digit->SetIndexInList(i) ; } + + //Now write SDigits + - gAlice->TreeS()->Fill() ; - gAlice->TreeS()->Write(0,TObject::kOverwrite) ; - } + //First list of sdigits + + Int_t bufferSize = 32000 ; + TBranch * sdigitsBranch = treeS->Branch("PHOS",&sdigits,bufferSize); + + sdigitsBranch->Fill() ; - delete sdigits ; - if(file) - file->Close() ; + gime->WriteSDigits("OVERWRITE"); + + //Next - SDigitizer + + gime->WriteSDigitizer("OVERWRITE"); + //gObjectTable->Print() ; + + if(strstr(option,"deb")) + PrintSDigits(option) ; + + //memwatcher.Watch(ievent); + }// event loop + + Unload(); + // gime->PhosLoader()->GetSDigitsDataLoader()->GetBaseTaskLoader()->SetDoNotReload(kTRUE); + + if(strstr(option,"tim")){ + gBenchmark->Stop("PHOSSDigitizer"); + Info("Exec"," took %f seconds for SDigitizing %f seconds per event", + gBenchmark->GetCpuTime("PHOSSDigitizer"), gBenchmark->GetCpuTime("PHOSSDigitizer")/nEvents) ; + } + + //TFile f("out.root","RECREATE"); + //memwatcher.WriteToFile(); + //f.Close(); } + //__________________________________________________________________ -void AliPHOSSDigitizer::SetSDigitsFile(char * file ){ - if(!fSDigitsFile.IsNull()) - cout << "Changing SDigits file from " <<(char *)fSDigitsFile.Data() << " to " << file << endl ; - fSDigitsFile=file ; +void AliPHOSSDigitizer::Print()const +{ + // Prints parameters of SDigitizer + Info("Print", "\n------------------- %s -------------", GetName() ) ; + printf(" Writing SDigits to branch with title %s\n", fEventFolderName.Data()) ; + printf(" with digitization parameters A = %f\n", fA) ; + printf(" B = %f\n", fB) ; + printf(" Threshold for Primary assignment= %f\n", fPrimThreshold) ; + printf("---------------------------------------------------\n") ; + } -//__________________________________________________________________ -void AliPHOSSDigitizer::Print(Option_t* option)const{ - cout << "------------------- "<< GetName() << " -------------" << endl ; - if(fSDigitsFile.IsNull()) - cout << " Writing SDigitis to file galice.root "<< endl ; - else - cout << " Writing SDigitis to file " << (char*) fSDigitsFile.Data() << endl ; - cout << " with digitization parameters A = " << fA << endl ; - cout << " B = " << fB << endl ; - cout << "Threshold for Primary assignment = " << fPrimThreshold << endl ; - cout << "---------------------------------------------------"<SDigits() ; + + Info( "\nPrintSDigits", "event # %d %d sdigits", gAlice->GetEvNumber(), sdigits->GetEntriesFast() ) ; + + if(strstr(option,"all")||strstr(option,"EMC")){ + + //loop over digits + AliPHOSDigit * digit; + printf("\nEMC sdigits\n") ; + Int_t maxEmc = gime->PHOSGeometry()->GetNModules()*gime->PHOSGeometry()->GetNCristalsInModule() ; + Int_t index ; + for (index = 0 ; (index < sdigits->GetEntriesFast()) && + ((dynamic_cast (sdigits->At(index)))->GetId() <= maxEmc) ; index++) { + digit = dynamic_cast( sdigits->At(index) ) ; + // if(digit->GetNprimary() == 0) + // continue; + printf("%6d %8d %6.5e %4d %2d :\n", + digit->GetId(), digit->GetAmp(), digit->GetTime(), digit->GetIndexInList(), digit->GetNprimary()) ; + Int_t iprimary; + for (iprimary=0; iprimaryGetNprimary(); iprimary++) { + printf("%d ",digit->GetPrimary(iprimary+1) ) ; + } + } + } + + if(strstr(option,"all")||strstr(option,"CPV")){ + + //loop over CPV digits + AliPHOSDigit * digit; + printf("\nCPV sdigits\n") ; + Int_t maxEmc = gime->PHOSGeometry()->GetNModules()*gime->PHOSGeometry()->GetNCristalsInModule() ; + Int_t index ; + for (index = 0 ; index < sdigits->GetEntriesFast(); index++) { + digit = dynamic_cast( sdigits->At(index) ) ; + if(digit->GetId() > maxEmc){ + printf("\n%6d %8d %4d %2d :", + digit->GetId(), digit->GetAmp(), digit->GetIndexInList(), digit->GetNprimary()) ; + Int_t iprimary; + for (iprimary=0; iprimaryGetNprimary(); iprimary++) { + printf("%d ",digit->GetPrimary(iprimary+1) ) ; + } + } + } + } +} + +//____________________________________________________________________________ +void AliPHOSSDigitizer::Unload() const +{ + // Unloads the objects from the folder + AliPHOSGetter * gime = AliPHOSGetter::Instance() ; + AliPHOSLoader * loader = gime->PhosLoader() ; + loader->UnloadHits() ; + loader->UnloadSDigits() ; +}