]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSDigitizer.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / ITS / AliITSDigitizer.cxx
index c7ec1637f0a0b5c69d43198163465b00e305cfe2..2b180269ef2992895234972ed6ebff7a88bd1f8a 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
  
-/*
-$Log$
-*/
+/* $Id$ */
+///////////////////////////////////////////////////////////////////////////
+//Piotr.Skowronski@cern.ch :                                             //
+//Corrections applied in order to compile (only)                         // 
+//   with new I/O and folder structure                                   //
+//To be implemented correctly by responsible                             //
+//                                                                       //
+//  Class used to steer                                                  //
+//  the digitization for ITS                                             //
+//                                                                       //
+///////////////////////////////////////////////////////////////////////////
 
 #include <stdlib.h>
-#include <iostream.h>
-#include <TObjArray.h>
+#include <TClonesArray.h>
 #include <TTree.h>
 #include <TBranch.h>
 
-#include <AliRun.h>
-#include <AliRunDigitizer.h>
-
+#include "AliRun.h"
+#include "AliRunLoader.h"
+#include "AliLoader.h"
+#include "AliLog.h"
+#include "AliDigitizationInput.h"
 #include "AliITSDigitizer.h"
-#include "AliITShit.h"
-#include "AliITSmodule.h"
-#include "AliITSsimulation.h"
-#include "AliITSDetType.h"
 #include "AliITSgeom.h"
+#include "AliITSgeomTGeo.h"
+#include "AliITSsimulation.h"
 
 ClassImp(AliITSDigitizer)
 
 //______________________________________________________________________
