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 **************************************************************************/
18 Revision 1.2 1999/09/29 09:24:20 fca
19 Introduction of the Copyright and cvs Log
24 #include "AliITSmoduleSSD.h"
26 //Technical parameters of detector
27 const Float_t AliITSmoduleSSD::kStereo = 0.0175; //Stereo Angle 17.5 mrad
28 const Float_t AliITSmoduleSSD::kTan = 0.0175;
29 const Int_t AliITSmoduleSSD::kNStrips = 768; //Number of strips on each side
30 const Float_t AliITSmoduleSSD::kPitch = 0.095; //Distance strip - strip (mm)
31 const Float_t AliITSmoduleSSD::kX = 72.96; //X size (mm)
32 const Float_t AliITSmoduleSSD::kY = 0.3; //Y size (mm)
33 const Float_t AliITSmoduleSSD::kZ = 40; //Thickness (mm)
35 // <------------------------------
37 //______________________________________________________________
39 // Parameters for simulation
40 //______________________________________________________________
42 const Float_t AliITSmoduleSSD::kSigmaP = 0.003; //Gaussian sigm
43 const Float_t AliITSmoduleSSD::kSigmaN = 0.002;
44 const Int_t AliITSmoduleSSD::kSteps = 10; //Number of steps
45 const Int_t AliITSmoduleSSD::kTresholdP = 1500;
46 const Int_t AliITSmoduleSSD::kTresholdN = 2500;
50 ClassImp(AliITSmoduleSSD)
52 //____________________________________________________________________
55 //____________________________________________________________________
59 AliITSmoduleSSD::AliITSmoduleSSD() {
62 //Invalid Strips parameters
64 fInvalidP = new TArrayS(0);
65 fInvalidN = new TArrayS(0);
85 AliITSmoduleSSD::AliITSmoduleSSD(Int_t index) {
89 //Invalid Strips parameters
91 fInvalidP = new TArrayS(0);
92 fInvalidN = new TArrayS(0);
111 AliITSmoduleSSD::~AliITSmoduleSSD() {
113 if (!fInvalidP) delete fInvalidP;
114 if (!fInvalidN) delete fInvalidN;
118 //____________________________________________________________________
120 // Inalid strips menagement
121 //____________________________________________________________________
126 void AliITSmoduleSSD::SetInvalidP(Int_t strip, Bool_t b) {
128 Bool_t already = kFALSE;
131 for (i=0; i<fNInvalidP; i++) {
132 if ((*fInvalidP)[i] == strip) {
139 (*fInvalidP)[fNInvalidP++] = strip;
143 void AliITSmoduleSSD::SetInvalidMC(Float_t m, Float_t s) {
150 void AliITSmoduleSSD::SetInvalidMC() {
152 Int_t m = (Int_t)gRandom->Gaus(fNInvalid, fISigma);
154 for(int i=0; i<m; i++) {
155 SetInvalidP((Int_t)(gRandom->Rndm()*kNStrips), kTRUE);
160 Bool_t AliITSmoduleSSD::IsValidP(Int_t n) {
162 for(Int_t i=0; i<fNInvalidP; i++)
163 if ((*fInvalidP)[i] == n) return kFALSE;
167 Bool_t AliITSmoduleSSD::IsValidN(Int_t n) {
169 for(Int_t i=0; i<fNInvalidN; i++)
170 if ((*fInvalidN)[i] == n) return kFALSE;
175 //____________________________________________________________________
178 //____________________________________________________________________
181 /*********************************************************************
184 * sets paramerers: layer, ladder detector
185 * scan tracks wich produced this digit
186 * creates new SSD DIGTS
187 * call ITS to add digit to its Array
188 * set index frm ITS in its own array
190 * S.Radomski 17.09.1999
192 *********************************************************************/
194 void AliITSmoduleSSD::AddDigit(Int_t strNo, Int_t s, Bool_t p) {
198 AliITSdigit *t = (AliITSdigit*) (new AliITSdigitSSD(tracks, digits,
201 fIdigits->AddAt(((AliITS *)fITS)->AddDigit(t), fNdigits++);
205 //____________________________________________________________________
208 //____________________________________________________________________
213 void AliITSmoduleSSD::HitToDigit() {
215 Int_t i; //for iteration
216 fP = new TArrayI(768);
217 fN = new TArrayI(768);
219 fPtrack1 = new TArrayI(768);
220 fPtrack2 = new TArrayI(768);
221 fPtrack3 = new TArrayI(768);
223 fNtrack1 = new TArrayI(768);
224 fNtrack2 = new TArrayI(768);
225 fNtrack3 = new TArrayI(768);
227 for(i=0; i<kNStrips; i++) {
232 for(i=0; i<fNhitsM; i++) HitToDigit(i);
237 for(i=0; i<fNInvalidP; i++) (*fP)[(*fInvalidP)[i]] = -20;
238 for(i=0; i<fNInvalidN; i++) (*fN)[(*fInvalidN)[i]] = -20;
240 for(i=0; i<kNStrips; i++)
241 if ((*fP)[i]>kTresholdP) AddDigit(i+1, (*fP)[i], kTRUE);
243 for(i=0; i<kNStrips; i++)
244 if ((*fN)[i]>kTresholdN) AddDigit(i+1, (*fN)[i], kFALSE);
261 void AliITSmoduleSSD::HitToDigit(Int_t hitNo) {
263 Int_t stripP, stripN, i;
267 AliITShit *hit = (AliITShit*)((*fHitsM)[hitNo]);
268 Float_t dZ = kZ/kSteps*1000, l;
270 if(hit->GetIonization()==0.0) return;
272 Float_t x = hit->GetXG();
273 Float_t y = hit->GetYG();
275 Float_t dx = 0.0; //TMath::Tan(hit->fTheta)*kZ/kSteps;
276 Float_t dy = 0.0; //TMath::Tan(hit->fPhi)*kZ/kSteps;
277 l = sqrt(dZ*dZ + dx*dx *1000000);
279 x -= (kSteps/2 -1) * dx;
280 y -= (kSteps/2 -1) * dy;
282 for (i=1; i<kSteps; i++) {
284 stripP = GetStripP(x, y);
285 dsP = Get2StripP(x, y);
287 stripN = GetStripN(x, y);
288 dsN = Get2StripN(x, y);
290 EP = gRandom->Landau(fGainP*l, l*10);
291 EN = gRandom->Landau(fGainN*l, l*10);
293 sP = kSigmaP * sqrt(i);
294 sN = kSigmaN * sqrt(kSteps-i);
296 sP = (i<3 && dsP>0.3 && dsP<0.7)? 0.02 : sP;
297 sN = (i>7 && dsN>0.3 && dsN<0.7)? 0.02 : sN;
299 sP = (i==3 && dsP>0.4 && dsP<0.6)? 0.015 : sP;
300 sN = (i==7 && dsN>0.4 && dsN<0.6)? 0.015 : sN;
303 (*fP)[stripP-1]+=(Int_t)(EP*(F(-0.5-dsP,sP)-F(-1.5-dsP,sP)));
304 (*fP)[stripP] +=(Int_t)(EP*(F(0.5-dsP,sP)-F(-0.5-dsP,sP)));
305 (*fP)[stripP+1]+=(Int_t)(EP*(F(1.5-dsP,sP)-F(0.5-dsP,sP)));
306 (*fP)[stripP+2]+=(Int_t)(EP*(F(2.5-dsP,sP)-F(1.5-dsP,sP)));
308 (*fN)[stripN-1]+=(Int_t)(EN*(F(-0.5-dsN,sN)-F(-1.5-dsN,sN)));
309 (*fN)[stripN] +=(Int_t)(EN*(F(0.5-dsN,sN)-F(-0.5-dsN,sN)));
310 (*fN)[stripN+1]+=(Int_t)(EN*(F(1.5-dsN,sN)-F(0.5-dsN,sN)));
311 (*fN)[stripN+2]+=(Int_t)(EN*(F(2.5-dsN,sN)-F(1.5-dsN,sN)));
319 //____________________________________________________________________
321 // Private Methods for Simulation
322 //____________________________________________________________________
327 void AliITSmoduleSSD::ApplyNoise() {
329 for(Int_t i = 0; i<kNStrips; i++) {
330 (*fP)[i] += (Int_t)gRandom->Gaus(0,fSNRatioP);
331 (*fN)[i] += (Int_t)gRandom->Gaus(0,fSNRatioN);
335 void AliITSmoduleSSD::ApplyCoupling() {
337 for(Int_t i = 1; i<kNStrips-1; i++) {
338 (*fP)[i] += (Int_t)((*fP)[i-1]*fCouplingPL + (*fP)[i+1]*fCouplingPR);
339 (*fN)[i] += (Int_t)((*fN)[i-1]*fCouplingNL + (*fN)[i+1]*fCouplingNR);
344 //____________________________________________________________________
346 // Private methods for geometry
347 //____________________________________________________________________
352 Int_t AliITSmoduleSSD::GetStripP(Float_t x, Float_t y) {
354 Float_t X = x - y*kTan;
355 Int_t strip = (Int_t)(X/kPitch);
356 strip = (strip<0)? -1: strip;
357 strip = (strip>kNStrips)? -1: strip;
361 Int_t AliITSmoduleSSD::GetStripN(Float_t x, Float_t y) {
363 Float_t X = x - kTan*(kY - y);
364 Int_t strip = (Int_t)(X/kPitch);
365 strip = (strip<0)? -1: strip;
366 strip = (strip>kNStrips)? -1: strip;
371 Float_t AliITSmoduleSSD::Get2StripP(Float_t x, Float_t y) {
373 Int_t n = GetStripP(x,y);
374 return (x - y*kTan) / kPitch - n;
377 Float_t AliITSmoduleSSD::Get2StripN(Float_t x, Float_t y) {
379 Int_t n = GetStripN(x,y);
380 return (x - kTan*(kY - y)) / kPitch - n;
384 Bool_t AliITSmoduleSSD::GetCrossing (Float_t &P, Float_t &N) {
389 P = (kY * kTan + N + P)/2.0; // x coordinate
390 N = kY - (P-N)/kTan; // y coordinate
392 if (N<0 || N>kY) return kFALSE;
393 if (P<0 || P>kX) return kFALSE;
397 //____________________________________________________________________