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$ */

///_________________________________________________________________________
///
/// This class constructs Digits out of Hits
///
///

// --- Standard library ---

// --- ROOT system ---
#include <TMath.h>
#include <TTree.h>
#include <TRandom.h>

// --- AliRoot header files ---
#include "AliRun.h"
#include "AliACORDE.h"
#include "AliACORDEhit.h"
#include "AliRunLoader.h"
#include "AliLoader.h"
#include "AliDigitizationInput.h"
#include "AliCDBManager.h"
#include "AliCDBStorage.h"
#include "AliCDBEntry.h"
#include "AliACORDECalibData.h"
#include "AliACORDEConstants.h"

#include "AliACORDEdigit.h"
#include "AliACORDEDigitizer.h"

ClassImp(AliACORDEDigitizer)

AliACORDEDigitizer::AliACORDEDigitizer()
  :AliDigitizer(),
   fCalibData(GetCalibData()),
   fNdigits(0),
   fDigits(0)
  
{
  // default constructor
}

AliACORDEDigitizer::AliACORDEDigitizer(AliDigitizationInput* digInput)
  :AliDigitizer(digInput),
   fCalibData(GetCalibData()),
   fNdigits(0),
   fDigits(0)

{
  // constructor

}

AliACORDEDigitizer::~AliACORDEDigitizer()
{
  // destructor
  
  if (fDigits) {
    fDigits->Delete();
    delete fDigits;
    fDigits=0;
  }
}


Bool_t AliACORDEDigitizer::Init()
{
  // Initialises the digitizer
  
  // Initialises the Digit array
  fDigits = new TClonesArray ("AliACORDEdigit", 1000);
  
  return kTRUE;
}

void AliACORDEDigitizer::Digitize(Option_t* /*option*/)
{

  // Creates digits from hits

  // 1.- create and initialize temporal variables
  // 2.- get loaders to access hots and digits
  // 3.- loop over all input. 
  //     3.1 for each input loop over all track
  //     3.2 for each track loop over all hits
  //     3.3 for each hit, check 
  //         if energy above threshold
  //         if survives efficiency
  //         then store the plastic, the time and track in temp arrays
  //         if a hit already survived for this plastic take the hit
  //         with the lowest time
  // 4.- loop over temporal array
  //     if both plastic have a surviving hit and the time
  //     difference is below the limit, add a new digit
  // 


  // 1.- temporal variables
  Float_t emin = AliACORDEConstants::Instance()->HitEnergyThreshold();
  Float_t td = AliACORDEConstants::Instance()->MaxHitTimeDifference();
  Int_t modules[60]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  Int_t moduls[60]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 
  Int_t mods;
  Float_t PlasticTimes[2][60]; 
  Int_t PlasticTracks[2][60];
  for (Int_t i=0;i<60;i++) {
    PlasticTimes[0][i]=-1.0;
    PlasticTimes[1][i]=-1.0;
    PlasticTracks[0][i]=-1;
    PlasticTracks[1][i]=-1;
  }

  // 2.- get loaders
  AliRunLoader* outRunLoader =
    AliRunLoader::GetRunLoader(fDigInput->GetOutputFolderName());
  if (!outRunLoader) {
    Error("Exec", "Can not get output Run Loader");
    return;}
  
  AliLoader* outLoader = outRunLoader->GetLoader("ACORDELoader");
  if (!outLoader) {
    Error("Exec", "Can not get output ACORDE Loader");
    return;}
  
  outLoader->LoadDigits("update");
  if (!outLoader->TreeD()) outLoader->MakeTree("D");
  outLoader->MakeDigitsContainer();
  TTree* treeD  = outLoader->TreeD();
  Int_t bufsize = 16000;
  treeD->Branch("ACORDEdigit", &fDigits, bufsize);
  
  // 3. loop over inputs
  for (Int_t iInput = 0; iInput < fDigInput->GetNinputs(); iInput++) {
    AliRunLoader* runLoader =
      AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(iInput));
    AliLoader* loader = runLoader->GetLoader("ACORDELoader");
    if (!loader) {
      Error("Exec", "Can not get ACORDE Loader for input %d", iInput);
      continue;}
    
    if (!runLoader->GetAliRun()) runLoader->LoadgAlice();
    
    AliACORDE* acorde = (AliACORDE*) runLoader->GetAliRun()->GetDetector("ACORDE");
    if (!acorde) {
      Error("Exec", "No ACORDE detector for input %d", iInput);
      continue;}
    
    loader->LoadHits();
    TTree* treeH = loader->TreeH();
    if (!treeH) {
      Error("Exec", "Cannot get TreeH for input %d", iInput);
      continue; }
    
    TClonesArray* hits = acorde->Hits();
    
    // 3.1 loop over all tracks
    Int_t nTracks = (Int_t) treeH->GetEntries();
    for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
      acorde->ResetHits();
      treeH->GetEvent(iTrack);
      Int_t nHits = hits->GetEntriesFast();
      // 3.2 loop over hits
      for (Int_t iHit = 0; iHit < nHits; iHit++) {
        AliACORDEhit* hit = (AliACORDEhit *)hits->UncheckedAt(iHit);
	// 3.3 select hit
	// get hit info
	Float_t eloss_mev = hit->Eloss()*1000.0;
	Int_t module = hit->GetModule();
        modules[module]=1;
	Int_t plastic = hit->GetPlastic();
	Float_t time_ns = hit->GetTime()*1e9;
	Float_t eff = TMath::Sqrt(fCalibData->GetEfficiency(module));
	// if enough energy and efficiency
	if( eloss_mev > emin && gRandom->Uniform() < eff ) {
	  // if first hit or earlier track
	  if ((PlasticTimes[plastic-1][module-1] == -1.0) ||
	      (PlasticTimes[plastic-1][module-1] > time_ns) ) {
	    PlasticTimes[plastic-1][module-1]= time_ns;
	    PlasticTracks[plastic-1][module-1]= hit->GetTrack();
	  } 
	}
      } // end of hit   loop
    } // end of track loop
    for(Int_t i=0;i<60;i++){moduls[i]=modules[i];}
    
    loader->UnloadHits();
    
  }  // end of input loop

  // 4.- loop over temporal arrays to add hits
  Int_t tracks[3]={-1,-1,-1};
  for (Int_t i=0; i<60; i++) {
    // if both modules have a hit
    // if time diff small enough
    Float_t diff = TMath::Abs(PlasticTimes[0][i]-PlasticTimes[1][i]);
    if (diff < td) {
      tracks[0] = PlasticTracks[0][i];
      if (PlasticTracks[0][i] != PlasticTracks[1][i]) 
	tracks[1] = PlasticTracks[1][i];
      if(moduls[i]==1) {
	mods = i;
	//	Float_t module_time = (PlasticTimes[0][i] > PlasticTimes[1][i] ? 
	//			       PlasticTimes[0][i] : PlasticTimes[1][i]);
	//	AddDigit(tracks, mods, module_time);
	AddDigit(tracks, mods, 0);
      }
    }
  }
  treeD->Fill();
  outLoader->WriteDigits("OVERWRITE");
  outLoader->UnloadDigits();
  ResetDigit();
}

