Fix clonesarray for read out errors (Jochen)
[u/mrichter/AliRoot.git] / ITS / AliITSMapA2.cxx
CommitLineData
e8189707 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#include <TH1.h>
17#include <TObjArray.h>
e8189707 18
19#include "AliITSMapA2.h"
20#include "AliITSsegmentation.h"
e8189707 21#include "AliITSdigit.h"
22
766e3066 23////////////////////////////////////////////////////////////////////////
24// Map Class for ITS. Implementation A2. In this implementation, the //
25// 2 dimensional (iz,ix) map is filled with Double precision floating //
26// point values. Since this class is derived for AliITSMapA1 it also //
27// has all of the functionality of that class as well. For each //
28// cell a corresponding TObject, a hit, can also be stored. //
29// The detector geometry is accessed via the that detectors //
30// segmentation class and stored here for conveniance. //
31////////////////////////////////////////////////////////////////////////
e8189707 32
33ClassImp(AliITSMapA2)
34
766e3066 35//______________________________________________________________________
e56160b8 36AliITSMapA2::AliITSMapA2():
37fHitMapD(0),
38fMapThresholdD(0),
39fScaleSizeX(0),
40fScaleSizeZ(0){
766e3066 41 // default constructor
94d90134 42
766e3066 43 fSegmentation = 0;
44 fNpz = 0;
45 fNpx = 0;
46 fMaxIndex = 0;
766e3066 47 fObjects = 0;
48 fNobjects = 0;
e8189707 49}
766e3066 50//______________________________________________________________________
e56160b8 51AliITSMapA2::AliITSMapA2(AliITSsegmentation *seg):
52fHitMapD(0),
53fMapThresholdD(0),
54fScaleSizeX(1),
55fScaleSizeZ(1){
766e3066 56 //constructor
e8189707 57
766e3066 58 fSegmentation = seg;
59 fNpz = fSegmentation->Npz();
60 fNpx = fSegmentation->Npx();
61 fMaxIndex = fNpz*fNpx+fNpx; // 2 halves of detector
645ecce9 62 fHitMapD = new Double_t[fMaxIndex+1];
766e3066 63 fObjects = 0;
64 fNobjects = 0;
65 ClearMap();
e8189707 66}
766e3066 67//______________________________________________________________________
68AliITSMapA2::AliITSMapA2(AliITSsegmentation *seg,
e56160b8 69 Int_t scalesizeX, Int_t scalesizeZ):
70fHitMapD(0),
71fMapThresholdD(0),
72fScaleSizeX(scalesizeX),
73fScaleSizeZ(scalesizeZ){
766e3066 74 //constructor
e8189707 75
766e3066 76 fSegmentation = seg;
766e3066 77 fNpz = fScaleSizeZ*fSegmentation->Npz();
78 fNpx = fScaleSizeX*fSegmentation->Npx();
79 fMaxIndex = fNpz*fNpx+fNpx; // 2 halves of detector
e3df8399 80 fHitMapD = new Double_t[fMaxIndex+1];
766e3066 81 fObjects = 0;
82 fNobjects = 0;
83 ClearMap();
e8189707 84}
766e3066 85//______________________________________________________________________
86AliITSMapA2::AliITSMapA2(AliITSsegmentation *seg, TObjArray *obj,
e56160b8 87 Double_t thresh):
88fHitMapD(0),
89fMapThresholdD(thresh),
90fScaleSizeX(1),
91fScaleSizeZ(1){
766e3066 92 //constructor
e8189707 93
766e3066 94 fNobjects = 0;
766e3066 95 fSegmentation = seg;
96 fNpz = fSegmentation->Npz();
97 fNpx = fSegmentation->Npx();
98 fMaxIndex = fNpz*fNpx+fNpx; // 2 halves of detector
e3df8399 99 fHitMapD = new Double_t[fMaxIndex+1];
766e3066 100 fObjects = obj;
101 if (fObjects) fNobjects = fObjects->GetEntriesFast();
766e3066 102 ClearMap();
e8189707 103}
766e3066 104//______________________________________________________________________
105AliITSMapA2::~AliITSMapA2(){
106 //destructor
e8189707 107
766e3066 108 if (fHitMapD) delete[] fHitMapD;
e8189707 109}
766e3066 110//______________________________________________________________________
e56160b8 111AliITSMapA2::AliITSMapA2(const AliITSMapA2 &source) : AliITSMapA1(source),
112fHitMapD(source.fHitMapD),
113fMapThresholdD(source.fMapThresholdD),
114fScaleSizeX(source.fScaleSizeX),
115fScaleSizeZ(source.fScaleSizeZ){
766e3066 116 // Copy Constructor
e8189707 117
e8189707 118}
766e3066 119//______________________________________________________________________
120AliITSMapA2& AliITSMapA2::operator=(const AliITSMapA2 &source) {
121 // Assignment operator
e56160b8 122 this->~AliITSMapA2();
123 new(this) AliITSMapA2(source);
124 return *this;
e8189707 125
e8189707 126}
e56160b8 127
766e3066 128//______________________________________________________________________
129void AliITSMapA2::ClearMap(){
130 //clear array
e8189707 131
766e3066 132 memset(fHitMapD,0,sizeof(Double_t)*fMaxIndex);
133}
134//______________________________________________________________________
135void AliITSMapA2::FillMap(){
136 // fills signal map from digits - apply a threshold for signal
e8189707 137
766e3066 138 if (!fObjects) return;
139
140 Int_t ndigits = fObjects->GetEntriesFast();
141 if (!ndigits) return;
142
143 AliITSdigit *dig;
144 for (Int_t ndig=0; ndig<ndigits; ndig++) {
145 dig = (AliITSdigit*)fObjects->UncheckedAt(ndig);
ecee53fc 146 Double_t signal = (Double_t)(dig->GetSignal());
147 if (signal > fMapThresholdD) SetHit(dig->GetCoord1(),dig->GetCoord2(),signal);
766e3066 148 } // end for ndig
e8189707 149}
766e3066 150//______________________________________________________________________
766e3066 151void AliITSMapA2::FlagHit(Int_t iz, Int_t ix){
152 //flag an entry
e8189707 153
766e3066 154 fHitMapD[CheckedIndex(iz, ix)]=
155 -1000.*TMath::Abs((Int_t)(fHitMapD[CheckedIndex(iz, ix)])+1.);
e8189707 156}
766e3066 157//______________________________________________________________________
590d15ee 158TObject* AliITSMapA2::GetHit(Int_t i, Int_t dummy) const {
766e3066 159 //return a pointer to the 1D histogram
e8189707 160
ac74f489 161 dummy = 0; // added to remove unused variable warning.
766e3066 162 if (fObjects) {
163 return fObjects->UncheckedAt(i);
164 } else return NULL;
e8189707 165}
766e3066 166//______________________________________________________________________
590d15ee 167Double_t AliITSMapA2::GetSignal(Int_t index) const {
766e3066 168 //get signal in a cell
e8189707 169
766e3066 170 if (index<fMaxIndex) return (index <0) ? 0. : fHitMapD[index];
171 else return 0.;
e8189707 172}
766e3066 173//______________________________________________________________________
174FlagType AliITSMapA2::TestHit(Int_t iz, Int_t ix){
175 // check if the entry has already been flagged
94d90134 176
177 if (CheckedIndex(iz, ix) < 0) return kEmpty;
f50d33af 178 Int_t inf=(Int_t)fHitMapD[CheckedIndex(iz, ix)];
e8189707 179
180 if (inf <= -1000) {
766e3066 181 return kUsed;
e8189707 182 } else if (inf == 0) {
766e3066 183 return kEmpty;
e8189707 184 } else {
766e3066 185 return kUnused;
186 } // end if inf...
e8189707 187}
766e3066 188//______________________________________________________________________
189void AliITSMapA2::FillMapFromHist(){
190 // fills map from 1D histograms
e8189707 191
766e3066 192 if (!fObjects) return;
193
194 // an example
195 for( Int_t i=0; i<fNobjects; i++) {
196 TH1F *hist =(TH1F *)fObjects->UncheckedAt(i);
197 Int_t nsamples = hist->GetNbinsX();
198 for( Int_t j=0; j<nsamples; j++) {
199 Double_t signal = (Double_t)(hist->GetBinContent(j+1));
200 if (signal > fMapThresholdD) SetHit(i,j,signal);
201 } // end for j
202 } // end for i
e8189707 203}
766e3066 204//______________________________________________________________________
205void AliITSMapA2::FillHist(){
206 // fill 1D histograms from map
207
208 if (!fObjects || fScaleSizeX != 1) return;
209
210 // an example
211 for( Int_t i=0; i<fNobjects; i++) {
212 TH1F *hist =(TH1F *)fObjects->UncheckedAt(i);
213 for( Int_t j=0; j<fNpx; j++) {
214 Double_t signal=GetSignal(i,j);
215 if (signal > fMapThresholdD) hist->Fill((Float_t)j,signal);
216 } // end for j
217 } // end for i
e8189707 218}
766e3066 219//______________________________________________________________________
220void AliITSMapA2::ResetHist(){
221 // Reset histograms
222
223 if (!fObjects) return;
224
225 for( Int_t i=0; i<fNobjects; i++) {
226 if ((*fObjects)[i]) ((TH1F*)(*fObjects)[i])->Reset();
227 } // end for i
e8189707 228}
766e3066 229//______________________________________________________________________
230void AliITSMapA2::AddSignal(Int_t iz,Int_t ix,Double_t sig){
231 // Addes sig to cell iz. equivalent to the very common
232 // sig = fMapA2->GetSignal(iz,ix) + sig; fMapA2->SetHit(iz,ix,sig);
e8189707 233
766e3066 234
235 Int_t index=GetHitIndex(iz,ix);
236 if(index<0) return;
237 fHitMapD[CheckedIndex(iz, ix)] += sig;
238}