]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSDigitizer.cxx
Improved the mechanism to divert SDigits into a separate file.
[u/mrichter/AliRoot.git] / PHOS / AliPHOSDigitizer.cxx
index 9edd6e8a07ce99b95c4e73b2505c73eca3720367..0ac1e94b6e1093041d959799730f26da8f136cb1 100644 (file)
@@ -61,6 +61,7 @@
 #include "TROOT.h"
 #include "TFolder.h"
 #include "TObjString.h"
+#include "TGeometry.h"
 #include "TBenchmark.h"
 
 // --- Standard library ---
@@ -69,6 +70,7 @@
 // --- AliRoot header files ---
 
 #include "AliRun.h"
+#include "AliHeader.h"
 #include "AliRunDigitizer.h"
 #include "AliPHOSDigit.h"
 #include "AliPHOS.h"
@@ -86,8 +88,8 @@ ClassImp(AliPHOSDigitizer)
 {
   // ctor
 
-  fPinNoise           = 0.01 ;
-  fEMCDigitThreshold  = 0.01 ;
+  fPinNoise           = 0.004 ;
+  fEMCDigitThreshold  = 0.012 ;
   fCPVNoise           = 0.01;
   fCPVDigitThreshold  = 0.09 ;
   fTimeResolution     = 0.5e-9 ;
@@ -102,7 +104,7 @@ ClassImp(AliPHOSDigitizer)
   fNADCcpv = (Int_t) TMath::Power(2,12);      // number of channels in CPV ADC
 
   fTimeThreshold = 0.001*10000000 ; //Means 1 MeV in terms of SDigits amplitude
-  fARD = 0 ;                        // We work in the standalong mode
+  fManager = 0 ;                        // We work in the standalong mode
 }
 
 //____________________________________________________________________________ 
@@ -111,20 +113,17 @@ AliPHOSDigitizer::AliPHOSDigitizer(const char *headerFile,const char * name)
   // ctor
   SetName(name) ;
   SetTitle(headerFile) ;
-  fARD = 0 ;                     // We work in the standalong mode
+  fManager = 0 ;                     // We work in the standalong mode
   Init() ;
   
 }
 
 //____________________________________________________________________________ 
-AliPHOSDigitizer::AliPHOSDigitizer(AliRunDigitizer * ard)
+AliPHOSDigitizer::AliPHOSDigitizer(AliRunDigitizer * ard):AliDigitizer(ard)
 {
   // ctor
-  fARD = ard ;
-  SetName("Default");
-  SetTitle("aliroot") ;
-  Init() ;
-  
+  SetName("");     //Will call init in the digitizing
+  SetTitle("aliroot") ;  
 }
 
 //____________________________________________________________________________ 
@@ -146,12 +145,8 @@ void AliPHOSDigitizer::Digitize(const Int_t event)
   // This design avoids scanning over the list of digits to add 
   // contribution to new SDigits only.
 
-  if( strcmp(GetName(), "") == 0 )
-    Init() ;
-
   AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; 
   TClonesArray * digits = gime->Digits(GetName()) ; 
-  AliPHOSSDigitizer * sdiz = gime->SDigitizer(GetName()) ; 
 
   digits->Clear() ;
 
@@ -169,8 +164,6 @@ void AliPHOSDigitizer::Digitize(const Int_t event)
 
   digits->Expand(nCPV) ;
 
