these TTask are posted to the apropriate folders //YSAlice/tasks/(S)Digitizer and...
[u/mrichter/AliRoot.git] / PHOS / AliPHOSSDigitizer.cxx
index 6cd2cea2a933bf5513f454c2239ea851b2d6fd49..b0ca76bc7f195ee587510326dd01c269f7f0ca93 100644 (file)
 // SDigits are written to TreeS, branch "PHOS"
 // AliPHOSSDigitizer with all current parameters is written 
 // to TreeS branch "AliPHOSSDigitizer".
-// Both branches, "PHOS" and "AliPHOSSDigitizer", are written to the same
-// file, and therefore, changing branch file name one can produce several
-// versions of SDigitization from the same hits.
-// 
+// 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 <TDatabasePDG::TDatabasePDG>: 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 "TFile.h"
 #include "TTask.h"
@@ -56,12 +70,12 @@ ClassImp(AliPHOSSDigitizer)
   AliPHOSSDigitizer::AliPHOSSDigitizer():TTask("AliPHOSSDigitizer","") 
 {
   // ctor
-  fA = 0;
-  fB = 10000000. ;
+  fA             = 0;
+  fB             = 10000000.;
   fPrimThreshold = 0.01 ;
-  fNevents = 0 ;     
-  fSDigits = 0 ;
-  fHits = 0 ;
+  fNevents       = 0 ;      
+  fSDigits       = 0 ;
+  fHits          = 0 ;
   fIsInitialized = kFALSE ;
 
 }
@@ -70,28 +84,15 @@ ClassImp(AliPHOSSDigitizer)
 AliPHOSSDigitizer::AliPHOSSDigitizer(const char* headerFile, const char *sDigitsTitle):TTask("AliPHOSSDigitizer","")
 {
   // ctor
-  fA = 0;
-  fB = 10000000.;
+  fA             = 0;
+  fB             = 10000000.;
   fPrimThreshold = 0.01 ;
-  fNevents = 0 ;      
-  fSDigitsTitle = sDigitsTitle ;
-  fHeadersFile = headerFile ;
-  fSDigits = new TClonesArray("AliPHOSDigit",1000);
-  fHits    = new TClonesArray("AliPHOSHit",1000);
+  fNevents       = 0 ;      
+  fSDigitsTitle  = sDigitsTitle ;
+  fHeadersFile   = headerFile ;
+  fIsInitialized = kFALSE ;
 
-  TFile * file = (TFile*) gROOT->GetFile(fHeadersFile.Data() ) ;
-  
-  //File was not opened yet
-  if(file == 0){
-    file = new TFile(fHeadersFile.Data(),"update") ;
-    gAlice = (AliRun *) file->Get("gAlice") ;
-  }
-  
-  //add Task to //root/Tasks folder
-  TTask * roottasks = (TTask*)gROOT->GetRootFolder()->FindObject("Tasks") ; 
-  roottasks->Add(this) ; 
-  
-  fIsInitialized = kTRUE ;
+  Init();
 }
 
 //____________________________________________________________________________ 
@@ -104,8 +105,12 @@ AliPHOSSDigitizer::~AliPHOSSDigitizer()
     delete fHits ;
 }
 //____________________________________________________________________________ 