//____________________________________________________________________________

void AliACORDEDigitizer::AddDigit(Int_t* track, Int_t module, Float_t time)
{
  
  // Adds Digit
  
  TClonesArray &ldigits = *fDigits;
  new(ldigits[fNdigits++]) AliACORDEdigit(track,module,time);
}

void AliACORDEDigitizer::AddDigit(Int_t* modul,Float_t time)
{
	// MRC Adds Digit
  TClonesArray &ldigits = *fDigits;
  new(ldigits[fNdigits++]) AliACORDEdigit(modul,time);
  

}
void AliACORDEDigitizer::ResetDigit()
{
//
// Clears Digits
//
  fNdigits = 0;
  if (fDigits) fDigits->Delete();
}


AliACORDECalibData* AliACORDEDigitizer::GetCalibData() const

{
  AliCDBManager *man = AliCDBManager::Instance();

  AliCDBEntry *entry=0;

  entry = man->Get("ACORDE/Calib/Data");

  if(!entry){
    AliWarning("Load of calibration data from default storage failed!");
    AliWarning("Calibration data will be loaded from local storage ($ALICE_ROOT)");
    Int_t runNumber = man->GetRun();
    entry = man->GetStorage("local://$ALICE_ROOT/OCDB")
      ->Get("ACORDE/Calib/Data",runNumber);

  }

  // Retrieval of data in directory ACORDE/Calib/Data:


  AliACORDECalibData *calibdata = 0;

  if (entry) calibdata = (AliACORDECalibData*) entry->GetObject();
  if (!calibdata)  AliError("No calibration data from calibration database !");


  return calibdata;

}

 AliACORDEDigitizer.cxx:1
 AliACORDEDigitizer.cxx:2
 AliACORDEDigitizer.cxx:3
 AliACORDEDigitizer.cxx:4
 AliACORDEDigitizer.cxx:5
 AliACORDEDigitizer.cxx:6
 AliACORDEDigitizer.cxx:7
 AliACORDEDigitizer.cxx:8
 AliACORDEDigitizer.cxx:9
 AliACORDEDigitizer.cxx:10
 AliACORDEDigitizer.cxx:11
 AliACORDEDigitizer.cxx:12
 AliACORDEDigitizer.cxx:13
 AliACORDEDigitizer.cxx:14
 AliACORDEDigitizer.cxx:15
 AliACORDEDigitizer.cxx:16
 AliACORDEDigitizer.cxx:17
 AliACORDEDigitizer.cxx:18
 AliACORDEDigitizer.cxx:19
 AliACORDEDigitizer.cxx:20
 AliACORDEDigitizer.cxx:21
 AliACORDEDigitizer.cxx:22
 AliACORDEDigitizer.cxx:23
 AliACORDEDigitizer.cxx:24
 AliACORDEDigitizer.cxx:25
 AliACORDEDigitizer.cxx:26
 AliACORDEDigitizer.cxx:27
 AliACORDEDigitizer.cxx:28
 AliACORDEDigitizer.cxx:29
 AliACORDEDigitizer.cxx:30
 AliACORDEDigitizer.cxx:31
 AliACORDEDigitizer.cxx:32
 AliACORDEDigitizer.cxx:33
 AliACORDEDigitizer.cxx:34
 AliACORDEDigitizer.cxx:35
 AliACORDEDigitizer.cxx:36
 AliACORDEDigitizer.cxx:37
 AliACORDEDigitizer.cxx:38
 AliACORDEDigitizer.cxx:39
 AliACORDEDigitizer.cxx:40
 AliACORDEDigitizer.cxx:41
 AliACORDEDigitizer.cxx:42
 AliACORDEDigitizer.cxx:43
 AliACORDEDigitizer.cxx:44
 AliACORDEDigitizer.cxx:45
 AliACORDEDigitizer.cxx:46
 AliACORDEDigitizer.cxx:47
 AliACORDEDigitizer.cxx:48
 AliACORDEDigitizer.cxx:49
 AliACORDEDigitizer.cxx:50
 AliACORDEDigitizer.cxx:51
 AliACORDEDigitizer.cxx:52
 AliACORDEDigitizer.cxx:53
 AliACORDEDigitizer.cxx:54
 AliACORDEDigitizer.cxx:55
 AliACORDEDigitizer.cxx:56
 AliACORDEDigitizer.cxx:57
 AliACORDEDigitizer.cxx:58
 AliACORDEDigitizer.cxx:59
 AliACORDEDigitizer.cxx:60
 AliACORDEDigitizer.cxx:61
 AliACORDEDigitizer.cxx:62
 AliACORDEDigitizer.cxx:63
 AliACORDEDigitizer.cxx:64
 AliACORDEDigitizer.cxx:65
 AliACORDEDigitizer.cxx:66
 AliACORDEDigitizer.cxx:67
 AliACORDEDigitizer.cxx:68
 AliACORDEDigitizer.cxx:69
 AliACORDEDigitizer.cxx:70
 AliACORDEDigitizer.cxx:71
 AliACORDEDigitizer.cxx:72
 AliACORDEDigitizer.cxx:73
 AliACORDEDigitizer.cxx:74
 AliACORDEDigitizer.cxx:75
 AliACORDEDigitizer.cxx:76
 AliACORDEDigitizer.cxx:77
 AliACORDEDigitizer.cxx:78
 AliACORDEDigitizer.cxx:79
 AliACORDEDigitizer.cxx:80
 AliACORDEDigitizer.cxx:81
 AliACORDEDigitizer.cxx:82
 AliACORDEDigitizer.cxx:83
 AliACORDEDigitizer.cxx:84
 AliACORDEDigitizer.cxx:85
 AliACORDEDigitizer.cxx:86
 AliACORDEDigitizer.cxx:87
 AliACORDEDigitizer.cxx:88
 AliACORDEDigitizer.cxx:89
 AliACORDEDigitizer.cxx:90
 AliACORDEDigitizer.cxx:91
 AliACORDEDigitizer.cxx:92
 AliACORDEDigitizer.cxx:93
 AliACORDEDigitizer.cxx:94
 AliACORDEDigitizer.cxx:95
 AliACORDEDigitizer.cxx:96
 AliACORDEDigitizer.cxx:97
 AliACORDEDigitizer.cxx:98
 AliACORDEDigitizer.cxx:99
 AliACORDEDigitizer.cxx:100
 AliACORDEDigitizer.cxx:101
 AliACORDEDigitizer.cxx:102
 AliACORDEDigitizer.cxx:103
 AliACORDEDigitizer.cxx:104
 AliACORDEDigitizer.cxx:105
 AliACORDEDigitizer.cxx:106
 AliACORDEDigitizer.cxx:107
 AliACORDEDigitizer.cxx:108
 AliACORDEDigitizer.cxx:109
 AliACORDEDigitizer.cxx:110
 AliACORDEDigitizer.cxx:111
 AliACORDEDigitizer.cxx:112
 AliACORDEDigitizer.cxx:113
 AliACORDEDigitizer.cxx:114
 AliACORDEDigitizer.cxx:115
 AliACORDEDigitizer.cxx:116
 AliACORDEDigitizer.cxx:117
 AliACORDEDigitizer.cxx:118
 AliACORDEDigitizer.cxx:119
 AliACORDEDigitizer.cxx:120
 AliACORDEDigitizer.cxx:121
 AliACORDEDigitizer.cxx:122
 AliACORDEDigitizer.cxx:123
 AliACORDEDigitizer.cxx:124
 AliACORDEDigitizer.cxx:125
 AliACORDEDigitizer.cxx:126
 AliACORDEDigitizer.cxx:127
 AliACORDEDigitizer.cxx:128
 AliACORDEDigitizer.cxx:129
 AliACORDEDigitizer.cxx:130
 AliACORDEDigitizer.cxx:131
 AliACORDEDigitizer.cxx:132
 AliACORDEDigitizer.cxx:133
 AliACORDEDigitizer.cxx:134
 AliACORDEDigitizer.cxx:135
 AliACORDEDigitizer.cxx:136
 AliACORDEDigitizer.cxx:137
 AliACORDEDigitizer.cxx:138
 AliACORDEDigitizer.cxx:139
 AliACORDEDigitizer.cxx:140
 AliACORDEDigitizer.cxx:141
 AliACORDEDigitizer.cxx:142
 AliACORDEDigitizer.cxx:143
 AliACORDEDigitizer.cxx:144
 AliACORDEDigitizer.cxx:145
 AliACORDEDigitizer.cxx:146
 AliACORDEDigitizer.cxx:147
 AliACORDEDigitizer.cxx:148
 AliACORDEDigitizer.cxx:149
 AliACORDEDigitizer.cxx:150
 AliACORDEDigitizer.cxx:151
 AliACORDEDigitizer.cxx:152
 AliACORDEDigitizer.cxx:153
 AliACORDEDigitizer.cxx:154
 AliACORDEDigitizer.cxx:155
 AliACORDEDigitizer.cxx:156
 AliACORDEDigitizer.cxx:157
 AliACORDEDigitizer.cxx:158
 AliACORDEDigitizer.cxx:159
 AliACORDEDigitizer.cxx:160
 AliACORDEDigitizer.cxx:161
 AliACORDEDigitizer.cxx:162
 AliACORDEDigitizer.cxx:163
 AliACORDEDigitizer.cxx:164
 AliACORDEDigitizer.cxx:165
 AliACORDEDigitizer.cxx:166
 AliACORDEDigitizer.cxx:167
 AliACORDEDigitizer.cxx:168
 AliACORDEDigitizer.cxx:169
 AliACORDEDigitizer.cxx:170
 AliACORDEDigitizer.cxx:171
 AliACORDEDigitizer.cxx:172
 AliACORDEDigitizer.cxx:173
 AliACORDEDigitizer.cxx:174
 AliACORDEDigitizer.cxx:175
 AliACORDEDigitizer.cxx:176
 AliACORDEDigitizer.cxx:177
 AliACORDEDigitizer.cxx:178
 AliACORDEDigitizer.cxx:179
 AliACORDEDigitizer.cxx:180
 AliACORDEDigitizer.cxx:181
 AliACORDEDigitizer.cxx:182
 AliACORDEDigitizer.cxx:183
 AliACORDEDigitizer.cxx:184
 AliACORDEDigitizer.cxx:185
 AliACORDEDigitizer.cxx:186
 AliACORDEDigitizer.cxx:187
 AliACORDEDigitizer.cxx:188
 AliACORDEDigitizer.cxx:189
 AliACORDEDigitizer.cxx:190
 AliACORDEDigitizer.cxx:191
 AliACORDEDigitizer.cxx:192
 AliACORDEDigitizer.cxx:193
 AliACORDEDigitizer.cxx:194
 AliACORDEDigitizer.cxx:195
 AliACORDEDigitizer.cxx:196
 AliACORDEDigitizer.cxx:197
 AliACORDEDigitizer.cxx:198
 AliACORDEDigitizer.cxx:199
 AliACORDEDigitizer.cxx:200
 AliACORDEDigitizer.cxx:201
 AliACORDEDigitizer.cxx:202
 AliACORDEDigitizer.cxx:203
 AliACORDEDigitizer.cxx:204
 AliACORDEDigitizer.cxx:205
 AliACORDEDigitizer.cxx:206
 AliACORDEDigitizer.cxx:207
 AliACORDEDigitizer.cxx:208
 AliACORDEDigitizer.cxx:209
 AliACORDEDigitizer.cxx:210
 AliACORDEDigitizer.cxx:211
 AliACORDEDigitizer.cxx:212
 AliACORDEDigitizer.cxx:213
 AliACORDEDigitizer.cxx:214
 AliACORDEDigitizer.cxx:215
 AliACORDEDigitizer.cxx:216
 AliACORDEDigitizer.cxx:217
 AliACORDEDigitizer.cxx:218
 AliACORDEDigitizer.cxx:219
 AliACORDEDigitizer.cxx:220
 AliACORDEDigitizer.cxx:221
 AliACORDEDigitizer.cxx:222
 AliACORDEDigitizer.cxx:223
 AliACORDEDigitizer.cxx:224
 AliACORDEDigitizer.cxx:225
 AliACORDEDigitizer.cxx:226
 AliACORDEDigitizer.cxx:227
 AliACORDEDigitizer.cxx:228
 AliACORDEDigitizer.cxx:229
 AliACORDEDigitizer.cxx:230
 AliACORDEDigitizer.cxx:231
 AliACORDEDigitizer.cxx:232
 AliACORDEDigitizer.cxx:233
 AliACORDEDigitizer.cxx:234
 AliACORDEDigitizer.cxx:235
 AliACORDEDigitizer.cxx:236
 AliACORDEDigitizer.cxx:237
 AliACORDEDigitizer.cxx:238
 AliACORDEDigitizer.cxx:239
 AliACORDEDigitizer.cxx:240
 AliACORDEDigitizer.cxx:241
 AliACORDEDigitizer.cxx:242
 AliACORDEDigitizer.cxx:243
 AliACORDEDigitizer.cxx:244
 AliACORDEDigitizer.cxx:245
 AliACORDEDigitizer.cxx:246
 AliACORDEDigitizer.cxx:247
 AliACORDEDigitizer.cxx:248
 AliACORDEDigitizer.cxx:249
 AliACORDEDigitizer.cxx:250
 AliACORDEDigitizer.cxx:251
 AliACORDEDigitizer.cxx:252
 AliACORDEDigitizer.cxx:253
 AliACORDEDigitizer.cxx:254
 AliACORDEDigitizer.cxx:255
 AliACORDEDigitizer.cxx:256
 AliACORDEDigitizer.cxx:257
 AliACORDEDigitizer.cxx:258
 AliACORDEDigitizer.cxx:259
 AliACORDEDigitizer.cxx:260
 AliACORDEDigitizer.cxx:261
 AliACORDEDigitizer.cxx:262
 AliACORDEDigitizer.cxx:263
 AliACORDEDigitizer.cxx:264
 AliACORDEDigitizer.cxx:265
 AliACORDEDigitizer.cxx:266
 AliACORDEDigitizer.cxx:267
 AliACORDEDigitizer.cxx:268
 AliACORDEDigitizer.cxx:269
 AliACORDEDigitizer.cxx:270
 AliACORDEDigitizer.cxx:271
 AliACORDEDigitizer.cxx:272
 AliACORDEDigitizer.cxx:273
 AliACORDEDigitizer.cxx:274
 AliACORDEDigitizer.cxx:275
 AliACORDEDigitizer.cxx:276
 AliACORDEDigitizer.cxx:277
 AliACORDEDigitizer.cxx:278
 AliACORDEDigitizer.cxx:279
 AliACORDEDigitizer.cxx:280
 AliACORDEDigitizer.cxx:281
 AliACORDEDigitizer.cxx:282
 AliACORDEDigitizer.cxx:283
 AliACORDEDigitizer.cxx:284
 AliACORDEDigitizer.cxx:285
 AliACORDEDigitizer.cxx:286
 AliACORDEDigitizer.cxx:287
 AliACORDEDigitizer.cxx:288
 AliACORDEDigitizer.cxx:289
 AliACORDEDigitizer.cxx:290