]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITS.cxx
Extended pileup search tomore than 1 pileup vertex
[u/mrichter/AliRoot.git] / ITS / AliITS.cxx
index b505d465b9aa99b1f21a1c957328c49be52fc9ab..b109d66eb00f8da389a04042cebc0e49f1f2e59c 100644 (file)
@@ -85,14 +85,37 @@ the AliITS class.
 #include "AliMC.h"
 #include "AliITSDigitizer.h"
 #include "AliITSRecPoint.h"
-#include "AliITSclusterV2.h"
+#include "AliITSsegmentationSPD.h"
+#include "AliITSsegmentationSDD.h"
+#include "AliITSsimulationSDD.h"
+#include "AliITSCalibrationSDD.h"
+#include "AliITSCalibrationSSD.h"
+#include "AliITSsegmentationSSD.h"
+#include "AliITSRawStreamSPD.h"
+#include "AliITSRawStreamSSD.h"
+#include "AliITSRawStreamSDD.h"
+#include "AliRawReader.h"
 #include "AliRun.h"
 #include "AliLog.h"
+#include "AliITSInitGeometry.h"
+#include "AliITSFOSignalsSPD.h"
 
 ClassImp(AliITS)
 
 //______________________________________________________________________
-AliITS::AliITS() : AliDetector(){
+AliITS::AliITS() : AliDetector(),
+fDetTypeSim(0),
+fEuclidOut(0),
+fOpt("All"),
+fIdN(0),
+fIdSens(0),
+fIdName(0),
+fITSmodules(0),
+fTiming(kFALSE),
+fSimuParam(0),
+fModA(0),
+fpSDigits(0)
+{
   // Default initializer for ITS
   //      The default constructor of the AliITS class. In addition to
   // creating the AliITS class it zeros the variables fIshunt (a member
@@ -100,21 +123,64 @@ AliITS::AliITS() : AliDetector(){
   // fIdSens, and fIdName. The AliDetector default constructor
   // is also called.
   
-  fEuclidOut=0;
-  fOpt="All";
-  fIdSens=0;
-  fIdName=0;
-  fDetTypeSim=0;
-  fIshunt     = 0;   // not zeroed in AliDetector.
-  fHits =0;
-  fNhits=0;
-  fITSmodules=0;
 //    SetDetectors(); // default to fOpt="All". This variable not written out.
-    SetMarkerColor(kRed);
+//PH    SetMarkerColor(kRed);
 }
 //______________________________________________________________________
-AliITS::AliITS(const char *name, const char *title):AliDetector(name,title){
+AliITS::AliITS(const Char_t *title):
+  AliDetector("ITS",title),
+  fDetTypeSim(0),
+  fEuclidOut(0),
+  fOpt("All"),
+  fIdN(0),
+  fIdSens(0),
+  fIdName(0),
+  fITSmodules(0),
+  fTiming(kFALSE),
+  fSimuParam(0),
+  fModA(0),
+  fpSDigits(0)
+{
+    //     The standard Constructor for the ITS class. 
+    // It also zeros the variables
+    // fIshunt (a member of AliDetector class), fEuclidOut, and zeros
+    // the pointers fIdSens and fIdName. To help in displaying hits via the
+    // ROOT macro display.C AliITS also sets the marker color to red. The
+    // variables passes with this constructor, const char *name and *title,
+    // are used by the constructor of AliDetector class. See AliDetector
+    // class for a description of these parameters and its constructor
+    // functions.
+    // Inputs:
+    //   Char_t *title  Simulation title for the ITS
+    // Outputs:
+    //   none.
+    // Return:
+    //   none.
+  
+    fHits = new TClonesArray("AliITShit",1560); // from AliDetector
+    if(gAlice->GetMCApp()) gAlice->GetMCApp()->AddHitList(fHits);
+    //fNhits=0;  //done in AliDetector(name,title)
+    SetDetectors(); // default to fOpt="All". This variable not written out.
+    fDetTypeSim   = new AliITSDetTypeSim();
+    //PH  SetMarkerColor(kRed);
+    if(!fLoader) MakeLoader(AliConfig::GetDefaultEventFolderName());
+    fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+}
+//______________________________________________________________________
+AliITS::AliITS(const char *name, const char *title):
+  AliDetector(name,title),
+  fDetTypeSim(0),
+  fEuclidOut(0),
+  fOpt("All"),
+  fIdN(0),
+  fIdSens(0),
+  fIdName(0),
+  fITSmodules(0),
+  fTiming(kFALSE),
+  fSimuParam(0),
+  fModA(0),
+  fpSDigits(0)
+{
   //     The standard Constructor for the ITS class. 
   // It also zeros the variables
   // fIshunt (a member of AliDetector class), fEuclidOut, and zeros
@@ -125,28 +191,16 @@ AliITS::AliITS(const char *name, const char *title):AliDetector(name,title){
   // class for a description of these parameters and its constructor
   // functions.
   
-  fEuclidOut=0;
-  fOpt="All";
-  fIdSens=0;
-  fIdName=0;
-  fDetTypeSim=0;
   fHits = new TClonesArray("AliITShit",1560);
   if(gAlice->GetMCApp()) gAlice->GetMCApp()->AddHitList(fHits);
-  fNhits=0;
-  fITSmodules = 0;
-
-  fIshunt     = 0;  // not zeroed in AliDetector
-  // Not done in AliDetector.
+  //fNhits=0;  //done in AliDetector(name,title)
 
-  fEuclidOut  = 0;
   SetDetectors(); // default to fOpt="All". This variable not written out.
-  
-  fIdName     = 0;
-  fIdSens     = 0;
-  
+    
   fDetTypeSim   = new AliITSDetTypeSim();
-  
-  SetMarkerColor(kRed);
+  //PH  SetMarkerColor(kRed);
+  if(!fLoader) MakeLoader(AliConfig::GetDefaultEventFolderName());
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
 
 }
 //______________________________________________________________________
@@ -161,6 +215,7 @@ AliITS::~AliITS(){
     //      none.
     // Return:
     //      none.
+
     if (fHits) {
       fHits->Delete();
       delete fHits;
@@ -174,44 +229,30 @@ AliITS::~AliITS(){
 
     delete[] fIdName;  // Array of TStrings
     delete[] fIdSens;
-
+    Int_t size   = AliITSgeomTGeo::GetNModules();
     if (fDetTypeSim){
       delete fDetTypeSim;
       fDetTypeSim = 0;
     }
+    if(fSimuParam){
+      delete fSimuParam;
+      fSimuParam=0;
+    }
+    if(fModA){
+      if(size>0){
+       for(Int_t j=0; j<size; j++){
+         fModA[j]->Delete();
+         delete fModA[j];
+       }
+      }
+      delete []fModA;
+    }
+    if(fpSDigits){
+      fpSDigits->Delete();
+      delete fpSDigits;
+    }
 }
-//______________________________________________________________________
-AliITS::AliITS(const AliITS &source) : AliDetector(source){
-    // Copy constructor. This is a function which is not allowed to be
-    // done to the ITS. It exits with an error.
-    // Inputs:
-    //      AliITS &source  An AliITS class.
-    // Outputs:
-    //      none.
-    // Return:
-    //      none.
-
-    if(this==&source) return;
-    Error("Copy constructor",
-          "You are not allowed to make a copy of the AliITS");
-    exit(1);
-}
-//______________________________________________________________________
-AliITS& AliITS::operator=(const AliITS &source){
-    // Assignment operator. This is a function which is not allowed to be
-    // done to the ITS. It exits with an error.
-    // Inputs:
-    //      AliITS &source  An AliITS class.
-    // Outputs:
-    //      none.
-    // Return:
-    //      none.
 
-    if(this==&source) return *this;
-    Error("operator=","You are not allowed to make a copy of the AliITS");
-    exit(1);
-    return *this; //fake return
-}
 //______________________________________________________________________
 AliDigitizer* AliITS::CreateDigitizer(AliRunDigitizer* manager)const{
     // Creates the AliITSDigitizer in a standard way for use via AliModule.
@@ -241,27 +282,10 @@ void AliITS::Init(){
     // Return:
     //      none.
     Int_t i;
-
-    SetDefaults();
     // Array of TStrings
     if(gMC) for(i=0;i<fIdN;i++) fIdSens[i] = gMC->VolId(fIdName[i]);
  
-    WriteGeometry();
-}
-
-//______________________________________________________________________
-void AliITS::WriteGeometry(){
-  
-  //Writes ITS geomtry on gAlice
-
-  if(!fLoader) MakeLoader(AliConfig::GetDefaultEventFolderName());
-  AliRunLoader* rl  = fLoader->GetRunLoader();
-  rl->CdGAFile();
-  AliITSgeom* geom = GetITSgeom();
-  geom->Write();
-
 }
-
 //______________________________________________________________________
 void AliITS::SetDefaults(){
     // sets the default segmentation, response, digit and raw cluster classes.
@@ -271,15 +295,14 @@ void AliITS::SetDefaults(){
     //      none.
     // Return:
     //      none.
-  AliInfoClass("Setting Defaults");
-
+    AliInfoClass("AliITS::Setting Defaults");
     if(!fDetTypeSim) { 
      Error("SetDefaults()","fDetTypeSim is 0!"); 
      return;
     }
 
     fDetTypeSim->SetDefaults();
-
+    if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
 }
 //______________________________________________________________________
@@ -297,6 +320,7 @@ void AliITS::SetDefaultSimulation(){
     }
 
     fDetTypeSim->SetDefaultSimulation();
+    if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
 }
 
@@ -345,13 +369,12 @@ void AliITS::MakeBranchS(const char* fl){
     Error("MakeBranchS","fDetTypeSim is 0!");
   }
   Int_t buffersize = 4000;
-  char branchname[30];
+  char branchname[31];
 
   // only one branch for SDigits.
-  sprintf(branchname,"%s",GetName());
+  snprintf(branchname,30,"%s",GetName());
 
   if(fLoader->TreeS()){
-    if(fDetTypeSim->GetSDigits()==0x0) fDetTypeSim->SetSDigits(new TClonesArray("AliITSpListItem",1000));
     TClonesArray* sdig = (TClonesArray*)fDetTypeSim->GetSDigits();
     MakeBranchInTree(fLoader->TreeS(),branchname,&sdig,buffersize,fl);
   } 
@@ -364,7 +387,8 @@ void AliITS::MakeBranchD(const char* file){
     Warning("MakeBranchD","fDetTypeSim is 0!");
     return;
   }
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
   MakeBranchInTreeD(fLoader->TreeD(),file);
 }
 
@@ -375,12 +399,13 @@ void AliITS:: MakeBranchInTreeD(TTree* treeD, const char* file){
   if(!fDetTypeSim){
     Error("MakeBranchS","fDetTypeSim is 0!");
   }
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
   const Char_t *det[3] = {"SPD","SDD","SSD"};
-  Char_t* digclass;
+  const Char_t* digclass;
   Int_t buffersize = 4000;
-  Char_t branchname[30];
+  Char_t branchname[31];
   
   if(!fDetTypeSim->GetDigits()){
     fDetTypeSim->SetDigits(new TObjArray(fgkNTYPES));
@@ -392,7 +417,7 @@ void AliITS:: MakeBranchInTreeD(TTree* treeD, const char* file){
       (fDetTypeSim->GetDigits())->AddAt(new TClonesArray(classn.Data(),1000),i);
     }
     else ResetDigits(i);  
-    if(fgkNTYPES==3) sprintf(branchname,"%sDigits%s",GetName(),det[i]);
+    if(fgkNTYPES==3) snprintf(branchname,30,"%sDigits%s",GetName(),det[i]);
     else sprintf(branchname,"%sDigits%d",GetName(),i+1);
     TObjArray* dig = DigitsAddress(i);
     if(GetDigits() && treeD) AliDetector::MakeBranchInTree(treeD,branchname, &dig,buffersize,file);
@@ -408,13 +433,14 @@ void AliITS::SetTreeAddress(){
     //      none.
     // Return:
     //      none.
-
+    
   if(!fDetTypeSim) {
     Error("SetTreeAddress","fDetTypeSim is 0!");
     return;
   }
 
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
   TTree *treeS = fLoader->TreeS();
   TTree *treeD = fLoader->TreeD();
@@ -425,8 +451,6 @@ void AliITS::SetTreeAddress(){
 
   fDetTypeSim->SetTreeAddressS(treeS, (Char_t*)GetName());
   fDetTypeSim->SetTreeAddressD(treeD, (Char_t*)GetName());
-
-
 }
 //______________________________________________________________________
 void AliITS::AddHit(Int_t track, Int_t *vol, Float_t *hits){
@@ -449,7 +473,7 @@ void AliITS::AddHit(Int_t track, Int_t *vol, Float_t *hits){
 }
 
 //______________________________________________________________________
-void AliITS::FillModules(Int_t evnt,Int_t bgrev,Int_t nmodules,
+void AliITS::FillModules(Int_t /* evnt */,Int_t bgrev,Int_t /* nmodules */,
                          Option_t *option, const char *filename){
   // fill the modules with the sorted by module hits; add hits from
   // background if option=Add.
@@ -459,7 +483,6 @@ void AliITS::FillModules(Int_t evnt,Int_t bgrev,Int_t nmodules,
   static TFile *file;
   const char *addBgr = strstr(option,"Add");
   
-  evnt = nmodules; // Dummy use of variables to remove warnings
   if (addBgr ) {
     if(first) {
       file=new TFile(filename);
@@ -471,8 +494,8 @@ void AliITS::FillModules(Int_t evnt,Int_t bgrev,Int_t nmodules,
     if(trH1) delete trH1;
     trH1=0;
     
-    char treeName[20];
-    sprintf(treeName,"TreeH%d",bgrev);
+    char treeName[21];
+    snprintf(treeName,20,"TreeH%d",bgrev);
     trH1 = (TTree*)gDirectory->Get(treeName);
     if (!trH1) {
       Error("FillModules","cannot find Hits Tree for event:%d",bgrev);
@@ -486,14 +509,14 @@ void AliITS::FillModules(Int_t evnt,Int_t bgrev,Int_t nmodules,
     FillModules(trH1,10000000); // Default mask 10M.
     TTree *fAli=fLoader->GetRunLoader()->TreeK();
     TFile *fileAli=0;
-    if (fAli) fileAli =fAli->GetCurrentFile();
-    fileAli->cd();
+    if (fAli) {
+      fileAli =fAli->GetCurrentFile();
+      fileAli->cd();
+    }
   } // end if add
   
   
 }
-
-
 //______________________________________________________________________
 void AliITS::FillModules(TTree *treeH, Int_t mask) {
     // fill the modules with the sorted by module hits; 
@@ -510,13 +533,14 @@ void AliITS::FillModules(TTree *treeH, Int_t mask) {
 
     if (treeH == 0x0)
      {
-       Error("FillModules","Tree is NULL");
+       AliError("Tree H  is NULL");
+       return;
      }
     Int_t lay,lad,det,index;
     AliITShit *itsHit=0;
     AliITSmodule *mod=0;
-    char branchname[20];
-    sprintf(branchname,"%s",GetName());
+    char branchname[21];
+    snprintf(branchname,20,"%s",GetName());
     TBranch *branch = treeH->GetBranch(branchname);
     if (!branch) {
         Error("FillModules","%s branch in TreeH not found",branchname);
@@ -546,7 +570,7 @@ void AliITS::FillModules(TTree *treeH, Int_t mask) {
 }
 
 //______________________________________________________________________
-void AliITS::InitModules(Int_t size,Int_t &nmodules){
+Bool_t AliITS::InitModules(Int_t size,Int_t &nmodules){
     // Initialize the modules array.
     // Inputs:
     //      Int_t size  Size of array of the number of modules to be
@@ -564,15 +588,16 @@ void AliITS::InitModules(Int_t size,Int_t &nmodules){
 
     if(!fDetTypeSim) {
       Error("InitModules","fDetTypeSim is null!");
-      return;
+      return kFALSE;
     }
+    if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
     Int_t nl,indexMAX,index;
 
     if(size<=0){ // default to using data stored in AliITSgeom
         if(fDetTypeSim->GetITSgeom()==0) {
             Error("InitModules","fITSgeom not defined");
-            return;
+            return kFALSE;
         } // end if fITSgeom==0
         nl = fDetTypeSim->GetITSgeom()->GetNlayers();
         indexMAX = fDetTypeSim->GetITSgeom()->GetIndexMax();
@@ -589,6 +614,7 @@ void AliITS::InitModules(Int_t size,Int_t &nmodules){
 
         nmodules = size;
     } // end i size<=0
+    return kTRUE;
 }
 //______________________________________________________________________
 void AliITS::Hits2SDigits(){
@@ -601,15 +627,16 @@ void AliITS::Hits2SDigits(){
 
    if(!fDetTypeSim) {
      Error("Hits2SDigits","fDetTypeSim is null!");
-     return;
-    
+     return; 
   } 
      
   SetDefaults();
   fLoader->LoadHits("read");
   fLoader->LoadSDigits("recreate");
   AliRunLoader* rl = fLoader->GetRunLoader(); 
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
+
   for (Int_t iEvent = 0; iEvent < rl->GetNumberOfEvents(); iEvent++) {
         // Do the Hits to Digits operation. Use Standard input values.
         // Event number from file, no background hit merging , use size from
@@ -634,7 +661,8 @@ void AliITS::Hits2Digits(){
     return;
   }
    
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
   SetDefaults();
 
   fLoader->LoadHits("read");
@@ -679,7 +707,8 @@ void AliITS::HitsToDigits(Int_t evNumber,Int_t bgrev,Int_t size,
     Error("HitsToDigits","fDetTypeSim is null!");
     return;
   }
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
   if(!GetITSgeom()) return; // need transformations to do digitization.
   AliITSgeom *geom = GetITSgeom();
 
@@ -693,6 +722,9 @@ void AliITS::HitsToDigits(Int_t evNumber,Int_t bgrev,Int_t size,
   Int_t nmodules;
   InitModules(size,nmodules);
   FillModules(evNumber,bgrev,nmodules,option,filename);
+  // Reset Fast-OR signals for this event
+  fDetTypeSim->ResetFOSignals();
 
   AliITSsimulation *sim      = 0;
   AliITSmodule     *mod      = 0;
@@ -715,6 +747,11 @@ void AliITS::HitsToDigits(Int_t evNumber,Int_t bgrev,Int_t size,
   } // end for module
   
   ClearModules();
+  // Add Fast-OR signals to event (only one object per event)
+  if (all || det[0]) { // SPD present
+    WriteFOSignals();
+  }
   
   fLoader->TreeD()->GetEntries();
   fLoader->TreeD()->AutoSave();
@@ -730,7 +767,8 @@ void AliITS::Hits2PreDigits(){
     return;
   }
    
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
   SetDefaults();
   
   HitsToPreDigits(fLoader->GetRunLoader()->GetEventNumber(),
@@ -764,7 +802,8 @@ void AliITS::HitsToPreDigits(Int_t evNumber,Int_t bgrev,Int_t size,
     Error("HitsToPreDigits","fDetTypeSim is null!");
     return;
   }
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
   if(!GetITSgeom()){
     Error("HitsToPreDigits","fGeom is null!");
@@ -837,6 +876,7 @@ void AliITS::HitsToFastRecPoints(Int_t evNumber,Int_t bgrev,Int_t size,
     //      none.
 
 
+
   if(!GetITSgeom()){
     Error("HitsToPreDigits","fGeom is null!");
     return; // need transformations to do digitization.
@@ -857,28 +897,30 @@ void AliITS::HitsToFastRecPoints(Int_t evNumber,Int_t bgrev,Int_t size,
   Int_t id,module;
 
   TTree *lTR = pITSloader->TreeR();
-  TBranch* branch = lTR->GetBranch("ITSRecPointsF");
+  if(!lTR) {
+    pITSloader->MakeTree("R");
+    lTR = pITSloader->TreeR();
+  }
+  
   TClonesArray* ptarray = new TClonesArray("AliITSRecPoint",1000);
-  if(branch)  branch->SetAddress(ptarray);
-  else lTR->Branch("ITSRecPointsF",&ptarray);
-
+  TBranch* branch = (TBranch*)lTR->Branch("ITSRecPointsF",&ptarray);
+  branch->SetAddress(&ptarray);
   //m.b. : this change is nothing but a nice way to make sure
-  //the CPU goes up !
-  AliDebug(1,Form("N mod = %d",geom->GetIndexMax()));    
+  //the CPU goes up !    
   for(module=0;module<geom->GetIndexMax();module++){
     id       = geom->GetModuleType(module);
     if (!all && !det[id]) continue;
     sim      = (AliITSsimulation*)GetSimulationModel(id);
     if (!sim) {
       Error("HitsToFastPoints","The simulation class was not "
-           "instanciated for module %d type %x!",module,
+           "instantiated for module %d type %s!",module,
            geom->GetModuleTypeName(module));
       exit(1);
     } // end if !sim
     mod      = (AliITSmodule *)fITSmodules->At(module);
     sim->CreateFastRecPoints(mod,module,gRandom,ptarray);
     lTR->Fill();
+    ptarray->Clear();
   } // end for module
 
   ClearModules();
@@ -900,82 +942,29 @@ Int_t AliITS::Hits2Clusters(TTree *hTree, TTree *cTree) {
   InitModules(-1,mmax);
   FillModules(hTree,0);
 
-  TClonesArray *clusters=new TClonesArray("AliITSclusterV2",1000);
-  TBranch *branch=cTree->GetBranch("Clusters");
-  if (!branch) cTree->Branch("Clusters",&clusters);
-  else branch->SetAddress(&clusters);
-
   TClonesArray *points = new TClonesArray("AliITSRecPoint",1000);
+  TBranch *branch=cTree->GetBranch("ITSRecPoints");
+  if (!branch) cTree->Branch("ITSRecPoints",&points);
+  else branch->SetAddress(&points);
 
   AliITSsimulationFastPoints sim;
   Int_t ncl=0;
   for (Int_t m=0; m<mmax; m++) {
     AliITSmodule *mod=GetModule(m);      
     sim.CreateFastRecPoints(mod,m,gRandom,points);      
-    RecPoints2Clusters(points, m, clusters);
-    ncl+=clusters->GetEntriesFast();
+    ncl+=points->GetEntriesFast();
     cTree->Fill();
-    clusters->Clear();
     points->Clear();
   }
 
-  Info("Hits2Clusters","Number of found fast clusters : %d",ncl);
+  AliDebug(1,Form("Number of found fast clusters : %d",ncl));
 
   //cTree->Write();
 
-  delete clusters;
   delete points;
   return 0;
 }
-//_____________________________________________________________________
-void AliITS::RecPoints2Clusters
-(const TClonesArray *points, Int_t idx, TClonesArray *clusters) {
-  //------------------------------------------------------------
-  // Conversion AliITSRecPoint -> AliITSclusterV2 for the ITS 
-  // subdetector indexed by idx 
-  //------------------------------------------------------------
-
-  if(!GetITSgeom()){
-    Error("HitsToPreDigits","fGeom is null!");
-    return; // need transformations to do digitization.
-  }
-  AliITSgeom *g=GetITSgeom();
-  Int_t mmax = g->GetIndexMax();
-  Float_t yshift[2200];
-  Float_t zshift[2200];
-  Int_t ndet[2200];
-  for (Int_t m=0; m<mmax; m++) {
-    Int_t lay,lad,det; g->GetModuleId(m,lay,lad,det);
-    Float_t x,y,z;     g->GetTrans(lay,lad,det,x,y,z); 
-    Double_t rot[9];   g->GetRotMatrix(lay,lad,det,rot);
-    Double_t alpha=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
-    Double_t ca=TMath::Cos(alpha), sa=TMath::Sin(alpha);
-    yshift[m] = x*ca + y*sa;
-    zshift[m] = (Double_t)z;
-    ndet[m] = (lad-1)*g->GetNdetectors(lay) + (det-1);
-  }
 
-  //SPD geometry  
-  Float_t lastSPD1=g->GetModuleIndex(2,1,1)-1;
-
-  TClonesArray &cl=*clusters;
-  Int_t ncl=points->GetEntriesFast();
-  for (Int_t i=0; i<ncl; i++) {
-    AliITSRecPoint *p = (AliITSRecPoint *)points->UncheckedAt(i);
-    Float_t lp[5];
-    lp[0]=-(-p->GetX()+yshift[idx]); if (idx<=lastSPD1) lp[0]*=-1; //SPD1
-    lp[1]=  -p->GetZ()+zshift[idx];
-    lp[2]=p->GetSigmaX2();
-    lp[3]=p->GetSigmaZ2();
-    lp[4]=p->GetQ()*36./23333.;  //electrons -> ADC
-    Int_t lab[4]; 
-    lab[0]=p->GetLabel(0); lab[1]=p->GetLabel(1); lab[2]=p->GetLabel(2);
-    lab[3]=ndet[idx];
-    CheckLabels(lab);
-    Int_t dummy[3]={0,0,0};
-    new (cl[i]) AliITSclusterV2(lab,lp, dummy);
-  }  
-} 
 //_____________________________________________________________________
 void AliITS::CheckLabels(Int_t lab[3]) const {
   //------------------------------------------------------------
@@ -1006,20 +995,31 @@ void AliITS::CheckLabels(Int_t lab[3]) const {
 
 //______________________________________________________________________
 void AliITS::SDigitsToDigits(Option_t *opt){
-    // Standard Summable digits to Digits function.
-    // Inputs:
-    //      none.
-    // Outputs:
-    //      none.
-    if(!fDetTypeSim) {
-      Error("SDigitsToSDigits","fDetTypeSim is 0!");
-      return;
-    }
-   
-    fDetTypeSim->SetLoader(fLoader);
-    SetDefaults();
-    fDetTypeSim->SDigitsToDigits(opt,(Char_t*)GetName());
+  // Standard Summable digits to Digits function.
+  // Inputs:
+  //      none.
+  // Outputs:
+  //      none.
+  if (!fDetTypeSim) {
+    AliError("fDetTypeSim is 0!");
+    return;
+  }
+  const char *all = strstr(opt,"All");
+  const char *det[3] ={strstr(opt,"SPD"),strstr(opt,"SDD"),
+                      strstr(opt,"SSD")};
 
+  // Reset Fast-OR signals for this event
+  fDetTypeSim->ResetFOSignals();
+
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  SetDefaults();
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
+  fDetTypeSim->SDigitsToDigits(opt,(Char_t*)GetName());
+
+  // Add Fast-OR signals to event (only one object per event)
+  if (all || det[0]) { // SPD present
+   WriteFOSignals();
+  }
 }
 
 //______________________________________________________________________
@@ -1070,25 +1070,6 @@ void AliITS::AddSumDigit(AliITSpListItem &sdig){
     }
     fDetTypeSim->AddSumDigit(sdig);
     
-}
-//______________________________________________________________________
-void AliITS::AddRealDigit(Int_t branch, Int_t *digits){
-    //   Add a real digit - as coming from data.
-    // Inputs:
-    //      Int_t id        Detector type number.
-    //      Int_t *digits   Integer array containing the digits info. See 
-    //                      AliITSdigit.h
-    // Outputs:
-    //      none.
-    // Return:
-    //      none.
-
-    if(!fDetTypeSim) {
-      Error("AddRealDigit","fDetTypeSim is 0!");
-      return;
-    }
-    fDetTypeSim->AddRealDigit(branch,digits);
-
 }
 //______________________________________________________________________
 void AliITS::AddSimDigit(Int_t branch, AliITSdigit *d){
@@ -1111,7 +1092,7 @@ void AliITS::AddSimDigit(Int_t branch, AliITSdigit *d){
 }
 //______________________________________________________________________
 void AliITS::AddSimDigit(Int_t branch,Float_t phys,Int_t *digits,Int_t *tracks,
-                         Int_t *hits,Float_t *charges){
+                         Int_t *hits,Float_t *charges, Int_t sigexpanded){
   //   Add a simulated digit to the list.
   // Inputs:
   //      Int_t id        Detector type number.
@@ -1135,7 +1116,7 @@ void AliITS::AddSimDigit(Int_t branch,Float_t phys,Int_t *digits,Int_t *tracks,
       Error("AddSimDigit","fDetTypeSim is 0!");
       return;
     }
-    fDetTypeSim->AddSimDigit(branch,phys,digits,tracks,hits,charges);
+    fDetTypeSim->AddSimDigit(branch,phys,digits,tracks,hits,charges,sigexpanded);
 
 }
 //______________________________________________________________________
@@ -1146,8 +1127,9 @@ void AliITS::Digits2Raw(){
     Error("Digits2Raw","fDetTypeSim is 0!");
     return;
   }
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
   SetDefaults();
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
   fDetTypeSim->GetLoader()->LoadDigits();
   TTree* digits = fDetTypeSim->GetLoader()->TreeD();
   if (!digits) {
@@ -1155,8 +1137,33 @@ void AliITS::Digits2Raw(){
       return;
   }
   fDetTypeSim->SetTreeAddressD(digits,(Char_t*)GetName());
-
+  
+   // Get the FO signals for this event
+  AliITSFOSignalsSPD* foSignals = NULL;
+  AliRunLoader* runLoader = AliRunLoader::Instance();
+  AliITSLoader* itsLoader = (AliITSLoader*) runLoader->GetLoader("ITSLoader");
+  if (!itsLoader) {
+    AliError("ITS loader is NULL.");
+  }
+   else {
+      if(!itsLoader->TreeD()) AliError("   !!! No TreeD available !!!");
+      foSignals = (AliITSFOSignalsSPD*)itsLoader->TreeD()->GetUserInfo()->FindObject("AliITSFOSignalsSPD");
+      if(!foSignals) AliError("FO signals not retrieved");
+     }
+  Bool_t deleteFOsignalsLater = kFALSE;
+  if (!foSignals) {
+    AliError("FO signals not available. No FO bits will be written.");
+    foSignals = new AliITSFOSignalsSPD(); // make a temporary dummy signals object
+    deleteFOsignalsLater = kTRUE;
+  }
+  
+  
+  AliITSDDLModuleMapSDD* ddlsdd=fDetTypeSim->GetDDLModuleMapSDD();
+  Char_t rawSDD=fDetTypeSim->GetSimuParam()->GetSDDRawDataFormat();
   AliITSDDLRawData rawWriter;
+  
+  rawWriter.SetSDDRawFormat(rawSDD);
   //Verbose level
   // 0: Silent
   // 1: cout messages
@@ -1168,34 +1175,218 @@ void AliITS::Digits2Raw(){
   rawWriter.SetVerbose(0);
     
   //SILICON PIXEL DETECTOR
-  Info("Digits2Raw", "Formatting raw data for SPD");
-  rawWriter.RawDataSPD(digits->GetBranch("ITSDigitsSPD"));
+  AliDebug(1,"Formatting raw data for SPD");
+  rawWriter.RawDataSPD(digits->GetBranch("ITSDigitsSPD"),foSignals);
+  if(deleteFOsignalsLater) delete foSignals;
     
   //SILICON DRIFT DETECTOR
-  Info("Digits2Raw", "Formatting raw data for SDD");
-  rawWriter.RawDataSDD(digits->GetBranch("ITSDigitsSDD"));
+  AliDebug(1,Form("Formatting raw data for SDD - Format code =%d",rawSDD));
+  rawWriter.RawDataSDD(digits->GetBranch("ITSDigitsSDD"),ddlsdd);
     
   //SILICON STRIP DETECTOR
-  Info("Digits2Raw", "Formatting raw data for SSD");
+  AliDebug(1,"Formatting raw data for SSD");
   rawWriter.RawDataSSD(digits->GetBranch("ITSDigitsSSD"));
 
   fLoader->UnloadDigits();
-  
-
-
-  
 }
-
-
-
-
 //______________________________________________________________________
 AliLoader* AliITS::MakeLoader(const char* topfoldername){ 
     //builds ITSgetter (AliLoader type)
     //if detector wants to use castomized getter, it must overload this method
 
-    Info("MakeLoader","Creating AliITSLoader. Top folder is %s.",
-         topfoldername);
+    AliDebug(1,Form("Creating AliITSLoader. Top folder is %s.",
+         topfoldername));
     fLoader = new AliITSLoader(GetName(),topfoldername);
     return fLoader;
 }
+//______________________________________________________________________
+Bool_t AliITS::Raw2SDigits(AliRawReader* rawReader)
+{
+  //
+  // Converts RAW data to SDigits
+  //
+  // Get TreeS
+  //
+  Int_t last   = -1;
+  Int_t size   = AliITSgeomTGeo::GetNModules();
+  if(!fModA) {
+    fModA = new TClonesArray*[size];
+    for (Int_t mod = 0; mod < size; mod++) fModA[mod] = new TClonesArray("AliITSpListItem", 10000);
+  }
+  AliLoader* loader =  (AliRunLoader::Instance())->GetLoader("ITSLoader");
+  if (!loader){
+    Error("Open","Can not get ITS loader from Run Loader");
+    return kFALSE;
+  }
+
+  TTree* tree = 0;
+  tree = loader->TreeS();
+  if (!tree){
+    loader->MakeTree("S");
+    tree = loader->TreeS();
+  }
+  //
+  // Array for SDigits
+  // 
+  if(!fpSDigits){
+    fpSDigits = new TClonesArray("AliITSpListItem",10000);
+  }
+  TClonesArray& aSDigits = *fpSDigits;
+  Int_t bufsize = 32000;
+  tree->Branch("ITS", &fpSDigits, bufsize);
+  Int_t npx = 0;
+  //
+  // SPD
+  //
+  AliITSsegmentationSPD* segSPD = (AliITSsegmentationSPD*) fDetTypeSim->GetSegmentationModel(0);
+  if(!segSPD){
+    AliWarning("Set AliITS defaults");
+    SetDefaults();
+    segSPD = (AliITSsegmentationSPD*) fDetTypeSim->GetSegmentationModel(0);
+  }
+  npx = segSPD->Npx();
+  Double_t thr, sigma; 
+    
+  AliITSRawStreamSPD inputSPD(rawReader);
+  while(1){
+    Bool_t next  = inputSPD.Next();
+    if (!next) break;
+
+    Int_t module = inputSPD.GetModuleID();
+    Int_t column = inputSPD.GetColumn();
+    Int_t row    = inputSPD.GetRow();
+    Int_t index  = npx * column + row;
+
+    if (module >= size) continue;
+    last = (fModA[module])->GetEntries();
+    TClonesArray& dum = *fModA[module];
+    fDetTypeSim->GetSimuParam()->SPDThresholds(module,thr,sigma);
+    thr += 1.;
+    new (dum[last]) AliITSpListItem(-1, -1, module, index, thr);
+  }
+  rawReader->Reset();
+
+  //
+  // SDD
+  // 
+  AliITSsegmentationSDD* segSDD = (AliITSsegmentationSDD*) fDetTypeSim->GetSegmentationModel(1);
+  npx = segSDD->Npx();
+  Int_t scalef=AliITSsimulationSDD::ScaleFourier(segSDD);
+  Int_t firstSDD=AliITSgeomTGeo::GetModuleIndex(3,1,1);
+  Int_t firstSSD=AliITSgeomTGeo::GetModuleIndex(5,1,1);
+
+  AliITSRawStream* inputSDD=AliITSRawStreamSDD::CreateRawStreamSDD(rawReader);
+  for(Int_t iMod=firstSDD; iMod<firstSSD; iMod++){
+    AliITSCalibrationSDD* cal = (AliITSCalibrationSDD*)fDetTypeSim->GetCalibrationModel(iMod);
+    Bool_t isZeroSupp=cal->GetZeroSupp();
+    if(isZeroSupp){ 
+      for(Int_t iSid=0; iSid<2; iSid++) inputSDD->SetZeroSuppLowThreshold(iMod-firstSDD,iSid,cal->GetZSLowThreshold(iSid));
+    }else{
+      for(Int_t iSid=0; iSid<2; iSid++) inputSDD->SetZeroSuppLowThreshold(iMod-firstSDD,iSid,0);
+    }
+  }
+
+  AliITSDDLModuleMapSDD* ddlmap=fDetTypeSim->GetDDLModuleMapSDD();
+  inputSDD->SetDDLModuleMap(ddlmap);
+  while(inputSDD->Next()){
+    if(inputSDD->IsCompletedModule()==kFALSE && 
+       inputSDD->IsCompletedDDL()==kFALSE){
+
+      Int_t module = inputSDD->GetModuleID();
+      Int_t anode  = inputSDD->GetCoord1()+segSDD->NpzHalf()*inputSDD->GetChannel();
+      Int_t time   = inputSDD->GetCoord2();
+      Int_t signal10 = inputSDD->GetSignal();
+      Int_t index = AliITSpList::GetIndex(anode,time,scalef*npx);
+
+      if (module >= size) continue;
+      last = fModA[module]->GetEntries();
+      TClonesArray& dum = *fModA[module];
+      new (dum[last]) AliITSpListItem(-1, -1, module, index, Double_t(signal10));
+      ((AliITSpListItem*) dum.At(last))->AddSignalAfterElect(module, index, Double_t(signal10));
+    }
+  }
+  delete inputSDD;
+  rawReader->Reset();
+    
+  //
+  // SSD
+  // 
+  AliITSsegmentationSSD* segSSD = (AliITSsegmentationSSD*) fDetTypeSim->GetSegmentationModel(2);
+  npx = segSSD->Npx();
+  AliITSRawStreamSSD inputSSD(rawReader);
+  while(1){
+    Bool_t next  = inputSSD.Next();
+    if (!next) break;
+
+    Int_t module  = inputSSD.GetModuleID();
+    if(module<0)AliError(Form("Invalid SSD  module %d \n",module));
+    if(module<0)continue;
+    Int_t side    = inputSSD.GetSideFlag();
+    Int_t strip   = inputSSD.GetStrip();
+    Int_t signal  = inputSSD.GetSignal();
+    Int_t index  = npx * side + strip;
+
+    if (module >= size) continue;
+       
+    last = fModA[module]->GetEntries();
+    TClonesArray& dum = *fModA[module];
+    new (dum[last]) AliITSpListItem(-1, -1, module, index, Double_t(signal));
+  }
+  rawReader->Reset();
+  AliITSpListItem* sdig = 0;
+    
+  Int_t firstssd = GetITSgeom()->GetStartDet(kSSD);
+  Double_t adcToEv = 1.;
+  for (Int_t mod = 0; mod < size; mod++)
+    {
+      if(mod>=firstssd) {
+       AliITSCalibrationSSD* calssd = (AliITSCalibrationSSD*)fDetTypeSim->GetCalibrationModel(mod);
+       adcToEv = 1./calssd->GetSSDDEvToADC(1.);
+      }
+      Int_t nsdig =  fModA[mod]->GetEntries();
+      for (Int_t ie = 0; ie < nsdig; ie++) {
+       sdig = (AliITSpListItem*) (fModA[mod]->At(ie));
+       Double_t digsig = sdig->GetSignal();
+       if(mod>=firstssd) digsig*=adcToEv; // for SSD: convert back charge from ADC to electron
+       new (aSDigits[ie]) AliITSpListItem(-1, -1, mod, sdig->GetIndex(), digsig);
+       Float_t sig = sdig->GetSignalAfterElect();
+       if(mod>=firstssd) sig*=adcToEv;
+       if (sig > 0.) {
+         sdig = (AliITSpListItem*)aSDigits[ie];
+         sdig->AddSignalAfterElect(mod, sdig->GetIndex(), Double_t(sig));
+       }
+      }
+       
+      tree->Fill();
+      aSDigits.Clear();
+      fModA[mod]->Clear();
+    }
+  loader->WriteSDigits("OVERWRITE");    
+  return kTRUE;
+}
+
+//______________________________________________________________________
+void AliITS::UpdateInternalGeometry(){
+  //reads new geometry from TGeo 
+//   AliDebug(1,"Delete ITSgeom and create a new one reading TGeo");
+
+  AliITSVersion_t version = (AliITSVersion_t)IsVersion();
+  Int_t minor = 0;
+  AliITSInitGeometry initgeom;
+  AliITSgeom* geom = initgeom.CreateAliITSgeom(version,minor);
+  SetITSgeom(geom);
+}
+//______________________________________________________________________
+AliTriggerDetector* AliITS::CreateTriggerDetector() const {
+  // create an AliITSTrigger object (and set trigger conditions as input)
+  return new AliITSTrigger(fDetTypeSim->GetTriggerConditions());
+}
+//______________________________________________________________________
+void AliITS::WriteFOSignals(){
+// This method write FO signals in Digits tree both in Hits2Digits
+// or SDigits2Digits
+
+  fDetTypeSim->ProcessNoiseForFastOr();
+  fDetTypeSim->WriteFOSignals();
+}