ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
 
/* $Id: AliITSUDigitizer.cxx 52261 2011-10-23 15:46:57Z hristov $ */
///////////////////////////////////////////////////////////////////////////
//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 <TClonesArray.h>
#include <TTree.h>
#include <TBranch.h>

#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliLoader.h"
#include "AliLog.h"
#include "AliDigitizationInput.h"
#include "AliITSUDigitizer.h"
#include "AliITSUGeomTGeo.h"
#include "AliITSUSimulation.h"
#include "AliITSUSDigit.h"

ClassImp(AliITSUDigitizer)

//______________________________________________________________________
AliITSUDigitizer::AliITSUDigitizer() 
:  fITS(0)
  ,fModActive(0)
  ,fInit(kFALSE)
  ,fRoif(-1)
  ,fRoiifile(0)
  ,fFlagFirstEv(kTRUE)
{
  // Default constructor.
}

//______________________________________________________________________
AliITSUDigitizer::AliITSUDigitizer(AliDigitizationInput* digInp) 
  :AliDigitizer(digInp)
  ,fITS(0)
  ,fModActive(0)
  ,fInit(kFALSE)
  ,fRoif(-1)
  ,fRoiifile(0)
  ,fFlagFirstEv(kTRUE)
{
  // Standard constructor.
}

//______________________________________________________________________
AliITSUDigitizer::~AliITSUDigitizer()
{
  // destructor. 
  fITS = 0; // don't delete fITS. Done else where.
  delete[] fModActive;
}

//______________________________________________________________________
Bool_t AliITSUDigitizer::Init()
{
  // Initialization. Set up region of interest, if switched on, and loads ITS and ITSgeom.
  //
  if (fInit) return kTRUE;
  //
  fInit = kTRUE; // Assume for now init will work.
  //
  if(!gAlice) {
    fITS      = 0;
    fRoiifile = 0;
    fInit     = kFALSE;
    AliFatal("gAlice not found");
  } // end if
  //
  fITS = (AliITSU *)(gAlice->GetDetector("ITS"));
  if(!fITS){
    fRoiifile = 0;
    fInit     = kFALSE;
    AliFatal("ITS not found");
  } 
  if (!fITS->IsSimInitDone()) fITS->InitSimulation();
  int nm = fITS->GetITSGeomTGeo()->GetNChips();
  fModActive = new Bool_t[nm];
  for (Int_t i=nm;i--;) fModActive[i] = kTRUE;

  return fInit;
}

//______________________________________________________________________
void AliITSUDigitizer::Digitize(Option_t* /*opt*/)
{
  // Main digitization function. 
  //
  if (!fInit) AliFatal("Init not successful, aborting.");
  //
  Int_t nfiles = GetDigInput()->GetNinputs();
  Int_t event  = GetDigInput()->GetOutputEventNr();
  //
  TString loadname = Form("%sLoader",fITS->GetName());
  //
  AliITSUGeomTGeo* geom = fITS->GetITSGeomTGeo();
  Int_t nChips  = geom->GetNChips();
  Bool_t lmod;
  Int_t *fl = new Int_t[nfiles];
  fl[0] = fRoiifile;
  int mask = 1;
  for (int id=0;id<nfiles;id++) if(id!=fRoiifile) fl[mask++] = id;
  //
  TClonesArray * sdig = new TClonesArray( "AliITSUSDigit",1000 );
  //
  AliRunLoader *inRL = 0x0, *outRL = 0x0;
  AliLoader *ingime = 0x0, *outgime = 0x0;    
  //
  outRL = AliRunLoader::GetRunLoader(fDigInput->GetOutputFolderName());    
  if (!outRL) AliFatal("Can not get Output Run Loader");
  //
  outRL->GetEvent(event);
  outgime = outRL->GetLoader(loadname);
  if ( outgime == 0x0) AliFatal("Can not get Output ITS Loader");
  //
  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 (int ifiles=0; ifiles<nfiles; ifiles++ ) {
    inRL =  AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(fl[ifiles]));
    ingime = inRL->GetLoader(loadname);
    if (ingime->TreeS() == 0x0) ingime->LoadSDigits();
  }
  //
  for (int chip=0; chip<nChips; chip++ ) {
    //
    if (!fRoif && !fModActive[chip]) continue;
    int lr = geom->GetLayer(chip);
    AliITSUSimulation *sim = fITS->GetSimulationModel(lr);
    if (!sim) AliFatal(Form("The simulation model for layer %d is not available",lr));
    //
    // Fill the chip with the sum of SDigits
    sim->InitSimulationChip(fITS->GetChip(chip), event, fITS->GetSegmentation(lr), fITS->GetResponseParam(lr));
    //
    for (int ifiles=0; ifiles<nfiles; ifiles++ ) {
      //
      if (!fRoif && !fModActive[chip]) 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( fITS->GetName() );
      if( brchSDigits )	brchSDigits->SetAddress( &sdig ); 
      else {
	AliError(Form("branch ITS not found in TreeS, input file %d ", ifiles));
	delete [] fl;
	return;
      } 
      //
      sdig->Clear();
      mask = GetDigInput()->GetMask(ifiles);
      brchSDigits->GetEvent( chip );
      lmod = sim->AddSDigitsToChip(sdig,mask);
      if(GetRegionOfInterest() && !ifiles) fModActive[chip] = lmod;
      //
    } 
    // Digitize current chip sum(SDigits)->Digits
    sim->FinishSDigitiseChip();
    //
    outgime->TreeD()->Fill();       // fills all branches - wasted disk space
    fITS->ResetDigits();
  } // end for chip
  //
  //  fITS->WriteFOSignals(); 
  outgime->TreeD()->AutoSave();
  outgime->WriteDigits("OVERWRITE");
  outgime->UnloadDigits();
  for(int 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=nChips;i--;) fModActive[i] = kTRUE;
  //
  return;
}

