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.                  *
 **************************************************************************/
///////////////////////////////////////////////////////////////////////////////
// This is the base class for ITSU detector signal simulations. Data members //
///////////////////////////////////////////////////////////////////////////////
#include <TRandom.h>
#include "TSeqCollection.h"
#include "AliITSUSimulation.h"
#include "AliITSUSDigit.h"
#include "AliITSUChip.h"
#include "AliITSUParamList.h"
using namespace TMath;

ClassImp(AliITSUSimulation)

//______________________________________________________________________
AliITSUSimulation::AliITSUSimulation()
:  fSeg(0)
  ,fCalibDead(0)
  ,fCalibNoisy(0)
  ,fSensMap(0)
  ,fSimuParam(0)
  ,fResponseParam(0)
  ,fChip(0)
  ,fReadOutCycleOffset(0)
  ,fReadOutCycleLength(25e-6)  
  ,fEvent(0)
  ,fDebug(0)
{
    // Default constructor
}
//______________________________________________________________________
AliITSUSimulation::AliITSUSimulation(AliITSUSimuParam* sim,AliITSUSensMap* map)
  :fSeg(0)
  ,fCalibDead(0)
  ,fCalibNoisy(0)
  ,fSensMap(map)
  ,fSimuParam(sim)
  ,fResponseParam(0)
  ,fChip(0)
  ,fReadOutCycleOffset(0)
  ,fReadOutCycleLength(25e-6)
  ,fEvent(0)
  ,fDebug(0)
{
    // Default constructor
}

//__________________________________________________________________________
AliITSUSimulation::AliITSUSimulation(const AliITSUSimulation &s) 
  :TObject(s)
  ,fSeg(s.fSeg)
  ,fCalibDead(s.fCalibDead)
  ,fCalibNoisy(s.fCalibNoisy)
  ,fSensMap(s.fSensMap)
  ,fSimuParam(s.fSimuParam)   
  ,fResponseParam(s.fResponseParam)
  ,fChip(s.fChip)
  ,fReadOutCycleOffset(s.fReadOutCycleOffset)
  ,fReadOutCycleLength(s.fReadOutCycleLength)
  ,fEvent(s.fEvent)
  ,fDebug(s.fDebug)
{
  //     Copy Constructor 
}

//_________________________________________________________________________
AliITSUSimulation&  AliITSUSimulation::operator=(const AliITSUSimulation &s)
{
  //    Assignment operator
  if(&s == this) return *this;
  fSeg       = s.fSeg;
  fCalibDead = s.fCalibDead;
  fCalibNoisy= s.fCalibNoisy;
  fSensMap   = s.fSensMap;
  fSimuParam = s.fSimuParam;
  fResponseParam = s.fResponseParam;
  fChip    = s.fChip;
  fReadOutCycleOffset = s.fReadOutCycleOffset;
  fReadOutCycleLength = s.fReadOutCycleLength;
  fEvent     = s.fEvent;
  return *this;
}

//______________________________________________________________________
void AliITSUSimulation::InitSimulationChip(AliITSUChip* mod, Int_t event, AliITSsegmentation* seg, AliITSUParamList* resp)
{
  //  This function creates maps to build the list of tracks for each
  //  summable digit. Inputs defined by base class.
  //
  SetChip(mod);
  SetSegmentation(seg);
  SetResponseParam(resp);
  ClearMap();
  memset(fCyclesID,0,(1+2*kMaxROCycleAccept)*sizeof(Bool_t));
  //
  SetEvent(event);
  
}

//______________________________________________________________________
Bool_t AliITSUSimulation::AddSDigitsToChip(TSeqCollection *pItemArr,Int_t mask )
{
  // Add Summable digits to chip maps.
  // Inputs:
  //    pItemArr  Array of AliITSpListItems (SDigits).
  //    mask    Track number off set value 
  //
  Int_t nItems = pItemArr->GetEntries();
  Bool_t sig = kFALSE;
  // 
  for( Int_t i=0; i<nItems; i++ ) {
    AliITSUSDigit * pItem = (AliITSUSDigit *)(pItemArr->At( i ));
    if(pItem->GetChip() != int(fChip->GetIndex()) ) AliFatal(Form("SDigits chip %d != current chip %d: exit", pItem->GetChip(),fChip->GetIndex()));
    if(pItem->GetSumSignal()>0.0 ) sig = kTRUE;
    AliITSUSDigit* oldItem = (AliITSUSDigit*)fSensMap->GetItem(pItem);
    if (!oldItem) {
      oldItem = (AliITSUSDigit*)fSensMap->RegisterItem( new(fSensMap->GetFree()) AliITSUSDigit(*pItem) );
      if (mask) oldItem->ShiftIndices(mask);
    }
    else oldItem->AddTo(mask, pItem);
  }
  return sig;
}

