1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
21 #include "AliITSmoduleSSD.h"
24 ClassImp(AliITSmoduleSSD)
26 //____________________________________________________________________
29 //____________________________________________________________________
33 AliITSmoduleSSD::AliITSmoduleSSD() {
36 //Invalid Strips parameters
38 fInvalidP = new TArrayS(0);
39 fInvalidN = new TArrayS(0);
59 AliITSmoduleSSD::AliITSmoduleSSD(Int_t index) {
63 //Invalid Strips parameters
65 fInvalidP = new TArrayS(0);
66 fInvalidN = new TArrayS(0);
85 AliITSmoduleSSD::~AliITSmoduleSSD() {
87 if (!fInvalidP) delete fInvalidP;
88 if (!fInvalidN) delete fInvalidN;
92 //____________________________________________________________________
94 // Inalid strips menagement
95 //____________________________________________________________________
100 void AliITSmoduleSSD::SetInvalidP(Int_t strip, Bool_t b) {
102 Bool_t already = kFALSE;
105 for (i=0; i<fNInvalidP; i++) {
106 if ((*fInvalidP)[i] == strip) {
113 (*fInvalidP)[fNInvalidP++] = strip;
117 void AliITSmoduleSSD::SetInvalidMC(Float_t m, Float_t s) {
124 void AliITSmoduleSSD::SetInvalidMC() {
126 Int_t m = (Int_t)gRandom->Gaus(fNInvalid, fISigma);
128 for(int i=0; i<m; i++) {
129 SetInvalidP((Int_t)(gRandom->Rndm()*kNStrips), kTRUE);
134 Bool_t AliITSmoduleSSD::IsValidP(Int_t n) {
136 for(Int_t i=0; i<fNInvalidP; i++)
137 if ((*fInvalidP)[i] == n) return kFALSE;
141 Bool_t AliITSmoduleSSD::IsValidN(Int_t n) {
143 for(Int_t i=0; i<fNInvalidN; i++)
144 if ((*fInvalidN)[i] == n) return kFALSE;
149 //____________________________________________________________________
152 //____________________________________________________________________
155 /*********************************************************************
158 * sets paramerers: layer, ladder detector
159 * scan tracks wich produced this digit
160 * creates new SSD DIGTS
161 * call ITS to add digit to its Array
162 * set index frm ITS in its own array
164 * S.Radomski 17.09.1999
166 *********************************************************************/
168 void AliITSmoduleSSD::AddDigit(Int_t strNo, Int_t s, Bool_t p) {
172 AliITSdigit *t = (AliITSdigit*) (new AliITSdigitSSD(tracks, digits,
175 fIdigits->AddAt(((AliITS *)fITS)->AddDigit(t), fNdigits++);
179 //____________________________________________________________________
182 //____________________________________________________________________
187 void AliITSmoduleSSD::HitToDigit() {
189 Int_t i; //for iteration
190 fP = new TArrayI(768);
191 fN = new TArrayI(768);
193 fPtrack1 = new TArrayI(768);
194 fPtrack2 = new TArrayI(768);
195 fPtrack3 = new TArrayI(768);
197 fNtrack1 = new TArrayI(768);
198 fNtrack2 = new TArrayI(768);
199 fNtrack3 = new TArrayI(768);
201 for(i=0; i<kNStrips; i++) {
206 for(i=0; i<fNhitsM; i++) HitToDigit(i);
211 for(i=0; i<fNInvalidP; i++) (*fP)[(*fInvalidP)[i]] = -20;
212 for(i=0; i<fNInvalidN; i++) (*fN)[(*fInvalidN)[i]] = -20;
214 for(i=0; i<kNStrips; i++)
215 if ((*fP)[i]>kTresholdP) AddDigit(i+1, (*fP)[i], kTRUE);
217 for(i=0; i<kNStrips; i++)
218 if ((*fN)[i]>kTresholdN) AddDigit(i+1, (*fN)[i], kFALSE);
235 void AliITSmoduleSSD::HitToDigit(Int_t hitNo) {
237 Int_t stripP, stripN, i;
241 AliITShit *hit = (AliITShit*)((*fHitsM)[hitNo]);
242 Float_t dZ = kZ/kSteps*1000, l;
244 if(hit->GetIonization()==0.0) return;
246 Float_t x = hit->GetXG();
247 Float_t y = hit->GetYG();
249 Float_t dx = 0.0; //TMath::Tan(hit->fTheta)*kZ/kSteps;
250 Float_t dy = 0.0; //TMath::Tan(hit->fPhi)*kZ/kSteps;
251 l = sqrt(dZ*dZ + dx*dx *1000000);
253 x -= (kSteps/2 -1) * dx;
254 y -= (kSteps/2 -1) * dy;
256 for (i=1; i<kSteps; i++) {
258 stripP = GetStripP(x, y);
259 dsP = Get2StripP(x, y);
261 stripN = GetStripN(x, y);
262 dsN = Get2StripN(x, y);
264 EP = gRandom->Landau(fGainP*l, l*10);
265 EN = gRandom->Landau(fGainN*l, l*10);
267 sP = kSigmaP * sqrt(i);
268 sN = kSigmaN * sqrt(kSteps-i);
270 sP = (i<3 && dsP>0.3 && dsP<0.7)? 0.02 : sP;
271 sN = (i>7 && dsN>0.3 && dsN<0.7)? 0.02 : sN;
273 sP = (i==3 && dsP>0.4 && dsP<0.6)? 0.015 : sP;
274 sN = (i==7 && dsN>0.4 && dsN<0.6)? 0.015 : sN;
277 (*fP)[stripP-1]+=(Int_t)(EP*(F(-0.5-dsP,sP)-F(-1.5-dsP,sP)));
278 (*fP)[stripP] +=(Int_t)(EP*(F(0.5-dsP,sP)-F(-0.5-dsP,sP)));
279 (*fP)[stripP+1]+=(Int_t)(EP*(F(1.5-dsP,sP)-F(0.5-dsP,sP)));
280 (*fP)[stripP+2]+=(Int_t)(EP*(F(2.5-dsP,sP)-F(1.5-dsP,sP)));
282 (*fN)[stripN-1]+=(Int_t)(EN*(F(-0.5-dsN,sN)-F(-1.5-dsN,sN)));
283 (*fN)[stripN] +=(Int_t)(EN*(F(0.5-dsN,sN)-F(-0.5-dsN,sN)));
284 (*fN)[stripN+1]+=(Int_t)(EN*(F(1.5-dsN,sN)-F(0.5-dsN,sN)));
285 (*fN)[stripN+2]+=(Int_t)(EN*(F(2.5-dsN,sN)-F(1.5-dsN,sN)));
293 //____________________________________________________________________
295 // Private Methods for Simulation
296 //____________________________________________________________________
301 void AliITSmoduleSSD::ApplyNoise() {
303 for(Int_t i = 0; i<kNStrips; i++) {
304 (*fP)[i] += (Int_t)gRandom->Gaus(0,fSNRatioP);
305 (*fN)[i] += (Int_t)gRandom->Gaus(0,fSNRatioN);
309 void AliITSmoduleSSD::ApplyCoupling() {
311 for(Int_t i = 1; i<kNStrips-1; i++) {
312 (*fP)[i] += (Int_t)((*fP)[i-1]*fCouplingPL + (*fP)[i+1]*fCouplingPR);
313 (*fN)[i] += (Int_t)((*fN)[i-1]*fCouplingNL + (*fN)[i+1]*fCouplingNR);
318 //____________________________________________________________________
320 // Private methods for geometry
321 //____________________________________________________________________
326 Int_t AliITSmoduleSSD::GetStripP(Float_t x, Float_t y) {
328 Float_t X = x - y*kTan;
329 Int_t strip = (Int_t)(X/kPitch);
330 strip = (strip<0)? -1: strip;
331 strip = (strip>kNStrips)? -1: strip;
335 Int_t AliITSmoduleSSD::GetStripN(Float_t x, Float_t y) {
337 Float_t X = x - kTan*(kY - y);
338 Int_t strip = (Int_t)(X/kPitch);
339 strip = (strip<0)? -1: strip;
340 strip = (strip>kNStrips)? -1: strip;
345 Float_t AliITSmoduleSSD::Get2StripP(Float_t x, Float_t y) {
347 Int_t n = GetStripP(x,y);
348 return (x - y*kTan) / kPitch - n;
351 Float_t AliITSmoduleSSD::Get2StripN(Float_t x, Float_t y) {
353 Int_t n = GetStripN(x,y);
354 return (x - kTan*(kY - y)) / kPitch - n;
358 Bool_t AliITSmoduleSSD::GetCrossing (Float_t &P, Float_t &N) {
363 P = (kY * kTan + N + P)/2.0; // x coordinate
364 N = kY - (P-N)/kTan; // y coordinate
366 if (N<0 || N>kY) return kFALSE;
367 if (P<0 || P>kX) return kFALSE;
371 //____________________________________________________________________