| 1 | /************************************************************************** |
| 2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
| 3 | * * |
| 4 | * Author: The ALICE Off-line Project. * |
| 5 | * Contributors are mentioned in the code where appropriate. * |
| 6 | * * |
| 7 | * Permission to use, copy, modify and distribute this software and its * |
| 8 | * documentation strictly for non-commercial purposes is hereby granted * |
| 9 | * without fee, provided that the above copyright notice appears in all * |
| 10 | * copies and that both the copyright notice and this permission notice * |
| 11 | * appear in the supporting documentation. The authors make no claims * |
| 12 | * about the suitability of this software for any purpose. It is * |
| 13 | * provided "as is" without express or implied warranty. * |
| 14 | **************************************************************************/ |
| 15 | |
| 16 | /* $Id: */ |
| 17 | |
| 18 | //_________________________________________________________________________ |
| 19 | // EMCAL digit: |
| 20 | // A Digit is the sum of the energy lost in an EMCAL Tower |
| 21 | // It also stores information on Primary, and enterring particle |
| 22 | // tracknumbers Digits are created using AliEMCALSDigitizer, followed |
| 23 | // by AliEMCALDigitizer |
| 24 | // |
| 25 | //*-- Author: Sahal Yacoob (LBL) |
| 26 | // based on : AliPHOSDigit |
| 27 | //__________________________________________________________________________ |
| 28 | |
| 29 | // --- ROOT system --- |
| 30 | |
| 31 | // --- Standard library --- |
| 32 | |
| 33 | #include <iostream.h> |
| 34 | |
| 35 | // --- AliRoot header files --- |
| 36 | |
| 37 | #include "AliEMCALDigit.h" |
| 38 | #include "AliEMCALGeometry.h" |
| 39 | #include "AliEMCALGetter.h" |
| 40 | |
| 41 | |
| 42 | ClassImp(AliEMCALDigit) |
| 43 | |
| 44 | //____________________________________________________________________________ |
| 45 | AliEMCALDigit::AliEMCALDigit() |
| 46 | { |
| 47 | // default ctor |
| 48 | |
| 49 | fIndexInList = -1 ; |
| 50 | fNprimary = 0 ; |
| 51 | fNMaxPrimary = 5 ; |
| 52 | fNiparent = 0 ; |
| 53 | fNMaxiparent = fNMaxPrimary*10; |
| 54 | fPrimary = new Int_t[fNMaxPrimary] ; |
| 55 | fIparent = new Int_t[fNMaxiparent] ; |
| 56 | } |
| 57 | |
| 58 | //____________________________________________________________________________ |
| 59 | AliEMCALDigit::AliEMCALDigit(Int_t primary, Int_t iparent, Int_t id, Int_t DigEnergy, Float_t time, Int_t index) |
| 60 | { |
| 61 | // ctor with all data |
| 62 | |
| 63 | fNMaxPrimary = 5 ; |
| 64 | fNMaxiparent = fNMaxPrimary*10; |
| 65 | fPrimary = new Int_t[fNMaxPrimary] ; |
| 66 | fIparent = new Int_t[fNMaxiparent] ; |
| 67 | fAmp = DigEnergy ; |
| 68 | fTime = time ; |
| 69 | fId = id ; |
| 70 | fIndexInList = index ; |
| 71 | if( primary != -1){ |
| 72 | fNprimary = 1 ; |
| 73 | fPrimary[0] = primary ; |
| 74 | fNiparent = 1 ; |
| 75 | fIparent[0] = iparent ; |
| 76 | |
| 77 | } |
| 78 | else{ //If the contribution of this primary smaller than fDigitThreshold (AliEMCALv1) |
| 79 | fNprimary = 0 ; |
| 80 | fPrimary[0] = -1 ; |
| 81 | fNiparent = 0 ; |
| 82 | fIparent[0] = -1 ; |
| 83 | |
| 84 | } |
| 85 | Int_t i ; |
| 86 | for ( i = 1; i < fNMaxPrimary ; i++) |
| 87 | fPrimary[i] = -1 ; |
| 88 | |
| 89 | for ( Int_t j =1; j< fNMaxiparent ; j++) |
| 90 | fIparent[j] = -1 ; |
| 91 | } |
| 92 | |
| 93 | //____________________________________________________________________________ |
| 94 | AliEMCALDigit::AliEMCALDigit(const AliEMCALDigit & digit) |
| 95 | { |
| 96 | // copy ctor |
| 97 | |
| 98 | |
| 99 | fNMaxPrimary = digit.fNMaxPrimary ; |
| 100 | fNMaxiparent = digit.fNMaxiparent ; |
| 101 | fPrimary = new Int_t[fNMaxPrimary] ; |
| 102 | fIparent = new Int_t[fNMaxiparent] ; |
| 103 | Int_t i ; |
| 104 | for ( i = 0; i < fNMaxPrimary ; i++) |
| 105 | fPrimary[i] = digit.fPrimary[i] ; |
| 106 | Int_t j ; |
| 107 | for (j = 0; j< fNMaxiparent ; j++) |
| 108 | fIparent[j] = digit.fIparent[j] ; |
| 109 | fAmp = digit.fAmp ; |
| 110 | fTime = digit.fTime ; |
| 111 | fId = digit.fId; |
| 112 | fIndexInList = digit.fIndexInList ; |
| 113 | fNprimary = digit.fNprimary ; |
| 114 | fNiparent = digit.fNiparent ; |
| 115 | } |
| 116 | |
| 117 | //____________________________________________________________________________ |
| 118 | AliEMCALDigit::~AliEMCALDigit() |
| 119 | { |
| 120 | // Delete array of primiries if any |
| 121 | delete [] fPrimary ; |
| 122 | delete [] fIparent ; |
| 123 | } |
| 124 | |
| 125 | //____________________________________________________________________________ |
| 126 | Int_t AliEMCALDigit::Compare(const TObject * obj) const |
| 127 | { |
| 128 | // Compares two digits with respect to its Id |
| 129 | // to sort according increasing Id |
| 130 | |
| 131 | Int_t rv ; |
| 132 | |
| 133 | AliEMCALDigit * digit = (AliEMCALDigit *)obj ; |
| 134 | |
| 135 | Int_t iddiff = fId - digit->GetId() ; |
| 136 | |
| 137 | if ( iddiff > 0 ) |
| 138 | rv = 1 ; |
| 139 | else if ( iddiff < 0 ) |
| 140 | rv = -1 ; |
| 141 | else |
| 142 | rv = 0 ; |
| 143 | |
| 144 | return rv ; |
| 145 | |
| 146 | } |
| 147 | |
| 148 | //____________________________________________________________________________ |
| 149 | const Float_t AliEMCALDigit::GetEta() const |
| 150 | { |
| 151 | Float_t eta=-10., phi=-10.; |
| 152 | AliEMCALGeometry::GetInstance()->EtaPhiFromIndex(fId,eta,phi); |
| 153 | return eta ; |
| 154 | } |
| 155 | |
| 156 | //____________________________________________________________________________ |
| 157 | const Float_t AliEMCALDigit::GetPhi() const |
| 158 | { |
| 159 | Float_t eta=-10., phi=-10.; |
| 160 | AliEMCALGeometry::GetInstance()->EtaPhiFromIndex(fId,eta,phi); |
| 161 | return phi ; |
| 162 | } |
| 163 | |
| 164 | //____________________________________________________________________________ |
| 165 | Int_t AliEMCALDigit::GetPrimary(Int_t index) const |
| 166 | { |
| 167 | // retrieves the primary particle number given its index in the list |
| 168 | Int_t rv = -1 ; |
| 169 | if ( index <= fNprimary && index > 0){ |
| 170 | rv = fPrimary[index-1] ; |
| 171 | } |
| 172 | |
| 173 | return rv ; |
| 174 | |
| 175 | } |
| 176 | |
| 177 | //____________________________________________________________________________ |
| 178 | Int_t AliEMCALDigit::GetIparent(Int_t index) const |
| 179 | { |
| 180 | // retrieves the primary particle number given its index in the list |
| 181 | Int_t rv = -1 ; |
| 182 | if ( index <= fNiparent ){ |
| 183 | rv = fIparent[index-1] ; |
| 184 | } |
| 185 | |
| 186 | return rv ; |
| 187 | |
| 188 | } |
| 189 | |
| 190 | //______________________________________________________________________ |
| 191 | const Bool_t AliEMCALDigit::IsInPreShower() const |
| 192 | { |
| 193 | Bool_t rv = kFALSE ; |
| 194 | const AliEMCALGeometry * geom = AliEMCALGetter::GetInstance()->EMCALGeometry() ; |
| 195 | if( GetId() > (geom->GetNZ() * geom->GetNPhi() )) |
| 196 | rv = kTRUE; |
| 197 | return rv; |
| 198 | } |
| 199 | |
| 200 | //____________________________________________________________________________ |
| 201 | void AliEMCALDigit::ShiftPrimary(Int_t shift){ |
| 202 | //shifts primary nimber to BIG offset, to separate primary in different TreeK |
| 203 | Int_t index ; |
| 204 | for(index = 0; index <fNprimary; index++ ){ |
| 205 | fPrimary[index] = fPrimary[index]+ shift * 10000000 ;} |
| 206 | for(index =0; index <fNiparent; index++){ |
| 207 | fIparent[index] = fIparent[index] + shift * 10000000 ;} |
| 208 | } |
| 209 | //____________________________________________________________________________ |
| 210 | Bool_t AliEMCALDigit::operator==(AliEMCALDigit const & digit) const |
| 211 | { |
| 212 | // Two digits are equal if they have the same Id |
| 213 | |
| 214 | if ( fId == digit.fId ) |
| 215 | return kTRUE ; |
| 216 | else |
| 217 | return kFALSE ; |
| 218 | } |
| 219 | |
| 220 | //____________________________________________________________________________ |
| 221 | AliEMCALDigit& AliEMCALDigit::operator+(AliEMCALDigit const & digit) |
| 222 | { |
| 223 | // Adds the amplitude of digits and completes the list of primary particles |
| 224 | // if amplitude is larger than |
| 225 | |
| 226 | fAmp += digit.fAmp ; |
| 227 | if(fTime > digit.fTime) |
| 228 | fTime = digit.fTime ; |
| 229 | |
| 230 | Int_t max1 = fNprimary ; |
| 231 | Int_t max2 = fNiparent ; |
| 232 | Int_t index ; |
| 233 | for (index = 0 ; index < digit.fNprimary ; index++){ |
| 234 | Bool_t deja = kTRUE ; |
| 235 | Int_t old ; |
| 236 | for ( old = 0 ; (old < max1) && deja; old++) { //already have this primary? |
| 237 | if(fPrimary[old] == (digit.fPrimary)[index]) |
| 238 | deja = kFALSE; |
| 239 | } |
| 240 | if(deja){ |
| 241 | fPrimary[fNprimary] = (digit.fPrimary)[index] ; |
| 242 | fNprimary++ ; |
| 243 | if(fNprimary>fNMaxPrimary) { |
| 244 | cout << "AliEMCALDigit >> Increase NMaxPrimary "<< endl ; |
| 245 | return *this ; |
| 246 | } |
| 247 | } |
| 248 | } |
| 249 | |
| 250 | for (index = 0 ; index < digit.fNiparent ; index++){ |
| 251 | Bool_t dejavu = kTRUE ; |
| 252 | Int_t old ; |
| 253 | for ( old = 0 ; (old < max2) && dejavu; old++) { //already have this primary? |
| 254 | if(fIparent[old] == (digit.fIparent)[index]) |
| 255 | dejavu = kFALSE; |
| 256 | } |
| 257 | if(dejavu){ |
| 258 | fIparent[fNiparent] = (digit.fIparent)[index] ; |
| 259 | fNiparent++ ; |
| 260 | if(fNiparent>fNMaxiparent) { |
| 261 | cout << "AliEMCALDigit >> Increase NMaxiparent "<< endl ; |
| 262 | return *this ; |
| 263 | } |
| 264 | } |
| 265 | } |
| 266 | |
| 267 | return *this ; |
| 268 | } |
| 269 | |
| 270 | //____________________________________________________________________________ |
| 271 | ostream& operator << ( ostream& out , const AliEMCALDigit & digit) |
| 272 | { |
| 273 | // Prints the data of the digit |
| 274 | |
| 275 | out << "ID " << digit.fId << " Energy = " << digit.fAmp << " Time = " << digit.fTime << endl ; |
| 276 | Int_t i,j ; |
| 277 | for(i=0;i<digit.fNprimary;i++) |
| 278 | out << "Primary " << i+1 << " = " << digit.fPrimary[i] << endl ; |
| 279 | |
| 280 | for(j=0;j<digit.fNiparent;j++) |
| 281 | out << "Iparent " << j+1 << " = " << digit.fIparent[j] << endl ; |
| 282 | out << "Position in list = " << digit.fIndexInList << endl ; |
| 283 | return out ; |
| 284 | } |
| 285 | |
| 286 | |