-
-  // sdigitize random gaussian noise and add it to all cells (EMCA+CPV+PPSD) 
   // get first the sdigitizer from the tasks list (must have same name as the digitizer)
   const AliPHOSSDigitizer * sDigitizer = gime->SDigitizer(GetName()); 
   if ( !sDigitizer) {
@@ -187,8 +180,10 @@ void AliPHOSDigitizer::Digitize(const Int_t event)
   TObjArray * sdigArray = new TObjArray(2) ;
   while ( (folder = (TFolder*)next()) ) 
     if ( (sdigits = (TClonesArray*)folder->FindObject(GetName()) ) ) {
+      TString fileName(folder->GetName()) ;
+      fileName.ReplaceAll("_","/") ;
       cout << "INFO: AliPHOSDigitizer::Digitize -> Adding SDigits " 
-          << GetName() << " from " << folder->GetName() << endl ; 
+          << GetName() << " from " << fileName << endl ; 
       sdigArray->AddAt(sdigits, input) ;
       input++ ;
     }
@@ -198,7 +193,7 @@ void AliPHOSDigitizer::Digitize(const Int_t event)
   Int_t i;
   for(i=0; i<input; i++){
     sdigits = (TClonesArray *)sdigArray->At(i) ;
-    if ( !sdigits->GetEntries() )
+    if ( !sdigits->GetEntriesFast() )
       continue ; 
     Int_t curNext = ((AliPHOSDigit *)sdigits->At(0))->GetId() ;
      if(curNext < nextSig) 
@@ -218,10 +213,10 @@ void AliPHOSDigitizer::Digitize(const Int_t event)
     Float_t noise = gRandom->Gaus(0., fPinNoise) ; 
     new((*digits)[absID-1]) AliPHOSDigit( -1,absID,sDigitizer->Digitize(noise), TimeOfNoise() ) ;
     //look if we have to add signal?
+    digit = (AliPHOSDigit *) digits->At(absID-1) ;
     if(absID==nextSig){
       //Add SDigits from all inputs 
-      digit = (AliPHOSDigit *) digits->At(absID-1) ;
-
       ticks->Clear() ;
       Int_t contrib = 0 ;
       Float_t a = digit->GetAmp() ;
@@ -241,8 +236,8 @@ void AliPHOSDigitizer::Digitize(const Int_t event)
        while(curSDigit && curSDigit->GetId() == absID){           
          //Shift primary to separate primaries belonging different inputs
          Int_t primaryoffset ;
-         if(fARD)
-           primaryoffset = fARD->GetMask(i) ; 
+         if(fManager)
+           primaryoffset = fManager->GetMask(i) ; 
          else
            primaryoffset = 10000000*i ;
          curSDigit->ShiftPrimary(primaryoffset) ;
@@ -297,12 +292,13 @@ void AliPHOSDigitizer::Digitize(const Int_t event)
          curSDigit = (AliPHOSDigit*)((TClonesArray *)sdigArray->At(i))->At(index[i]) ;         
        else
          curSDigit = 0 ;
+
        //May be several digits will contribute from the same input
        while(curSDigit && curSDigit->GetId() == absID){           
          //Shift primary to separate primaries belonging different inputs
          Int_t primaryoffset ;
-         if(fARD)
-           primaryoffset = fARD->GetMask(i) ; 
+         if(fManager)
+           primaryoffset = fManager->GetMask(i) ; 
          else
            primaryoffset = 10000000*i ;
          curSDigit->ShiftPrimary(primaryoffset) ;
@@ -316,8 +312,9 @@ void AliPHOSDigitizer::Digitize(const Int_t event)
            curSDigit = 0 ;
        }
       }
-      
+
       //Find next signal module
+      nextSig = 200000 ;
       for(i=0; i<input; i++){
        sdigits = (TClonesArray *)sdigArray->At(i) ;
        Int_t curNext = nextSig ;
@@ -333,17 +330,18 @@ void AliPHOSDigitizer::Digitize(const Int_t event)
   
   
   //remove digits below thresholds
-  for(absID = 0; absID < nEMC ; absID++){
-    digit = (AliPHOSDigit*) digits->At(absID) ;
+  for(i = 0; i < nEMC ; i++){
+    digit = (AliPHOSDigit*) digits->At(i) ;
     if(sDigitizer->Calibrate( digit->GetAmp() ) < fEMCDigitThreshold)
-      digits->RemoveAt(absID) ;
+      digits->RemoveAt(i) ;
     else
       digit->SetTime(gRandom->Gaus(digit->GetTime(),fTimeResolution) ) ;
   }
 
-  for(absID = nEMC; absID < nCPV ; absID++)
-    if(sDigitizer->Calibrate(((AliPHOSDigit*)digits->At(absID))->GetAmp()) < fCPVDigitThreshold)
-      digits->RemoveAt(absID) ;
+
+  for(i = nEMC; i < nCPV ; i++)
+    if(sDigitizer->Calibrate(((AliPHOSDigit*)digits->At(i))->GetAmp()) < fCPVDigitThreshold)
+      digits->RemoveAt(i) ;
     
   digits->Compress() ;  
   
@@ -354,7 +352,7 @@ void AliPHOSDigitizer::Digitize(const Int_t event)
   for (i = 0 ; i < ndigits ; i++) { 
     AliPHOSDigit * digit = (AliPHOSDigit *) digits->At(i) ; 
     digit->SetIndexInList(i) ;     
-    Float_t energy = sdiz->Calibrate(digit->GetAmp()) ;
+    Float_t energy = sDigitizer->Calibrate(digit->GetAmp()) ;
     digit->SetAmp(DigitizeEnergy(energy,digit->GetId()) ) ;
   }
 
@@ -378,7 +376,7 @@ void AliPHOSDigitizer::Exec(Option_t *option)
 { 
   // Managing method
 
-  if( strcmp(GetName(), "") == 0 )    
+  if(strcmp(GetName(), "") == 0 )   
     Init() ;
   
   if (strstr(option,"print")) {
@@ -395,8 +393,8 @@ void AliPHOSDigitizer::Exec(Option_t *option)
   
   TTree * treeD ;
   
-  if(fARD){
-    treeD = fARD->GetTreeD() ;
+  if(fManager){
+    treeD = fManager->GetTreeD() ;
     nevents = 1 ;    // Will process only one event
   }
   else {
@@ -404,46 +402,45 @@ void AliPHOSDigitizer::Exec(Option_t *option)
     nevents = (Int_t) gAlice->TreeE()->GetEntries() ;
     treeD=gAlice->TreeD() ;
   }
-  if(treeD == 0 ){
-    cerr << " AliPHOSDigitizer :: Can not find TreeD " << endl ;
-    return ;
-  }
+
 
   //Check, if this branch already exits
-  TObjArray * lob = (TObjArray*)treeD->GetListOfBranches() ;
-  TIter next(lob) ; 
-  TBranch * branch = 0 ;  
-  Bool_t phosfound = kFALSE, digitizerfound = kFALSE ; 
-  
-  while ( (branch = (TBranch*)next()) && (!phosfound || !digitizerfound) ) {
-    if ( (strcmp(branch->GetName(), "PHOS")==0) && 
-        (strcmp(branch->GetTitle(), GetName())==0) ) 
-      phosfound = kTRUE ;
+  if (treeD) { 
+    TObjArray * lob = (TObjArray*)treeD->GetListOfBranches() ;
+    TIter next(lob) ; 
+    TBranch * branch = 0 ;  
+    Bool_t phosfound = kFALSE, digitizerfound = kFALSE ; 
+    
+    while ( (branch = (TBranch*)next()) && (!phosfound || !digitizerfound) ) {
+      if ( (strcmp(branch->GetName(), "PHOS")==0) && 
+          (strcmp(branch->GetTitle(), GetName())==0) ) 
+       phosfound = kTRUE ;
+      
+      else if ( (strcmp(branch->GetName(), "AliPHOSDigitizer")==0) && 
+               (strcmp(branch->GetTitle(), GetName())==0) ) 
+       digitizerfound = kTRUE ; 
+    }
     
-    else if ( (strcmp(branch->GetName(), "AliPHOSDigitizer")==0) && 
-             (strcmp(branch->GetTitle(), GetName())==0) ) 
-      digitizerfound = kTRUE ; 
+    if ( phosfound ) {
+      cerr << "WARNING: AliPHOSDigitizer -> Digits branch with name " << GetName() 
+          << " already exits" << endl ;
+      return ; 
+    }   
+    if ( digitizerfound ) {
+      cerr << "WARNING: AliPHOSDigitizer -> Digitizer branch with name " << GetName() 
+          << " already exits" << endl ;
+      return ; 
+    }   
   }
 
-  if ( phosfound ) {
-    cerr << "WARNING: AliPHOSDigitizer -> Digits branch with name " << GetName() 
-        << " already exits" << endl ;
-    return ; 
-  }   
-  if ( digitizerfound ) {
-    cerr << "WARNING: AliPHOSDigitizer -> Digitizer branch with name " << GetName() 
-        << " already exits" << endl ;
-    return ; 
-  }   
-
   Int_t ievent ;
-
+  
   for(ievent = 0; ievent < nevents; ievent++){
-    
-    if(fARD){
+  
+    if(fManager){
       Int_t input ;
-      for(input = 0 ; input < fARD->GetNinputs(); input ++){
-       TTree * treeS = fARD->GetInputTreeS(input) ;
+      for(input = 0 ; input < fManager->GetNinputs(); input ++){
+       TTree * treeS = fManager->GetInputTreeS(input) ;
        if(!treeS){
          cerr << "AliPHOSDigitizer -> No Input " << endl ;
          return ;
@@ -497,8 +494,8 @@ Float_t AliPHOSDigitizer::FrontEdgeTime(TClonesArray * ticks)
 //____________________________________________________________________________ 
 Bool_t AliPHOSDigitizer::Init()
 {
-  fPinNoise           = 0.01 ;
-  fEMCDigitThreshold  = 0.01 ;
+  fPinNoise           = 0.004 ;
+  fEMCDigitThreshold  = 0.012 ;
   fCPVNoise           = 0.01;
   fCPVDigitThreshold  = 0.09 ;
   fTimeResolution     = 0.5e-9 ;
@@ -513,19 +510,15 @@ Bool_t AliPHOSDigitizer::Init()
   fNADCcpv = (Int_t) TMath::Power(2,12);      // number of channels in CPV ADC
 
   fTimeThreshold = 0.001*10000000 ; //Means 1 MeV in terms of SDigits amplitude
-
-  // Makes all memory allocations
-  // Adds Digitizer task to the folder of PHOS tasks
-
-   //============================================================= YS
-  //  The initialisation is now done by AliPHOSGetter
     
-  if( strcmp(GetTitle(), "") == 0 )
-    SetTitle("galice.root") ;
+  if(fManager)
+    SetTitle("aliroot") ;
+  else if (strcmp(GetTitle(),"")==0) 
+   SetTitle("galice.root") ;
+
+  if( strcmp(GetName(), "") == 0 )
+    SetName("Default") ;
   
-  // the SDigits name is stored by AliPHOSGetter as the name of the TClones Array 
-  // //YSAlice/WhiteBoard/SDigits/PHOS/headerFile/branchname and has branchTitle as title.    
-    
   AliPHOSGetter * gime = AliPHOSGetter::GetInstance(GetTitle(), GetName()) ; 
   if ( gime == 0 ) {
     cerr << "ERROR: AliPHOSDigitizer::Init -> Could not obtain the Getter object !" << endl ; 
@@ -534,15 +527,15 @@ Bool_t AliPHOSDigitizer::Init()
   
   const AliPHOSGeometry * geom = gime->PHOSGeometry() ;
   fEmcCrystals = geom->GetNModules() *  geom->GetNCristalsInModule() ;
-     
-  // create a folder on the white board //YSAlice/WhiteBoard/Digits/PHOS/headerFile/digitsTitle
+  
+  // Post Digits to the white board
   gime->PostDigits(GetName() ) ;   
   
-  //add Task to //YSAlice/tasks/Digitizer/PHOS
-    gime->PostDigitizer(this) ;
+  // Post Digitizer to the white board
+  gime->PostDigitizer(this) ;
   
   //Mark that we will use current header file
-  if(!fARD){
+  if(!fManager){
     gime->PostSDigits(GetName(),GetTitle()) ;
     gime->PostSDigitizer(GetName(),GetTitle()) ;
   }
@@ -567,15 +560,15 @@ void AliPHOSDigitizer::MixWith(const char* headerFile)
   if( strcmp(GetName(), "") == 0 )
     Init() ;
 
-  if(fARD){
+  if(fManager){
     cout << "Can not use this method under AliRunDigitizer " << endl ;
     return ;
   }
   
   // check if the specified SDigits do not already exist on the White Board:
-  // //YSAlice/WhiteBoard/SDigits/PHOS/headerFile/sDigitsTitle
+  // //Folders/RunMC/Event/Data/PHOS/SDigits/headerFile/sdigitsname
 
-  TString path = "YSAlice/WhiteBoard/SDigits/PHOS/" ; 
+  TString path = "Folders/RunMC/Event/Data/PHOS/SDigits" ; 
   path += headerFile ; 
   path += "/" ; 
   path += GetName() ;
@@ -599,6 +592,53 @@ void AliPHOSDigitizer::MixWith(const char* headerFile)
   
 }
 
+//__________________________________________________________________
+void AliPHOSDigitizer::SetSplitFile(const TString splitFileName) const
+{
+  // Diverts the Digits in a file separate from the hits file
+  
+  // I guess it is not going to work if we do merging
+  if (fManager) {
+    cerr << "ERROR: AliPHOSDigitizer::SetSplitFile -> Not yet available in case of merging activated " << endl ;  
+    return ; 
+  }
+
+  TDirectory * cwd = gDirectory ;
+  TFile * splitFile = gAlice->InitTreeFile("D",splitFileName.Data());
+  splitFile->cd() ; 
+  if ( !splitFile->Get("gAlice") ) 
+    gAlice->Write();
+  
+  TTree *treeE  = gAlice->TreeE();
+  if (!treeE) {
+    cerr << "ERROR: AliPHOSDigitizer::SetSplitFile -> No TreeE found "<<endl;
+    abort() ;
+  }      
+  
+  // copy TreeE
+  if ( !splitFile->Get("TreeE") ) {
+    AliHeader *header = new AliHeader();
+    treeE->SetBranchAddress("Header", &header);
+    treeE->SetBranchStatus("*",1);
+    TTree *treeENew =  treeE->CloneTree();
+    treeENew->Write();
+  }
+
+  // copy AliceGeom
+  if ( !splitFile->Get("AliceGeom") ) {
+    TGeometry *AliceGeom = static_cast<TGeometry*>(cwd->Get("AliceGeom"));
+    if (!AliceGeom) {
+      cerr << "ERROR: AliPHOSDigitizer::SetSplitFile -> AliceGeom was not found in the input file "<<endl;
+      abort() ;
+    }
+    AliceGeom->Write();
+  }
+  
+  cwd->cd() ; 
+  gAlice->MakeTree("D",splitFile);
+  cout << "INFO: AliPHOSDigitizer::SetSPlitMode -> Digits will be stored in " << splitFileName.Data() << endl ; 
+}
+
 //__________________________________________________________________
 void AliPHOSDigitizer::Print(Option_t* option)const {
   // Print Digitizer's parameters
@@ -607,7 +647,7 @@ void AliPHOSDigitizer::Print(Option_t* option)const {
     cout << "------------------- "<< GetName() << " -------------" << endl ;
     cout << "Digitizing sDigits from file(s): " <<endl ;
     
-     TCollection * folderslist = ((TFolder*)gROOT->FindObjectAny("YSAlice/WhiteBoard/SDigits/PHOS"))->GetListOfFolders() ; 
+     TCollection * folderslist = ((TFolder*)gROOT->FindObjectAny("Folders/RunMC/Event/Data/PHOS/SDigits"))->GetListOfFolders() ; 
     TIter next(folderslist) ; 
     TFolder * folder = 0 ; 
     
@@ -645,10 +685,11 @@ void AliPHOSDigitizer::PrintDigits(Option_t * option){
     
     //loop over digits
     AliPHOSDigit * digit;
-    cout << "Digit Id    Amplitude     Index "  <<  " Nprim " << " Primaries list " <<  endl;      
+    cout << "EMC digits (with primaries): " << endl ;
+    cout << "Digit Id     Amplitude   Index       Nprim  Primaries list " <<  endl;      
     Int_t maxEmc = gime->PHOSGeometry()->GetNModules()*gime->PHOSGeometry()->GetNCristalsInModule() ;
     Int_t index ;
-    for (index = 0 ; (index < digits->GetEntries()) && 
+    for (index = 0 ; (index < digits->GetEntriesFast()) && 
         (((AliPHOSDigit * )  digits->At(index))->GetId() <= maxEmc) ; index++) {
       digit = (AliPHOSDigit * )  digits->At(index) ;
       if(digit->GetNprimary() == 0) continue;
@@ -668,10 +709,11 @@ void AliPHOSDigitizer::PrintDigits(Option_t * option){
     
     //loop over CPV digits
     AliPHOSDigit * digit;
-    cout << "Digit Id " << " Amplitude " <<  " Index "  <<  " Nprim " << " Primaries list " <<  endl;      
+    cout << "CPV digits: " << endl ;
+    cout << "Digit Id     Amplitude   Index       Nprim  Primaries list " <<  endl;      
     Int_t maxEmc = gime->PHOSGeometry()->GetNModules()*gime->PHOSGeometry()->GetNCristalsInModule() ;
     Int_t index ;
-    for (index = 0 ; index < digits->GetEntries(); index++) {
+    for (index = 0 ; index < digits->GetEntriesFast(); index++) {
       digit = (AliPHOSDigit * )  digits->At(index) ;
       if(digit->GetId() > maxEmc){
        cout << setw(6)  <<  digit->GetId() << "   "  <<        setw(10)  <<  digit->GetAmp() <<   "    "  
@@ -732,56 +774,31 @@ void AliPHOSDigitizer::WriteDigits(Int_t event)
   //      and names of files, from which digits are made.
 
   AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; 
-  TClonesArray * digits = gime->Digits(GetName()) ; 
+  const TClonesArray * digits = gime->Digits(GetName()) ; 
+ TTree * treeD ;
 
-  TTree * treeD ;
+ if(fManager) 
+   treeD = fManager->GetTreeD() ;
+ else {
+   if (!gAlice->TreeD() ) 
+     gAlice->MakeTree("D");
+   treeD = gAlice->TreeD();
+ }
 
-  if(fARD)
-    treeD = fARD->GetTreeD() ;
- else
-    treeD = gAlice->TreeD();
-  
-  // create new branches
-  // -- generate file name if necessary
-  char * file =0;
-  if(gSystem->Getenv("CONFIG_SPLIT_FILE")){ //generating file name
-    file = new char[strlen(gAlice->GetBaseFile())+20] ;
-    sprintf(file,"%s/PHOS.Digits.root",gAlice->GetBaseFile()) ;
-  }
 
-  TDirectory *cwd = gDirectory;
   // -- create Digits branch
   Int_t bufferSize = 32000 ;    
   TBranch * digitsBranch = treeD->Branch("PHOS",&digits,bufferSize);
   digitsBranch->SetTitle(GetName());
-  if (file) {
-    digitsBranch->SetFile(file);
-    TIter next( digitsBranch->GetListOfBranches());
-    TBranch * sbr ;
-    while ((sbr=(TBranch*)next())) {
-      sbr->SetFile(file);
-    }   
-    cwd->cd();
-  } 
     
   // -- Create Digitizer branch
   Int_t splitlevel = 0 ;
   AliPHOSDigitizer * d = gime->Digitizer(GetName()) ;
   TBranch * digitizerBranch = treeD->Branch("AliPHOSDigitizer", "AliPHOSDigitizer", &d,bufferSize,splitlevel); 
   digitizerBranch->SetTitle(GetName());
-  if (file) {
-    digitizerBranch->SetFile(file);
-    TIter next( digitizerBranch->GetListOfBranches());
-    TBranch * sbr;
-    while ((sbr=(TBranch*)next())) {
-      sbr->SetFile(file);
-    }   
-    cwd->cd();
-  }
-  
-  digitsBranch->Fill() ;      
-  digitizerBranch->Fill() ;
 
-  treeD->Write(0,kOverwrite) ;  
+  digitsBranch->Fill() ;
+  treeD->AutoSave() ; 
  
 }