2 #include "AliITSmoduleSSD.h"
5 ClassImp(AliITSmoduleSSD)
7 //____________________________________________________________________
10 //____________________________________________________________________
14 AliITSmoduleSSD::AliITSmoduleSSD() {
17 //Invalid Strips parameters
19 fInvalidP = new TArrayS(0);
20 fInvalidN = new TArrayS(0);
40 AliITSmoduleSSD::AliITSmoduleSSD(Int_t index) {
44 //Invalid Strips parameters
46 fInvalidP = new TArrayS(0);
47 fInvalidN = new TArrayS(0);
66 AliITSmoduleSSD::~AliITSmoduleSSD() {
68 if (!fInvalidP) delete fInvalidP;
69 if (!fInvalidN) delete fInvalidN;
73 //____________________________________________________________________
75 // Inalid strips menagement
76 //____________________________________________________________________
81 void AliITSmoduleSSD::SetInvalidP(Int_t strip, Bool_t b) {
83 Bool_t already = kFALSE;
86 for (i=0; i<fNInvalidP; i++) {
87 if ((*fInvalidP)[i] == strip) {
94 (*fInvalidP)[fNInvalidP++] = strip;
98 void AliITSmoduleSSD::SetInvalidMC(Float_t m, Float_t s) {
105 void AliITSmoduleSSD::SetInvalidMC() {
107 Int_t m = (Int_t)gRandom->Gaus(fNInvalid, fISigma);
109 for(int i=0; i<m; i++) {
110 SetInvalidP((Int_t)(gRandom->Rndm()*kNStrips), kTRUE);
115 Bool_t AliITSmoduleSSD::IsValidP(Int_t n) {
117 for(Int_t i=0; i<fNInvalidP; i++)
118 if ((*fInvalidP)[i] == n) return kFALSE;
122 Bool_t AliITSmoduleSSD::IsValidN(Int_t n) {
124 for(Int_t i=0; i<fNInvalidN; i++)
125 if ((*fInvalidN)[i] == n) return kFALSE;
130 //____________________________________________________________________
133 //____________________________________________________________________
136 /*********************************************************************
139 * sets paramerers: layer, ladder detector
140 * scan tracks wich produced this digit
141 * creates new SSD DIGTS
142 * call ITS to add digit to its Array
143 * set index frm ITS in its own array
145 * S.Radomski 17.09.1999
147 *********************************************************************/
149 void AliITSmoduleSSD::AddDigit(Int_t strNo, Int_t s, Bool_t p) {
153 AliITSdigit *t = (AliITSdigit*) (new AliITSdigitSSD(tracks, digits,
156 fIdigits->AddAt(((AliITS *)fITS)->AddDigit(t), fNdigits++);
160 //____________________________________________________________________
163 //____________________________________________________________________
168 void AliITSmoduleSSD::HitToDigit() {
170 Int_t i; //for iteration
171 fP = new TArrayI(768);
172 fN = new TArrayI(768);
174 fPtrack1 = new TArrayI(768);
175 fPtrack2 = new TArrayI(768);
176 fPtrack3 = new TArrayI(768);
178 fNtrack1 = new TArrayI(768);
179 fNtrack2 = new TArrayI(768);
180 fNtrack3 = new TArrayI(768);
182 for(i=0; i<kNStrips; i++) {
187 for(i=0; i<fNhitsM; i++) HitToDigit(i);
192 for(i=0; i<fNInvalidP; i++) (*fP)[(*fInvalidP)[i]] = -20;
193 for(i=0; i<fNInvalidN; i++) (*fN)[(*fInvalidN)[i]] = -20;
195 for(i=0; i<kNStrips; i++)
196 if ((*fP)[i]>kTresholdP) AddDigit(i+1, (*fP)[i], kTRUE);
198 for(i=0; i<kNStrips; i++)
199 if ((*fN)[i]>kTresholdN) AddDigit(i+1, (*fN)[i], kFALSE);
216 void AliITSmoduleSSD::HitToDigit(Int_t hitNo) {
218 Int_t stripP, stripN, i;
222 AliITShit *hit = (AliITShit*)((*fHitsM)[hitNo]);
223 Float_t dZ = kZ/kSteps*1000, l;
225 if(hit->GetIonization()==0.0) return;
227 Float_t x = hit->GetXG();
228 Float_t y = hit->GetYG();
230 Float_t dx = 0.0; //TMath::Tan(hit->fTheta)*kZ/kSteps;
231 Float_t dy = 0.0; //TMath::Tan(hit->fPhi)*kZ/kSteps;
232 l = sqrt(dZ*dZ + dx*dx *1000000);
234 x -= (kSteps/2 -1) * dx;
235 y -= (kSteps/2 -1) * dy;
237 for (i=1; i<kSteps; i++) {
239 stripP = GetStripP(x, y);
240 dsP = Get2StripP(x, y);
242 stripN = GetStripN(x, y);
243 dsN = Get2StripN(x, y);
245 EP = gRandom->Landau(fGainP*l, l*10);
246 EN = gRandom->Landau(fGainN*l, l*10);
248 sP = kSigmaP * sqrt(i);
249 sN = kSigmaN * sqrt(kSteps-i);
251 sP = (i<3 && dsP>0.3 && dsP<0.7)? 0.02 : sP;
252 sN = (i>7 && dsN>0.3 && dsN<0.7)? 0.02 : sN;
254 sP = (i==3 && dsP>0.4 && dsP<0.6)? 0.015 : sP;
255 sN = (i==7 && dsN>0.4 && dsN<0.6)? 0.015 : sN;
258 (*fP)[stripP-1]+=(Int_t)(EP*(F(-0.5-dsP,sP)-F(-1.5-dsP,sP)));
259 (*fP)[stripP] +=(Int_t)(EP*(F(0.5-dsP,sP)-F(-0.5-dsP,sP)));
260 (*fP)[stripP+1]+=(Int_t)(EP*(F(1.5-dsP,sP)-F(0.5-dsP,sP)));
261 (*fP)[stripP+2]+=(Int_t)(EP*(F(2.5-dsP,sP)-F(1.5-dsP,sP)));
263 (*fN)[stripN-1]+=(Int_t)(EN*(F(-0.5-dsN,sN)-F(-1.5-dsN,sN)));
264 (*fN)[stripN] +=(Int_t)(EN*(F(0.5-dsN,sN)-F(-0.5-dsN,sN)));
265 (*fN)[stripN+1]+=(Int_t)(EN*(F(1.5-dsN,sN)-F(0.5-dsN,sN)));
266 (*fN)[stripN+2]+=(Int_t)(EN*(F(2.5-dsN,sN)-F(1.5-dsN,sN)));
274 //____________________________________________________________________
276 // Private Methods for Simulation
277 //____________________________________________________________________
282 void AliITSmoduleSSD::ApplyNoise() {
284 for(Int_t i = 0; i<kNStrips; i++) {
285 (*fP)[i] += (Int_t)gRandom->Gaus(0,fSNRatioP);
286 (*fN)[i] += (Int_t)gRandom->Gaus(0,fSNRatioN);
290 void AliITSmoduleSSD::ApplyCoupling() {
292 for(Int_t i = 1; i<kNStrips-1; i++) {
293 (*fP)[i] += (Int_t)((*fP)[i-1]*fCouplingPL + (*fP)[i+1]*fCouplingPR);
294 (*fN)[i] += (Int_t)((*fN)[i-1]*fCouplingNL + (*fN)[i+1]*fCouplingNR);
299 //____________________________________________________________________
301 // Private methods for geometry
302 //____________________________________________________________________
307 Int_t AliITSmoduleSSD::GetStripP(Float_t x, Float_t y) {
309 Float_t X = x - y*kTan;
310 Int_t strip = (Int_t)(X/kPitch);
311 strip = (strip<0)? -1: strip;
312 strip = (strip>kNStrips)? -1: strip;
316 Int_t AliITSmoduleSSD::GetStripN(Float_t x, Float_t y) {
318 Float_t X = x - kTan*(kY - y);
319 Int_t strip = (Int_t)(X/kPitch);
320 strip = (strip<0)? -1: strip;
321 strip = (strip>kNStrips)? -1: strip;
326 Float_t AliITSmoduleSSD::Get2StripP(Float_t x, Float_t y) {
328 Int_t n = GetStripP(x,y);
329 return (x - y*kTan) / kPitch - n;
332 Float_t AliITSmoduleSSD::Get2StripN(Float_t x, Float_t y) {
334 Int_t n = GetStripN(x,y);
335 return (x - kTan*(kY - y)) / kPitch - n;
339 Bool_t AliITSmoduleSSD::GetCrossing (Float_t &P, Float_t &N) {
344 P = (kY * kTan + N + P)/2.0; // x coordinate
345 N = kY - (P-N)/kTan; // y coordinate
347 if (N<0 || N>kY) return kFALSE;
348 if (P<0 || P>kX) return kFALSE;
352 //____________________________________________________________________