-void AliPHOSSDigitizer::Init(){
-  //Initialization can not be done in the default constructor
+void AliPHOSSDigitizer::Init()
+{
+  // Initialization: open root-file, allocate arrays for hits and sdigits,
+  // attach task SDigitizer to the list of PHOS tasks
+  // 
+  // Initialization can not be done in the default constructor
 
   if(!fIsInitialized){
 
@@ -116,23 +121,29 @@ void AliPHOSSDigitizer::Init(){
     
     //if file was not opened yet, read gAlice
     if(file == 0){
-      file = new TFile(fHeadersFile.Data(),"update") ;
+      if(fHeadersFile.Contains("rfio"))
+       file =  TFile::Open(fHeadersFile,"update") ;
+      else
+       file = new TFile(fHeadersFile.Data(),"update") ;
       gAlice = (AliRun *) file->Get("gAlice") ;
     }
     
     fHits    = new TClonesArray("AliPHOSHit",1000);
     fSDigits = new TClonesArray("AliPHOSDigit",1000);
     
-    // add Task to //root/Tasks folder
-    TTask * roottasks = (TTask*)gROOT->GetRootFolder()->FindObject("Tasks") ; 
-    roottasks->Add(this) ; 
+    //add Task to //YSAlice/tasks/(S)Diditizer/PHOS
+    TFolder * alice  = (TFolder*)gROOT->GetListOfBrowsables()->FindObject("YSAlice") ; 
+    TTask * aliceSD  = (TTask*)alice->FindObject("tasks/(S)Digitizer") ; 
+    TTask * phosSD   = (TTask*)aliceSD->GetListOfTasks()->FindObject("PHOS") ;
+    phosSD->Add(this) ; 
     
     fIsInitialized = kTRUE ;
   }
 }
 //____________________________________________________________________________
-void AliPHOSSDigitizer::Exec(Option_t *option) { 
-  //Collects all hits in the same active volume into digit
+void AliPHOSSDigitizer::Exec(Option_t *option) 
+{ 
+  // Collects all hits in the same active volume into digit
   
   if(!fIsInitialized)
     Init() ;
@@ -169,27 +180,23 @@ void AliPHOSSDigitizer::Exec(Option_t *option) {
     
     //Now made SDigits from hits, for PHOS it is the same, so just copy    
     Int_t itrack ;
-    for (itrack=0; itrack<gAlice->GetNtrack(); itrack++){
+    for (itrack=0; itrack < gAlice->GetNtrack(); itrack++){
       
-      //=========== Get the Hits Tree for the Primary track itrack
-      gAlice->ResetHits();    
-      gAlice->TreeH()->GetEvent(itrack);
+      //=========== Get the PHOS branch from Hits Tree for the Primary track itrack
+      branch->GetEntry(itrack,0);
       
       Int_t i;
       for ( i = 0 ; i < fHits->GetEntries() ; i++ ) {
        AliPHOSHit * hit = (AliPHOSHit*)fHits->At(i) ;
-       AliPHOSDigit * newdigit ;
 
        // Assign primary number only if contribution is significant
        if( hit->GetEnergy() > fPrimThreshold)
-         newdigit = new AliPHOSDigit( hit->GetPrimary(), hit->GetId(), Digitize( hit->GetEnergy() ) ) ;
+         new((*fSDigits)[nSdigits]) AliPHOSDigit( hit->GetPrimary(), hit->GetId(), Digitize( hit->GetEnergy() ) ) ;
        else
-         newdigit = new AliPHOSDigit( -1               , hit->GetId(), Digitize( hit->GetEnergy() ) ) ;
+         new((*fSDigits)[nSdigits]) AliPHOSDigit( -1               , hit->GetId(), Digitize( hit->GetEnergy() ) ) ;
        
-       new((*fSDigits)[nSdigits]) AliPHOSDigit(* newdigit) ;
        nSdigits++ ;  
        
-       delete newdigit ;    
       } 
       
     } // loop over tracks
@@ -255,8 +262,9 @@ void AliPHOSSDigitizer::Exec(Option_t *option) {
     if (file) {
       sdigitsBranch->SetFile(file);
       TIter next( sdigitsBranch->GetListOfBranches());
-      while ((sdigitsBranch=(TBranch*)next())) {
-       sdigitsBranch->SetFile(file);
+      TBranch * subbr;
+      while ((subbr=(TBranch*)next())) {
+       subbr->SetFile(file);
       }   
       cwd->cd();
     } 
@@ -270,14 +278,16 @@ void AliPHOSSDigitizer::Exec(Option_t *option) {
     if (file) {
       sdigitizerBranch->SetFile(file);
       TIter next( sdigitizerBranch->GetListOfBranches());
-      while ((sdigitizerBranch=(TBranch*)next())) {
-       sdigitizerBranch->SetFile(file);
+      TBranch * subbr ;
+      while ((subbr=(TBranch*)next())) {
+       subbr->SetFile(file);
       }   
       cwd->cd();
       delete file;
     }
 
-    gAlice->TreeS()->Fill() ;
+    sdigitsBranch->Fill() ;
+    sdigitizerBranch->Fill() ;
     gAlice->TreeS()->Write(0,TObject::kOverwrite) ;
     
     if(strstr(option,"deb"))
@@ -296,14 +306,17 @@ void AliPHOSSDigitizer::Exec(Option_t *option) {
   
 }
 //__________________________________________________________________
-void AliPHOSSDigitizer::SetSDigitsBranch(const char * title ){
-  //Seting title to branch SDigits 
+void AliPHOSSDigitizer::SetSDigitsBranch(const char * title )
+{
+  // Setting title to branch SDigits 
   if(!fSDigitsTitle.IsNull())
     cout << "AliPHOSSdigitizer: changing SDigits file from " <<fSDigitsTitle.Data() << " to " << title << endl ;
   fSDigitsTitle=title ;
 }
 //__________________________________________________________________
-void AliPHOSSDigitizer::Print(Option_t* option)const{
+void AliPHOSSDigitizer::Print(Option_t* option)const
+{
+  // Prints parameters of SDigitizer
   cout << "------------------- "<< GetName() << " -------------" << endl ;
   cout << "   Writing SDigitis to branch with title  " << fSDigitsTitle.Data() << endl ;
   cout << "   with digitization parameters  A = " << fA << endl ;
@@ -313,15 +326,20 @@ void AliPHOSSDigitizer::Print(Option_t* option)const{
   
 }
 //__________________________________________________________________
-Bool_t AliPHOSSDigitizer::operator==( AliPHOSSDigitizer const &sd )const{
+Bool_t AliPHOSSDigitizer::operator==( AliPHOSSDigitizer const &sd )const
+{
+  // Equal operator.
+  // SDititizers are equal if their pedestal, slope and threshold are equal
+
   if( (fA==sd.fA)&&(fB==sd.fB)&&(fPrimThreshold==sd.fPrimThreshold))
     return kTRUE ;
   else
     return kFALSE ;
 }
 //__________________________________________________________________
-void AliPHOSSDigitizer::PrintSDigits(Option_t * option){
-  //Prints list of digits produced at the current pass of AliPHOSDigitizer
+void AliPHOSSDigitizer::PrintSDigits(Option_t * option)
+{
+  // Prints list of digits produced in the current pass of AliPHOSDigitizer
   
   cout << "AliPHOSSDigitizer: " << endl ;
   cout << "       Number of entries in SDigits list  " << fSDigits->GetEntriesFast() << endl ;