X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=EMCAL%2FAliEMCALDigit.cxx;h=8d7bc452b7b0081659d0fd006708bd976a7fa73b;hb=c6b4faccf3c290eecf7a2f1a710d4afa76963fb7;hp=49ecc78f3cb4bef985a27306aa8649492f5e811c;hpb=61e0abb5c9bbd6e578ed6769602e4d9bb80ba13e;p=u%2Fmrichter%2FAliRoot.git diff --git a/EMCAL/AliEMCALDigit.cxx b/EMCAL/AliEMCALDigit.cxx index 49ecc78f3cb..8d7bc452b7b 100644 --- a/EMCAL/AliEMCALDigit.cxx +++ b/EMCAL/AliEMCALDigit.cxx @@ -16,99 +16,231 @@ /* $Id$ */ //_________________________________________________________________________ -// EMCAL digit: Id -// energy -// 3 identifiers for the primary particle(s) at the origine of the digit -// The digits are made in FinishEvent() by summing all the hits in a single EMCAL crystal or PPSD gas cell -// It would be nice to replace the 3 identifiers by an array, but, because digits are kept in a TClonesQArray, -// it is not possible to stream such an array... (beyond my understqnding!) +// EMCAL digit: +// A Digit is the sum of the energy lost in an EMCAL Tower +// It also stores information on Primary, and enterring particle +// tracknumbers Digits are created using AliEMCALSDigitizer, followed +// by AliEMCALDigitizer // -//*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH) - +//*-- Author: Sahal Yacoob (LBL) +// based on : AliPHOSDigit +//__________________________________________________________________________ // --- ROOT system --- +#include +#include // --- Standard library --- -#include - // --- AliRoot header files --- #include "AliEMCALDigit.h" - +#include "AliEMCALGeometry.h" +#include "AliLog.h" ClassImp(AliEMCALDigit) //____________________________________________________________________________ - AliEMCALDigit::AliEMCALDigit() +AliEMCALDigit::AliEMCALDigit() : +AliDigitNew(), + fAmpFloat(0.), + fNSamples(0), + fSamples(0x0), + fNSamplesHG(0), + fSamplesHG(0x0), + fNprimary(0), + fNMaxPrimary(5), + fPrimary(0x0), + fDEPrimary(0x0), + fNiparent(0), + fNMaxiparent(5), + fIparent(0x0), + fDEParent(0x0), + fMaxIter(0), + fTime(0.), + fTimeR(0.), + fChi2(0.), + fNDF(0), + fDigitType(kUnknown), + fAmpCalib(-1) { // default ctor - fIndexInList = -1 ; - fNprimary = 0 ; - fNMaxPrimary = 5 ; - fNiparent = 0 ; - fNMaxiparent = fNMaxPrimary*10; + // Need to initialise for reading old files + fPrimary = new Int_t[fNMaxPrimary] ; + fDEPrimary = new Float_t[fNMaxPrimary] ; + fIparent = new Int_t[fNMaxiparent] ; + fDEParent = new Float_t[fNMaxiparent] ; + for ( Int_t i = 0; i < fNMaxPrimary ; i++) { + fPrimary[i] = -1 ; + fDEPrimary[i] = 0 ; + } + + for ( Int_t i = 0; i < fNMaxiparent ; i++) { + fIparent[i] = -1 ; + fDEParent[i] = 0 ; + } } //____________________________________________________________________________ -AliEMCALDigit::AliEMCALDigit(Int_t primary, Int_t iparent, Int_t id, Int_t DigEnergy, Int_t index) +AliEMCALDigit::AliEMCALDigit(Int_t primary, Int_t iparent, Int_t id, Float_t digEnergy, Float_t time, Int_t type, Int_t index, Float_t chi2, Int_t ndf, Float_t dE) + : AliDigitNew(), + fAmpFloat(digEnergy), + fNSamples(0), + fSamples(0x0), + fNSamplesHG(0), + fSamplesHG(0x0), + fNprimary(0), + fNMaxPrimary(25), + fPrimary(0x0), + fDEPrimary(0x0), + fNiparent(0), + fNMaxiparent(150), + fIparent(0x0), + fDEParent(0x0), + fMaxIter(5), + fTime(time), + fTimeR(time), + fChi2(chi2), + fNDF(ndf), + fDigitType(type), + fAmpCalib(-1) { // ctor with all data - fNMaxPrimary = 5 ; - fNMaxiparent = fNMaxPrimary*10; - fAmp = DigEnergy ; + // data memebrs of the base class (AliNewDigit) + fAmp = 0; fId = id ; fIndexInList = index ; + + // data member + fPrimary = new Int_t[fNMaxPrimary] ; + fDEPrimary = new Float_t[fNMaxPrimary] ; + fIparent = new Int_t[fNMaxiparent] ; + fDEParent = new Float_t[fNMaxiparent] ; if( primary != -1){ fNprimary = 1 ; - fPrimary[0] = primary ; + fPrimary[0] = primary ; + fDEPrimary[0] = dE ; fNiparent = 1 ; fIparent[0] = iparent ; - + fDEParent[0] = dE ; } else{ //If the contribution of this primary smaller than fDigitThreshold (AliEMCALv1) fNprimary = 0 ; fPrimary[0] = -1 ; + fDEPrimary[0] = 0 ; fNiparent = 0 ; - fIparent[0] = -1 ; - + fIparent[0] = -1 ; + fDEParent[0] = 0 ; } Int_t i ; - for ( i = 1; i < fNMaxPrimary ; i++) + for ( i = 1; i < fNMaxPrimary ; i++) { fPrimary[i] = -1 ; + fDEPrimary[i] = 0 ; + } - for ( Int_t j =1; j< fNMaxiparent ; j++) - fIparent[j] = -1 ; + for ( i = 1; i< fNMaxiparent ; i++) { + fIparent[i] = -1 ; + fDEParent[i] = 0 ; + } } //____________________________________________________________________________ AliEMCALDigit::AliEMCALDigit(const AliEMCALDigit & digit) + : AliDigitNew(digit), + fAmpFloat(digit.fAmpFloat), + fNSamples(digit.fNSamples), + fSamples(), + fNSamplesHG(digit.fNSamplesHG), + fSamplesHG(), + fNprimary(digit.fNprimary), + fNMaxPrimary(digit.fNMaxPrimary), + fPrimary(), + fDEPrimary(), + fNiparent(digit.fNiparent), + fNMaxiparent(digit.fNMaxiparent), + fIparent(), + fDEParent(), + fMaxIter(digit.fMaxIter), + fTime(digit.fTime), + fTimeR(digit.fTimeR), + fChi2(digit.fChi2), + fNDF(digit.fNDF), + fDigitType(digit.fDigitType), + fAmpCalib(digit.fAmpCalib) { // copy ctor - - - fNMaxPrimary = digit.fNMaxPrimary ; - fNMaxiparent = digit.fNMaxiparent ; - Int_t i ; - for ( i = 0; i < fNMaxPrimary ; i++) - fPrimary[i] = digit.fPrimary[i] ; - Int_t j ; - for (j = 0; j< fNMaxiparent ; j++) - fIparent[j] = digit.fIparent[j] ; + // data memebrs of the base class (AliNewDigit) fAmp = digit.fAmp ; fId = digit.fId; fIndexInList = digit.fIndexInList ; - fNprimary = digit.fNprimary ; - fNiparent = digit.fNiparent ; + + // data members + if (fSamples ) delete [] fSamples ; fSamples = NULL ; + if (fSamplesHG ) delete [] fSamplesHG ; fSamplesHG = NULL ; + if (fPrimary ) delete [] fPrimary ; fPrimary = NULL ; + if (fDEPrimary) delete [] fDEPrimary ; fDEPrimary = NULL ; + if (fIparent ) delete [] fIparent ; fIparent = NULL ; + if (fDEParent) delete [] fDEParent ; fDEParent = NULL ; + + if (fNSamples){ + fSamples = new Int_t[fNSamples]; + for (Int_t i=0; i < digit.fNSamples; i++) fSamples[i] = digit.fSamples[i]; + } + + if (fNSamplesHG){ + fSamplesHG = new Int_t[fNSamplesHG]; + for (Int_t i=0; i < digit.fNSamplesHG; i++) fSamplesHG[i] = digit.fSamplesHG[i]; + } + + + if (fNMaxPrimary){ + fPrimary = new Int_t [fNMaxPrimary] ; + fDEPrimary = new Float_t[fNMaxPrimary] ; + for ( Int_t i = 0; i < fNMaxPrimary ; i++) { + fPrimary[i] = digit.fPrimary[i] ; + fDEPrimary[i] = digit.fDEPrimary[i] ; + } + } + + if (fNMaxiparent){ + fIparent = new Int_t [fNMaxiparent] ; + fDEParent = new Float_t[fNMaxiparent] ; + for (Int_t j = 0; j< fNMaxiparent ; j++) { + fIparent[j] = digit.fIparent[j] ; + fDEParent[j] = digit.fDEParent[j] ; + } + } + } //____________________________________________________________________________ AliEMCALDigit::~AliEMCALDigit() { - // Delete array of primiries if any - + // Delete array of primaries if any + + if (fSamples ) delete [] fSamples ; fSamples = NULL ; + if (fSamplesHG ) delete [] fSamplesHG ; fSamplesHG = NULL ; + if (fPrimary ) delete [] fPrimary ; fPrimary = NULL ; + if (fDEPrimary) delete [] fDEPrimary ; fDEPrimary = NULL ; + if (fIparent ) delete [] fIparent ; fIparent = NULL ; + if (fDEParent) delete [] fDEParent ; fDEParent = NULL ; + +} + + +//____________________________________________________________________________ +void AliEMCALDigit::Clear(const Option_t*) +{ + // Delete array of primaries if any + if (fSamples ) delete [] fSamples ; fSamples = NULL ; + if (fSamplesHG ) delete [] fSamplesHG ; fSamplesHG = NULL ; + if (fPrimary ) delete [] fPrimary ; fPrimary = NULL ; + if (fDEPrimary) delete [] fDEPrimary ; fDEPrimary = NULL ; + if (fIparent ) delete [] fIparent ; fIparent = NULL ; + if (fDEParent) delete [] fDEParent ; fDEParent = NULL ; + } //____________________________________________________________________________ @@ -117,7 +249,7 @@ Int_t AliEMCALDigit::Compare(const TObject * obj) const // Compares two digits with respect to its Id // to sort according increasing Id - Int_t rv ; + Int_t rv = 2 ; AliEMCALDigit * digit = (AliEMCALDigit *)obj ; @@ -134,16 +266,106 @@ Int_t AliEMCALDigit::Compare(const TObject * obj) const } +//____________________________________________________________________________ +Float_t AliEMCALDigit::GetEta() const +{ + //return pseudorapidity for this digit + // should be change in EMCALGeometry - 19-nov-04 + Float_t eta=-10., phi=-10.; + Int_t id = GetId(); + const AliEMCALGeometry *g = AliEMCALGeometry::GetInstance(); + g->EtaPhiFromIndex(id,eta,phi); + return eta ; +} + +//____________________________________________________________________________ +Float_t AliEMCALDigit::GetPhi() const +{ + //return phi coordinate of digit + // should be change in EMCALGeometry - 19-nov-04 + Float_t eta=-10., phi=-10.; + Int_t id = GetId(); + const AliEMCALGeometry *g = AliEMCALGeometry::GetInstance(); + g->EtaPhiFromIndex(id,eta,phi); + return phi ; +} + +//____________________________________________________________________________ +Bool_t AliEMCALDigit::GetFALTROSample(const Int_t iSample, Int_t& timeBin, Int_t& amp) const +{ + //Get FALTRO sample in time bin iSample + if (iSample >= fNSamples || iSample < 0 || fDigitType==kTrigger) return kFALSE; + + amp = fSamples[iSample] & 0xFFF; + timeBin = (fSamples[iSample] >> 12) & 0xFF; + + return kTRUE; +} +//____________________________________________________________________________ +Bool_t AliEMCALDigit::GetALTROSampleLG(const Int_t iSample, Int_t& timeBin, Int_t& amp) const +{ + //Get Low Gain ALTRO sample in time bin iSample + if (iSample >= fNSamples || iSample < 0 || fDigitType==kLG) return kFALSE; + + amp = fSamples[iSample] & 0xFFF; + timeBin = (fSamples[iSample] >> 12) & 0xFF; + + return kTRUE; +} + +//____________________________________________________________________________ +void AliEMCALDigit::SetALTROSamplesLG(const Int_t nSamples, Int_t *samples) +{ + //Set array of ALTRO samples, Low Gain or FALTRO + fNSamples = nSamples; + fSamples = new Int_t[fNSamples]; + for (Int_t i=0; i < fNSamples; i++) fSamples[i] = samples[i]; +} + +//____________________________________________________________________________ +void AliEMCALDigit::SetALTROSamplesHG(const Int_t nSamples, Int_t *samples) +{ + //Set array of ALTRO samples, High Gain. + fNSamplesHG = nSamples; + fSamplesHG = new Int_t[fNSamplesHG]; + for (Int_t i=0; i < fNSamplesHG; i++) fSamplesHG[i] = samples[i]; +} + + +//____________________________________________________________________________ +Bool_t AliEMCALDigit::GetALTROSampleHG(const Int_t iSample, Int_t& timeBin, Int_t& amp) const +{ + //Get High Gain ALTRO sample in time bin iSample + if (iSample >= fNSamplesHG || iSample < 0 || fDigitType==kHG) return kFALSE; + + amp = fSamplesHG[iSample] & 0xFFF; + timeBin = (fSamplesHG[iSample] >> 12) & 0xFF; + + return kTRUE; +} + + //____________________________________________________________________________ Int_t AliEMCALDigit::GetPrimary(Int_t index) const { // retrieves the primary particle number given its index in the list - Int_t rv = -1 ; - if ( index <= fNprimary ){ - rv = fPrimary[index-1] ; + if ( (index <= fNprimary) && (index > 0)){ + return fPrimary[index-1] ; } - return rv ; + return -1 ; +} + +//____________________________________________________________________________ +Float_t AliEMCALDigit::GetDEPrimary(Int_t index) const +{ + // retrieves the primary particle energy contribution + // given its index in the list + if ( (index <= fNprimary) && (index > 0)){ + return fDEPrimary[index-1] ; + } + + return 0 ; } @@ -151,25 +373,103 @@ Int_t AliEMCALDigit::GetPrimary(Int_t index) const Int_t AliEMCALDigit::GetIparent(Int_t index) const { // retrieves the primary particle number given its index in the list - Int_t rv = -1 ; - if ( index <= fNiparent ){ - rv = fIparent[index-1] ; + if ( index <= fNiparent && index > 0){ + return fIparent[index-1] ; } - return rv ; + return -1 ; } +//____________________________________________________________________________ +Float_t AliEMCALDigit::GetDEParent(Int_t index) const +{ + // retrieves the parent particle energy contribution + // given its index in the list + if ( (index <= fNiparent) && (index > 0)){ + return fDEParent[index-1] ; + } + + return 0; +} //____________________________________________________________________________ void AliEMCALDigit::ShiftPrimary(Int_t shift){ - //shifts primary nimber to BIG offset, to separate primary in different TreeK + //shifts primary number to BIG offset, to separate primary in different TreeK Int_t index ; for(index = 0; index digit.fTime) + fTime = digit.fTime ; + if (digit.fTimeR < fTimeR) + fTimeR = digit.fTimeR ; Int_t max1 = fNprimary ; Int_t max2 = fNiparent ; Int_t index ; - for (index = 0 ; index < digit.fNprimary ; index++){ - Bool_t deja = kTRUE ; + for (index = 0 ; index < digit.fNprimary ; index++){ + Bool_t newPrim = kTRUE ; Int_t old ; - for ( old = 0 ; (old < max1) && deja; old++) { //already have this primary? - if(fPrimary[old] == (digit.fPrimary)[index]) - deja = kFALSE; + for ( old = 0 ; (old < max1) && newPrim; old++) { //already have this primary? + if(fPrimary[old] == digit.fPrimary[index]) { + newPrim = kFALSE; + fDEPrimary[old] += digit.fDEPrimary[index]; + } } - if(deja){ - fPrimary[fNprimary] = (digit.fPrimary)[index] ; - fNprimary++ ; - if(fNprimary>fNMaxPrimary) { - cout << "AliEMCALDigit >> Increase NMaxPrimary "<< endl ; - return *this ; + if (newPrim) { + if(max1fNMaxiparent) { - cout << "AliEMCALDigit >> Increase NMaxiparent "<< endl ; - return *this ; + if(newParent){ + if(max2(fAmp) ; + //tempo *= factor ; + //fAmp = static_cast(TMath::Floor(tempo)) ; + + fAmpFloat *= factor; + for (Int_t i=0; i < fNSamples ; i++) fSamples[i] = Int_t(factor*fSamples[i]); + for (Int_t i=0; i < fNSamplesHG; i++) fSamplesHG[i] = Int_t(factor*fSamplesHG[i]); + + for(Int_t i=0; i < fNprimary; i++) + fDEPrimary[i] *= factor; + for(Int_t i=0; i < fNiparent; i++) + fDEParent[i] *= factor; + + return *this ; +} + //____________________________________________________________________________ ostream& operator << ( ostream& out , const AliEMCALDigit & digit) { // Prints the data of the digit - out << "ID " << digit.fId << " Energy = " << digit.fAmp << endl ; - Int_t i,j ; - for(i=0;i