//______________________________________________________________________
void AliITSUSimulation::UpdateMapSignal(UInt_t col,UInt_t row,Int_t trk,Int_t ht,Double_t signal, Int_t roCycle) 
{
  // update map with new hit
  // Note: roCycle can be anything between -kMaxROCycleAccept : kMaxROCycleAccept
  if (Abs(roCycle)>kMaxROCycleAccept) {
    AliError(Form("CycleID %d is outside of allowed +-%d range",roCycle,kMaxROCycleAccept));
    return;
  }
  UInt_t ind = fSensMap->GetIndex(col,row,roCycle);
  AliITSUSDigit* oldItem = (AliITSUSDigit*)fSensMap->GetItem(ind);  
  if (!oldItem) {    
    fSensMap->RegisterItem( new(fSensMap->GetFree()) AliITSUSDigit(trk,ht,fChip->GetIndex(),ind,signal,roCycle) );
    fCyclesID[roCycle+kMaxROCycleAccept] = kTRUE;
  }
  else oldItem->AddSignal(trk,ht,signal);
  //
}

//______________________________________________________________________
void AliITSUSimulation::UpdateMapNoise(UInt_t col,UInt_t row,Double_t noise, Int_t roCycle) 
{
  // update map with new hit
  if (Abs(roCycle)>kMaxROCycleAccept) {
    AliError(Form("CycleID %d is outside of allowed +-%d range",roCycle,kMaxROCycleAccept));
    return;
  }
  UInt_t ind = fSensMap->GetIndex(col,row,roCycle);
  AliITSUSDigit* oldItem = (AliITSUSDigit*)fSensMap->GetItem(ind);
  if (!oldItem) {
    fSensMap->RegisterItem( new(fSensMap->GetFree()) AliITSUSDigit(fChip->GetIndex(),ind,noise,roCycle) );
    fCyclesID[roCycle+kMaxROCycleAccept] = kTRUE;
  }
  else oldItem->AddNoise(noise);
}

//______________________________________________________________________
Int_t AliITSUSimulation::GenOrderedSample(UInt_t nmax,UInt_t ngen,TArrayI &vals,TArrayI &indx)
{
  // generate random sample [0:nmax] of ngen variables, and fill orreder indices 
  // return actual number of generated values 
  if (vals.GetSize()<(int)ngen) vals.Set(ngen);
  if (indx.GetSize()<(int)ngen) indx.Set(ngen);
  int* valA = vals.GetArray();
  int* indA = indx.GetArray();
  if (ngen>=nmax) {
    ngen = nmax-1;
    for (int i=(int)ngen;i--;) {valA[i]=indA[i]=i;}
    return ngen;
  }
  Bool_t rep;
  for (int i=0;i<(int)ngen;i++) {
    do { // exclude repetitions
      rep = kFALSE;
      valA[i] = gRandom->Rndm()*nmax;
      for (int j=i;j--;) if (valA[j]==valA[i]) {rep=kTRUE;break;}
    } while(rep);
  }
  Sort((int)ngen,valA,indA,kFALSE);
  return ngen;
}