//______________________________________________________________________
void AliITSUDigitizer::SetByRegionOfInterest(TTree *ts)
{
  // Scans through the ITS branch of the SDigits tree, ts, for chips
  // which have SDigits in them. For these chips, a flag is set to
  // digitize only these chips. The value of fRoif determines how many
  // neighboring chips will also be turned on. fRoif=0 will turn on only
  // those chips with SDigits in them. fRoif=1 will turn on, in addition,
  // those chips that are +-1 chip 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.
  if (fRoif==0) return;
  if (ts==0)    return;
  TBranch *brchSDigits = ts->GetBranch(fITS->GetName());
  TClonesArray * sdig = new TClonesArray( "AliITSUSDigit",1000 );
  //
  if( brchSDigits ) brchSDigits->SetAddress( &sdig );
  else  {AliError("Branch ITS not found in TreeS"); return;}
  //
  int nm = fITS->GetITSGeomTGeo()->GetNChips();
  for (int m=0;m<nm;m++) {
    fModActive[m] = kFALSE; // Not active by default
    sdig->Clear();
    brchSDigits->GetEvent(m);
    int ndig = sdig->GetEntries();
    for(int i=0;i<ndig;i++) {
      // activate the necessary chips
      if ( ((AliITSUSDigit*)sdig->At(m))->GetSumSignal()>0.0 ) { // Must have non zero signal.
	fModActive[m] = kTRUE;
	break;
      } // end if
    } // end if. end for i.
  } // end for m
  AliDebug(1,"Digitization by Region of Interest selected");
  sdig->Clear();
  delete sdig;
  return;
}
 AliITSUDigitizer.cxx:1
 AliITSUDigitizer.cxx:2
 AliITSUDigitizer.cxx:3
 AliITSUDigitizer.cxx:4
 AliITSUDigitizer.cxx:5
 AliITSUDigitizer.cxx:6
 AliITSUDigitizer.cxx:7
 AliITSUDigitizer.cxx:8
 AliITSUDigitizer.cxx:9
 AliITSUDigitizer.cxx:10
 AliITSUDigitizer.cxx:11
 AliITSUDigitizer.cxx:12
 AliITSUDigitizer.cxx:13
 AliITSUDigitizer.cxx:14
 AliITSUDigitizer.cxx:15
 AliITSUDigitizer.cxx:16
 AliITSUDigitizer.cxx:17
 AliITSUDigitizer.cxx:18
 AliITSUDigitizer.cxx:19
 AliITSUDigitizer.cxx:20
 AliITSUDigitizer.cxx:21
 AliITSUDigitizer.cxx:22
 AliITSUDigitizer.cxx:23
 AliITSUDigitizer.cxx:24
 AliITSUDigitizer.cxx:25
 AliITSUDigitizer.cxx:26
 AliITSUDigitizer.cxx:27
 AliITSUDigitizer.cxx:28
 AliITSUDigitizer.cxx:29
 AliITSUDigitizer.cxx:30
 AliITSUDigitizer.cxx:31
 AliITSUDigitizer.cxx:32
 AliITSUDigitizer.cxx:33
 AliITSUDigitizer.cxx:34
 AliITSUDigitizer.cxx:35
 AliITSUDigitizer.cxx:36
 AliITSUDigitizer.cxx:37
 AliITSUDigitizer.cxx:38
 AliITSUDigitizer.cxx:39
 AliITSUDigitizer.cxx:40
 AliITSUDigitizer.cxx:41
 AliITSUDigitizer.cxx:42
 AliITSUDigitizer.cxx:43
 AliITSUDigitizer.cxx:44
 AliITSUDigitizer.cxx:45
 AliITSUDigitizer.cxx:46
 AliITSUDigitizer.cxx:47
 AliITSUDigitizer.cxx:48
 AliITSUDigitizer.cxx:49
 AliITSUDigitizer.cxx:50
 AliITSUDigitizer.cxx:51
 AliITSUDigitizer.cxx:52
 AliITSUDigitizer.cxx:53
 AliITSUDigitizer.cxx:54
 AliITSUDigitizer.cxx:55
 AliITSUDigitizer.cxx:56
 AliITSUDigitizer.cxx:57
 AliITSUDigitizer.cxx:58
 AliITSUDigitizer.cxx:59
 AliITSUDigitizer.cxx:60
 AliITSUDigitizer.cxx:61
 AliITSUDigitizer.cxx:62
 AliITSUDigitizer.cxx:63
 AliITSUDigitizer.cxx:64
 AliITSUDigitizer.cxx:65
 AliITSUDigitizer.cxx:66
 AliITSUDigitizer.cxx:67
 AliITSUDigitizer.cxx:68
 AliITSUDigitizer.cxx:69
 AliITSUDigitizer.cxx:70
 AliITSUDigitizer.cxx:71
 AliITSUDigitizer.cxx:72
 AliITSUDigitizer.cxx:73
 AliITSUDigitizer.cxx:74
 AliITSUDigitizer.cxx:75
 AliITSUDigitizer.cxx:76
 AliITSUDigitizer.cxx:77
 AliITSUDigitizer.cxx:78
 AliITSUDigitizer.cxx:79
 AliITSUDigitizer.cxx:80
 AliITSUDigitizer.cxx:81
 AliITSUDigitizer.cxx:82
 AliITSUDigitizer.cxx:83
 AliITSUDigitizer.cxx:84
 AliITSUDigitizer.cxx:85
 AliITSUDigitizer.cxx:86
 AliITSUDigitizer.cxx:87
 AliITSUDigitizer.cxx:88
 AliITSUDigitizer.cxx:89
 AliITSUDigitizer.cxx:90
 AliITSUDigitizer.cxx:91
 AliITSUDigitizer.cxx:92
 AliITSUDigitizer.cxx:93
 AliITSUDigitizer.cxx:94
 AliITSUDigitizer.cxx:95
 AliITSUDigitizer.cxx:96
 AliITSUDigitizer.cxx:97
 AliITSUDigitizer.cxx:98
 AliITSUDigitizer.cxx:99
 AliITSUDigitizer.cxx:100
 AliITSUDigitizer.cxx:101
 AliITSUDigitizer.cxx:102
 AliITSUDigitizer.cxx:103
 AliITSUDigitizer.cxx:104
 AliITSUDigitizer.cxx:105
 AliITSUDigitizer.cxx:106
 AliITSUDigitizer.cxx:107
 AliITSUDigitizer.cxx:108
 AliITSUDigitizer.cxx:109
 AliITSUDigitizer.cxx:110
 AliITSUDigitizer.cxx:111
 AliITSUDigitizer.cxx:112
 AliITSUDigitizer.cxx:113
 AliITSUDigitizer.cxx:114
 AliITSUDigitizer.cxx:115
 AliITSUDigitizer.cxx:116
 AliITSUDigitizer.cxx:117
 AliITSUDigitizer.cxx:118
 AliITSUDigitizer.cxx:119
 AliITSUDigitizer.cxx:120
 AliITSUDigitizer.cxx:121
 AliITSUDigitizer.cxx:122
 AliITSUDigitizer.cxx:123
 AliITSUDigitizer.cxx:124
 AliITSUDigitizer.cxx:125
 AliITSUDigitizer.cxx:126
 AliITSUDigitizer.cxx:127
 AliITSUDigitizer.cxx:128
 AliITSUDigitizer.cxx:129
 AliITSUDigitizer.cxx:130
 AliITSUDigitizer.cxx:131
 AliITSUDigitizer.cxx:132
 AliITSUDigitizer.cxx:133
 AliITSUDigitizer.cxx:134
 AliITSUDigitizer.cxx:135
 AliITSUDigitizer.cxx:136
 AliITSUDigitizer.cxx:137
 AliITSUDigitizer.cxx:138
 AliITSUDigitizer.cxx:139
 AliITSUDigitizer.cxx:140
 AliITSUDigitizer.cxx:141
 AliITSUDigitizer.cxx:142
 AliITSUDigitizer.cxx:143
 AliITSUDigitizer.cxx:144
 AliITSUDigitizer.cxx:145
 AliITSUDigitizer.cxx:146
 AliITSUDigitizer.cxx:147
 AliITSUDigitizer.cxx:148
 AliITSUDigitizer.cxx:149
 AliITSUDigitizer.cxx:150
 AliITSUDigitizer.cxx:151
 AliITSUDigitizer.cxx:152
 AliITSUDigitizer.cxx:153
 AliITSUDigitizer.cxx:154
 AliITSUDigitizer.cxx:155
 AliITSUDigitizer.cxx:156
 AliITSUDigitizer.cxx:157
 AliITSUDigitizer.cxx:158
 AliITSUDigitizer.cxx:159
 AliITSUDigitizer.cxx:160
 AliITSUDigitizer.cxx:161
 AliITSUDigitizer.cxx:162
 AliITSUDigitizer.cxx:163
 AliITSUDigitizer.cxx:164
 AliITSUDigitizer.cxx:165
 AliITSUDigitizer.cxx:166
 AliITSUDigitizer.cxx:167
 AliITSUDigitizer.cxx:168
 AliITSUDigitizer.cxx:169
 AliITSUDigitizer.cxx:170
 AliITSUDigitizer.cxx:171
 AliITSUDigitizer.cxx:172
 AliITSUDigitizer.cxx:173
 AliITSUDigitizer.cxx:174
 AliITSUDigitizer.cxx:175
 AliITSUDigitizer.cxx:176
 AliITSUDigitizer.cxx:177
 AliITSUDigitizer.cxx:178
 AliITSUDigitizer.cxx:179
 AliITSUDigitizer.cxx:180
 AliITSUDigitizer.cxx:181
 AliITSUDigitizer.cxx:182
 AliITSUDigitizer.cxx:183
 AliITSUDigitizer.cxx:184
 AliITSUDigitizer.cxx:185
 AliITSUDigitizer.cxx:186
 AliITSUDigitizer.cxx:187
 AliITSUDigitizer.cxx:188
 AliITSUDigitizer.cxx:189
 AliITSUDigitizer.cxx:190
 AliITSUDigitizer.cxx:191
 AliITSUDigitizer.cxx:192
 AliITSUDigitizer.cxx:193
 AliITSUDigitizer.cxx:194
 AliITSUDigitizer.cxx:195
 AliITSUDigitizer.cxx:196
 AliITSUDigitizer.cxx:197
 AliITSUDigitizer.cxx:198
 AliITSUDigitizer.cxx:199
 AliITSUDigitizer.cxx:200
 AliITSUDigitizer.cxx:201
 AliITSUDigitizer.cxx:202
 AliITSUDigitizer.cxx:203
 AliITSUDigitizer.cxx:204
 AliITSUDigitizer.cxx:205
 AliITSUDigitizer.cxx:206
 AliITSUDigitizer.cxx:207
 AliITSUDigitizer.cxx:208
 AliITSUDigitizer.cxx:209
 AliITSUDigitizer.cxx:210
 AliITSUDigitizer.cxx:211
 AliITSUDigitizer.cxx:212
 AliITSUDigitizer.cxx:213
 AliITSUDigitizer.cxx:214
 AliITSUDigitizer.cxx:215
 AliITSUDigitizer.cxx:216
 AliITSUDigitizer.cxx:217
 AliITSUDigitizer.cxx:218
 AliITSUDigitizer.cxx:219
 AliITSUDigitizer.cxx:220
 AliITSUDigitizer.cxx:221
 AliITSUDigitizer.cxx:222
 AliITSUDigitizer.cxx:223
 AliITSUDigitizer.cxx:224
 AliITSUDigitizer.cxx:225
 AliITSUDigitizer.cxx:226
 AliITSUDigitizer.cxx:227
 AliITSUDigitizer.cxx:228
 AliITSUDigitizer.cxx:229
 AliITSUDigitizer.cxx:230
 AliITSUDigitizer.cxx:231
 AliITSUDigitizer.cxx:232
 AliITSUDigitizer.cxx:233
 AliITSUDigitizer.cxx:234
 AliITSUDigitizer.cxx:235
 AliITSUDigitizer.cxx:236
 AliITSUDigitizer.cxx:237
 AliITSUDigitizer.cxx:238
 AliITSUDigitizer.cxx:239
 AliITSUDigitizer.cxx:240
 AliITSUDigitizer.cxx:241
 AliITSUDigitizer.cxx:242
 AliITSUDigitizer.cxx:243
 AliITSUDigitizer.cxx:244
 AliITSUDigitizer.cxx:245
 AliITSUDigitizer.cxx:246
 AliITSUDigitizer.cxx:247
 AliITSUDigitizer.cxx:248
 AliITSUDigitizer.cxx:249
 AliITSUDigitizer.cxx:250
 AliITSUDigitizer.cxx:251
 AliITSUDigitizer.cxx:252
 AliITSUDigitizer.cxx:253