-AliITSDigitizer::AliITSDigitizer() : AliDigitizer(){
+AliITSDigitizer::AliITSDigitizer() : AliDigitizer(),
+fITS(0),
+fModActive(0),
+fInit(kFALSE),
+fRoif(-1),
+fRoiifile(0),
+fFlagFirstEv(kTRUE){
     // Default constructor. Assign fITS since it is never written out from
     // here. 
     // Inputs:
@@ -45,11 +58,18 @@ AliITSDigitizer::AliITSDigitizer() : AliDigitizer(){
     //      none.
     // Return:
     //      A blank AliITSDigitizer class.
+  fModActive = new Bool_t[AliITSgeomTGeo::GetNModules()];
+  for(Int_t i=0;i<AliITSgeomTGeo::GetNModules();i++) fModActive[i] = kTRUE;
 
-    fITS = 0;
 }
 //______________________________________________________________________
-AliITSDigitizer::AliITSDigitizer(AliRunDigitizer *mngr) : AliDigitizer(mngr){
+AliITSDigitizer::AliITSDigitizer(AliDigitizationInput* digInp) : AliDigitizer(digInp),
+fITS(0),
+fModActive(0),
+fInit(kFALSE),
+fRoif(-1),
+fRoiifile(0),
+fFlagFirstEv(kTRUE){
     // Standard constructor. Assign fITS since it is never written out from
     // here. 
     // Inputs:
@@ -58,9 +78,11 @@ AliITSDigitizer::AliITSDigitizer(AliRunDigitizer *mngr) : AliDigitizer(mngr){
     //      none.
     // Return:
     //      An AliItSDigitizer class.
-
-    fITS = 0;
+  fModActive = new Bool_t[AliITSgeomTGeo::GetNModules()];
+  for(Int_t i=0;i<AliITSgeomTGeo::GetNModules();i++) fModActive[i] = kTRUE;
 }
+
+
 //______________________________________________________________________
 AliITSDigitizer::~AliITSDigitizer(){
     // Default destructor. 
@@ -70,13 +92,13 @@ AliITSDigitizer::~AliITSDigitizer(){
     //      none.
     // Return:
     //      none.
-
     fITS = 0; // don't delete fITS. Done else where.
+    if(fModActive) delete[] fModActive;
 }
-
 //______________________________________________________________________
 Bool_t AliITSDigitizer::Init(){
-    // Iniliztion 
+    // Initialization. Set up region of interest, if switched on, and
+    // loads ITS and ITSgeom.
     // Inputs:
     //      none.
     // Outputs:
@@ -84,96 +106,236 @@ Bool_t AliITSDigitizer::Init(){
     // Return:
     //      none.
 
-//    if(GetHits()) fITS->fHits = new TClonesArray("AliITSHit",1000);
-    return kTRUE;
+    fInit = kTRUE; // Assume for now init will work.
+    if(!gAlice) {
+       fITS      = 0;
+       fRoiifile = 0;
+       fInit     = kFALSE;
+       Warning("Init","gAlice not found");
+       return fInit;
+    } // end if
+    fITS = (AliITS *)(gAlice->GetDetector("ITS"));
+    if(!fITS){
+       fRoiifile = 0;
+       fInit     = kFALSE;
+       Warning("Init","ITS not found");
+       return fInit;
+    } 
+    if(!fITS->GetITSgeom()){
+       fRoiifile = 0;
+       fInit     = kFALSE;
+       Warning("Init","ITS geometry not found");
+       return fInit;
+    } // end if
+    return fInit;
 }
 //______________________________________________________________________
-void AliITSDigitizer::Exec(Option_t* opt){
-    // Main digitizing function. 
+void AliITSDigitizer::Digitize(Option_t* opt){
+    // Main digitization function. 
     // Inputs:
-    //      Option_t * opt   list of subdetector to digitize. =0 all.
+    //      Option_t * opt   list of sub detector to digitize. =0 all.
     // Outputs:
     //      none.
     // Return:
     //      none.
-    Int_t size=0,ifls=0,trk=0,ntracks=0,h=0,nhit=0;
-    TTree *treeH=0;
-    TBranch *brchHits=0;
-    AliITShit *itsHit=0;
-    char name[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-    char *all;
+
+  char name[21] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+    const char *all;
     const char *det[3] = {strstr(opt,"SPD"),strstr(opt,"SDD"),
                           strstr(opt,"SSD")};
-    if(!det[0] && !det[1] && !det[2]) all = "All";
+    if( !det[0] && !det[1] && !det[2] ) all = "All";
     else all = 0;
+    Int_t nfiles = GetDigInput()->GetNinputs();
+    Int_t event  = GetDigInput()->GetOutputEventNr();
     AliITSsimulation *sim      = 0;
-    AliITSDetType    *iDetType = 0;
-    AliITSmodule     *mod      = 0;
-    Int_t id=0,module=0,nfls=0,mask=0;
-    static Bool_t setDef=kTRUE;
-
-    if(!fITS) fITS = (AliITS*)(gAlice->GetDetector("ITS"));
-    if(!(fITS->GetITSgeom())){
-       Warning("Exec","Need ITS geometry to be properly defined first.");
-       return; // need transformations to do digitization.
-    } // end if !GetITSgeom()
-    if (setDef) fITS->SetDefaultSimulation();
-    setDef=kFALSE;
-    sprintf(name,"%s",fITS->GetName());
-    if(!GetModules()) {
-       fITS->InitModules(0,size);
+    if(fFlagFirstEv){
+      fITS->SetDefaults();    
+      fITS->SetDefaultSimulation();
+      fFlagFirstEv=kFALSE;
+    }
+    if(!fInit){
+       Error("Exec","Init not successful, aborting.");
+       return;
     } // end if
 
-    nfls = GetManager()->GetNinputs();
-    for(ifls=0;ifls<nfls;ifls++){
-       treeH = GetManager()->GetInputTreeH(ifls);
-       if(!(treeH && GetHits())) continue;
-       brchHits = treeH->GetBranch(name);
-       if(brchHits){
-           GetHits()->Clear();
-           fITS->SetHitsAddressBranch(brchHits);
-       } else{
-           Error("Exec","branch ITS not found");
-       } // end if brchHits
-
-       ntracks = (Int_t) treeH->GetEntries();
-       for(trk=0;trk<ntracks;trk++){
-           GetHits()->Clear();
-           brchHits->GetEntry(trk);
-           nhit = GetHits()->GetEntries();
-           mask = GetManager()->GetMask(ifls);
-           for(h=0;h<nhit;h++){
-               itsHit = GetHit(h);
-               mod = GetModule(itsHit->GetModule());
-               id       = fITS->GetITSgeom()->GetModuleType(module);
-               if (!all && !det[id]) continue;
-               mod->AddHit(itsHit,trk+mask,h);
-           } // end for h
-       } // end for trk
-    } // end for ifls
-
-    // Digitize 
-    fITS->MakeBranchInTreeD(GetManager()->GetTreeD());
-    for(module=0;module<size;module++){
-        id       = fITS->GetITSgeom()->GetModuleType(module);
-        if (!all && !det[id]) continue;
-        iDetType = fITS->DetType(id);
-        sim      = (AliITSsimulation*)iDetType->GetSimulationModel();
-        if (!sim) {
-            Error("Exec","The simulation class was not instanciated!");
+    snprintf(name,20,"%s",fITS->GetName());
+
+    Int_t size   = fITS->GetITSgeom()->GetIndexMax();
+    Int_t module,id,ifiles,mask;
+    Bool_t lmod;
+    Int_t *fl = new Int_t[nfiles];
+    fl[0] = fRoiifile;
+    mask = 1;
+    for(id=0;id<nfiles;id++) 
+     if(id!=fRoiifile)
+      {
+       // just in case fRoiifile!=0.
+        fl[mask] = id;
+        mask++;
+      } // end for,if
+    TClonesArray * sdig = new TClonesArray( "AliITSpListItem",1000 );
+    
+    TString loadname(name);
+    loadname+="Loader";
+    
+    AliRunLoader *inRL = 0x0, *outRL = 0x0;
+    AliLoader *ingime = 0x0, *outgime = 0x0;    
+    
+    outRL = AliRunLoader::GetRunLoader(fDigInput->GetOutputFolderName());    
+    if ( outRL == 0x0)
+     {
+       Error("Exec","Can not get Output Run Loader");
+       delete [] fl;
+       return;
+     }
+    outRL->GetEvent(event);
+    outgime = outRL->GetLoader(loadname);
+    if ( outgime == 0x0)
+     {
+       Error("Exec","Can not get Output ITS Loader");
+       delete [] fl;
+       return;
+     }
+
+    outgime->LoadDigits("update");
+    if (outgime->TreeD() == 0x0) outgime->MakeTree("D");
+    
+    // Digitize
+    fITS->MakeBranchInTreeD(outgime->TreeD());
+    if(fRoif!=0) {
+      AliDebug(1,"Region of Interest digitization selected");
+    }
+    else {
+      AliDebug(1,"No Region of Interest selected. Digitizing everything");
+    }
+
+
+    for(ifiles=0; ifiles<nfiles; ifiles++ )
+     {
+       inRL =  AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(fl[ifiles]));
+       ingime = inRL->GetLoader(loadname);
+       if (ingime->TreeS() == 0x0) ingime->LoadSDigits();
+     }
+
+    for(module=0; module<size; module++ )
+     {
+       if(fRoif!=0) if(!fModActive[module]) continue;
+       id = fITS->GetITSgeom()->GetModuleType(module);
+       if(!all && !det[id]) continue;
+       sim      = (AliITSsimulation*)fITS->GetSimulationModel(id);
+       if(!sim) {
+            Error( "Exec", "The simulation class was not instanciated!" );
             exit(1);
         } // end if !sim
-        mod      = GetModule(module);
-        sim->DigitiseModule(mod,module,0);
+           // Fill the module with the sum of SDigits
+        sim->InitSimulationModule(module, event);
+       //cout << "Module=" << module;
+        for(ifiles=0; ifiles<nfiles; ifiles++ )
+         {
+           if(fRoif!=0) if(!fModActive[module]) continue;
+            
+           inRL =  AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(fl[ifiles]));
+           ingime = inRL->GetLoader(loadname);
+           
+           TTree *treeS = ingime->TreeS();
+           fITS->SetTreeAddress();
+           
+           if( !treeS  ) continue; 
+           TBranch *brchSDigits = treeS->GetBranch( name );
+           if( brchSDigits ) 
+            {
+                brchSDigits->SetAddress( &sdig ); 
+            } else {
+                Error( "Exec", "branch ITS not found in TreeS, input file %d ",
+                       ifiles );
+               delete [] fl;
+               return;
+            } // end if brchSDigits
+            sdig->Clear();
+            mask = GetDigInput()->GetMask(ifiles);
+            // add summable digits to module
+            brchSDigits->GetEvent( module );
+            lmod = sim->AddSDigitsToModule(sdig,mask);
+            if(GetRegionOfInterest() && (ifiles==0))
+             {
+               fModActive[module] = lmod;
+             } // end if
+        } // end for ifiles
+       //cout << " end ifiles loop" << endl;
+        // Digitize current module sum(SDigits)->Digits
+       sim->FinishSDigitiseModule();
+
         // fills all branches - wasted disk space
-        GetManager()->GetTreeD()->Fill();
-        fITS->ResetDigits();
+        outgime->TreeD()->Fill();
+       fITS->ResetDigits();
     } // end for module
-    fITS->ClearModules();
-    GetManager()->GetTreeD()->GetEntries();
-    GetManager()->GetTreeD()->Write(0,TObject::kOverwrite);
-    // reset tree
-    GetManager()->GetTreeD()->Reset();
+    fITS->WriteFOSignals(); 
+    outgime->TreeD()->AutoSave();
+    outgime->WriteDigits("OVERWRITE");
+    outgime->UnloadDigits();
+    for(ifiles=0; ifiles<nfiles; ifiles++ )
+     {
+       inRL =  AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(fl[ifiles]));
+       ingime = inRL->GetLoader(loadname);
+       ingime->UnloadSDigits();
+     }
+
+    delete[] fl;
+    sdig->Clear();
+    delete sdig;
+    for(Int_t i=0;i<fITS->GetITSgeom()->GetIndexMax();i++) fModActive[i] = kTRUE;
+    
+
+    return;
+}
+//______________________________________________________________________
+void AliITSDigitizer::SetByRegionOfInterest(TTree *ts){
+    // Scans through the ITS branch of the SDigits tree, ts, for modules
+    // which have SDigits in them. For these modules, a flag is set to
+    // digitize only these modules. The value of fRoif determines how many
+    // neighboring modules will also be turned on. fRoif=0 will turn on only
+    // those modules with SDigits in them. fRoif=1 will turn on, in addition,
+    // those modules that are +-1 module from the one with the SDigits. And
+    // So on. This last feature is not supported yet.
+    // Inputs:
+    //      TTree *ts  The tree in which the existing SDigits will define the
+    //                 region of interest.
+    // Outputs:
+    //      none.
+    // Return:
+    //      none.
+    Int_t m,nm,i;
+
+    if(fRoif==0) return;
+    if(ts==0) return;
+    TBranch *brchSDigits = ts->GetBranch(fITS->GetName());
+    TClonesArray * sdig = new TClonesArray( "AliITSpListItem",1000 );
+    //cout << "Region of Interest ts="<<ts<<" brchSDigits="<<brchSDigits<<" sdig="<<sdig<<endl;
+
+    if( brchSDigits ) {
+      brchSDigits->SetAddress( &sdig );
+    } else {
+      Error( "SetByRegionOfInterest","branch ITS not found in TreeS");
+      return;
+    } // end if brchSDigits
+
+    nm = fITS->GetITSgeom()->GetIndexMax();
+    for(m=0;m<nm;m++){
+      fModActive[m] = kFALSE; // Not active by default
+      sdig->Clear();
+      brchSDigits->GetEvent(m);
+      if(sdig->GetLast()>=0) for(i=0;i<sdig->GetLast();i++){
+          // activate the necessary modules
+          if(((AliITSpList*)sdig->At(m))->GetpListItem(i)->GetSignal()>0.0){ // Must have non zero signal.
+            fModActive[m] = kTRUE;
+            break;
+          } // end if
+      } // end if. end for i.
+      //cout << fModActive[m];
+      //cout << endl;
+    } // end for m
+    AliDebug(1,"Digitization by Region of Interest selected");
+    sdig->Clear();
+    delete sdig;
+    return;
 }