//______________________________________________________________________
Double_t AliITSUSimulation::GenerateReadOutCycleOffset()
{
  // Generate randomly the strobe
  // phase w.r.t to the LHC clock
  return fReadOutCycleOffset = fReadOutCycleLength*gRandom->Rndm();
  // fReadOutCycleOffset = 25e-9*gRandom->Rndm(); // clm: I think this way we shift too much 10-30 us! The global shift should be between the BCs?!
  // RS: 25 ns is too small number, the staggering will not work. Let's at the moment keep fully random shift (still, no particle from correct
  // collision will be lost) untill real number is specified
 //
}
 AliITSUSimulation.cxx:1
 AliITSUSimulation.cxx:2
 AliITSUSimulation.cxx:3
 AliITSUSimulation.cxx:4
 AliITSUSimulation.cxx:5
 AliITSUSimulation.cxx:6
 AliITSUSimulation.cxx:7
 AliITSUSimulation.cxx:8
 AliITSUSimulation.cxx:9
 AliITSUSimulation.cxx:10
 AliITSUSimulation.cxx:11
 AliITSUSimulation.cxx:12
 AliITSUSimulation.cxx:13
 AliITSUSimulation.cxx:14
 AliITSUSimulation.cxx:15
 AliITSUSimulation.cxx:16
 AliITSUSimulation.cxx:17
 AliITSUSimulation.cxx:18
 AliITSUSimulation.cxx:19
 AliITSUSimulation.cxx:20
 AliITSUSimulation.cxx:21
 AliITSUSimulation.cxx:22
 AliITSUSimulation.cxx:23
 AliITSUSimulation.cxx:24
 AliITSUSimulation.cxx:25
 AliITSUSimulation.cxx:26
 AliITSUSimulation.cxx:27
 AliITSUSimulation.cxx:28
 AliITSUSimulation.cxx:29
 AliITSUSimulation.cxx:30
 AliITSUSimulation.cxx:31
 AliITSUSimulation.cxx:32
 AliITSUSimulation.cxx:33
 AliITSUSimulation.cxx:34
 AliITSUSimulation.cxx:35
 AliITSUSimulation.cxx:36
 AliITSUSimulation.cxx:37
 AliITSUSimulation.cxx:38
 AliITSUSimulation.cxx:39
 AliITSUSimulation.cxx:40
 AliITSUSimulation.cxx:41
 AliITSUSimulation.cxx:42
 AliITSUSimulation.cxx:43
 AliITSUSimulation.cxx:44
 AliITSUSimulation.cxx:45
 AliITSUSimulation.cxx:46
 AliITSUSimulation.cxx:47
 AliITSUSimulation.cxx:48
 AliITSUSimulation.cxx:49
 AliITSUSimulation.cxx:50
 AliITSUSimulation.cxx:51
 AliITSUSimulation.cxx:52
 AliITSUSimulation.cxx:53
 AliITSUSimulation.cxx:54
 AliITSUSimulation.cxx:55
 AliITSUSimulation.cxx:56
 AliITSUSimulation.cxx:57
 AliITSUSimulation.cxx:58
 AliITSUSimulation.cxx:59
 AliITSUSimulation.cxx:60
 AliITSUSimulation.cxx:61
 AliITSUSimulation.cxx:62
 AliITSUSimulation.cxx:63
 AliITSUSimulation.cxx:64
 AliITSUSimulation.cxx:65
 AliITSUSimulation.cxx:66
 AliITSUSimulation.cxx:67
 AliITSUSimulation.cxx:68
 AliITSUSimulation.cxx:69
 AliITSUSimulation.cxx:70
 AliITSUSimulation.cxx:71
 AliITSUSimulation.cxx:72
 AliITSUSimulation.cxx:73
 AliITSUSimulation.cxx:74
 AliITSUSimulation.cxx:75
 AliITSUSimulation.cxx:76
 AliITSUSimulation.cxx:77
 AliITSUSimulation.cxx:78
 AliITSUSimulation.cxx:79
 AliITSUSimulation.cxx:80
 AliITSUSimulation.cxx:81
 AliITSUSimulation.cxx:82
 AliITSUSimulation.cxx:83
 AliITSUSimulation.cxx:84
 AliITSUSimulation.cxx:85
 AliITSUSimulation.cxx:86
 AliITSUSimulation.cxx:87
 AliITSUSimulation.cxx:88
 AliITSUSimulation.cxx:89
 AliITSUSimulation.cxx:90
 AliITSUSimulation.cxx:91
 AliITSUSimulation.cxx:92
 AliITSUSimulation.cxx:93
 AliITSUSimulation.cxx:94
 AliITSUSimulation.cxx:95
 AliITSUSimulation.cxx:96
 AliITSUSimulation.cxx:97
 AliITSUSimulation.cxx:98
 AliITSUSimulation.cxx:99
 AliITSUSimulation.cxx:100
 AliITSUSimulation.cxx:101
 AliITSUSimulation.cxx:102
 AliITSUSimulation.cxx:103
 AliITSUSimulation.cxx:104
 AliITSUSimulation.cxx:105
 AliITSUSimulation.cxx:106
 AliITSUSimulation.cxx:107
 AliITSUSimulation.cxx:108
 AliITSUSimulation.cxx:109
 AliITSUSimulation.cxx:110
 AliITSUSimulation.cxx:111
 AliITSUSimulation.cxx:112
 AliITSUSimulation.cxx:113
 AliITSUSimulation.cxx:114
 AliITSUSimulation.cxx:115
 AliITSUSimulation.cxx:116
 AliITSUSimulation.cxx:117
 AliITSUSimulation.cxx:118
 AliITSUSimulation.cxx:119
 AliITSUSimulation.cxx:120
 AliITSUSimulation.cxx:121
 AliITSUSimulation.cxx:122
 AliITSUSimulation.cxx:123
 AliITSUSimulation.cxx:124
 AliITSUSimulation.cxx:125
 AliITSUSimulation.cxx:126
 AliITSUSimulation.cxx:127
 AliITSUSimulation.cxx:128
 AliITSUSimulation.cxx:129
 AliITSUSimulation.cxx:130
 AliITSUSimulation.cxx:131
 AliITSUSimulation.cxx:132
 AliITSUSimulation.cxx:133
 AliITSUSimulation.cxx:134
 AliITSUSimulation.cxx:135
 AliITSUSimulation.cxx:136
 AliITSUSimulation.cxx:137
 AliITSUSimulation.cxx:138
 AliITSUSimulation.cxx:139
 AliITSUSimulation.cxx:140
 AliITSUSimulation.cxx:141
 AliITSUSimulation.cxx:142
 AliITSUSimulation.cxx:143
 AliITSUSimulation.cxx:144
 AliITSUSimulation.cxx:145
 AliITSUSimulation.cxx:146
 AliITSUSimulation.cxx:147
 AliITSUSimulation.cxx:148
 AliITSUSimulation.cxx:149
 AliITSUSimulation.cxx:150
 AliITSUSimulation.cxx:151
 AliITSUSimulation.cxx:152
 AliITSUSimulation.cxx:153
 AliITSUSimulation.cxx:154
 AliITSUSimulation.cxx:155
 AliITSUSimulation.cxx:156
 AliITSUSimulation.cxx:157
 AliITSUSimulation.cxx:158
 AliITSUSimulation.cxx:159
 AliITSUSimulation.cxx:160
 AliITSUSimulation.cxx:161
 AliITSUSimulation.cxx:162
 AliITSUSimulation.cxx:163
 AliITSUSimulation.cxx:164
 AliITSUSimulation.cxx:165
 AliITSUSimulation.cxx:166
 AliITSUSimulation.cxx:167
 AliITSUSimulation.cxx:168
 AliITSUSimulation.cxx:169
 AliITSUSimulation.cxx:170
 AliITSUSimulation.cxx:171
 AliITSUSimulation.cxx:172
 AliITSUSimulation.cxx:173
 AliITSUSimulation.cxx:174
 AliITSUSimulation.cxx:175
 AliITSUSimulation.cxx:176
 AliITSUSimulation.cxx:177
 AliITSUSimulation.cxx:178
 AliITSUSimulation.cxx:179
 AliITSUSimulation.cxx:180
 AliITSUSimulation.cxx:181
 AliITSUSimulation.cxx:182
 AliITSUSimulation.cxx:183
 AliITSUSimulation.cxx:184
 AliITSUSimulation.cxx:185
 AliITSUSimulation.cxx:186
 AliITSUSimulation.cxx:187
 AliITSUSimulation.cxx:188
 AliITSUSimulation.cxx:189
 AliITSUSimulation.cxx:190
 AliITSUSimulation.cxx:191
 AliITSUSimulation.cxx:192
 AliITSUSimulation.cxx:193
 AliITSUSimulation.cxx:194
 AliITSUSimulation.cxx:195
 AliITSUSimulation.cxx:196
 AliITSUSimulation.cxx:197
 AliITSUSimulation.cxx:198
 AliITSUSimulation.cxx:199
 AliITSUSimulation.cxx:200
 AliITSUSimulation.cxx:201
 AliITSUSimulation.cxx:202
 AliITSUSimulation.cxx:203
 AliITSUSimulation.cxx:204
 AliITSUSimulation.cxx:205
 AliITSUSimulation.cxx:206
 AliITSUSimulation.cxx:207
 AliITSUSimulation.cxx:208
 AliITSUSimulation.cxx:209
 AliITSUSimulation.cxx:210