[807] | 1 | // %%%%%%%%%%%%% |
---|
| 2 | // gemc headers |
---|
| 3 | // %%%%%%%%%%%%% |
---|
| 4 | #include "fst_strip.h" |
---|
| 5 | |
---|
| 6 | #include <iostream> |
---|
| 7 | #include <cmath> |
---|
| 8 | |
---|
| 9 | void fst_strip::fill_infos() |
---|
| 10 | { |
---|
| 11 | // all dimensions are in mm |
---|
| 12 | |
---|
| 13 | Pi = 3.14159265358; |
---|
| 14 | interlayer = 2.75; // distance between 2 layers of a superlayer |
---|
| 15 | intersuperlayer = 15.0; // distance between 2 superlayers |
---|
| 16 | Nsector=15; // number of sectors for each layer |
---|
| 17 | |
---|
| 18 | alpha = (360.0/Nsector/2.0)*Pi/180.0; // angle of the strips |
---|
| 19 | pitch = 0.150; // pitch of the strips |
---|
| 20 | |
---|
| 21 | |
---|
| 22 | DZ = 0.934; // size of the band of dead zones |
---|
| 23 | Rmin = 19.029; // inner radius of disks |
---|
| 24 | Rmax = (Rmin+45.419+123.552); // outer radius of disks |
---|
| 25 | Z_1stlayer = 238.065; // z position of the 1st layer |
---|
| 26 | |
---|
| 27 | // z of the upstream part of the layer |
---|
| 28 | Z0.push_back(Z_1stlayer); |
---|
| 29 | Z0.push_back(Z0[0]+interlayer); |
---|
| 30 | Z0.push_back(Z_1stlayer+intersuperlayer); |
---|
| 31 | Z0.push_back(Z0[2]+interlayer); |
---|
| 32 | Z0.push_back(Z_1stlayer+2.*intersuperlayer); |
---|
| 33 | Z0.push_back(Z0[4]+interlayer); |
---|
| 34 | |
---|
| 35 | |
---|
| 36 | // mid angle of the sector |
---|
| 37 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
| 38 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
| 39 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
| 40 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
| 41 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
| 42 | MidTile.push_back((360.0/Nsector/2.0)*Pi/180.0); |
---|
| 43 | |
---|
| 44 | // Number of strips |
---|
| 45 | Nstrips = (int) floor((2.*Rmax*tan(alpha)-2.*DZ)/pitch); |
---|
| 46 | |
---|
| 47 | } |
---|
| 48 | |
---|
| 49 | |
---|
| 50 | |
---|
| 51 | |
---|
| 52 | |
---|
| 53 | int fst_strip::FindStrip(int layer, int sector, double x, double y, double z) |
---|
| 54 | { |
---|
| 55 | // 1st define phi of the hit point |
---|
| 56 | double phi; |
---|
| 57 | if(x>0 && y>=0) phi = atan(y/x); |
---|
| 58 | else if(x>0 && y<0) phi = 2.*Pi+atan(y/x); |
---|
| 59 | else if(x<0) phi = Pi+atan(y/x); |
---|
| 60 | else if(x==0 && y>0) phi = Pi/2.; |
---|
| 61 | else if(x==0 && y<0) phi = 3.*Pi/2.; |
---|
| 62 | else phi = 0; // x = y = 0, phi not defined |
---|
| 63 | |
---|
| 64 | // now find the tile number |
---|
| 65 | int ti=0; |
---|
| 66 | double theta_tmp=0; |
---|
| 67 | for(int t=0; t<Nsector; t++) |
---|
| 68 | { |
---|
| 69 | theta_tmp = MidTile[layer]+2.*t*Pi/Nsector; |
---|
| 70 | if(theta_tmp>2.*Pi) theta_tmp = theta_tmp - 2.*Pi; |
---|
| 71 | if(theta_tmp<0) theta_tmp = theta_tmp + 2.*Pi; |
---|
| 72 | if(fabs(phi-theta_tmp)<Pi/Nsector || fabs(2.*Pi-fabs(phi-theta_tmp))<Pi/Nsector) ti=t; // gives tile # |
---|
| 73 | } |
---|
| 74 | |
---|
| 75 | double thetaij = MidTile[layer]+2.*ti*Pi/Nsector; |
---|
| 76 | int ClosestStrip=0; |
---|
| 77 | if(layer%2==0) |
---|
| 78 | ClosestStrip = (int) (floor( (-DZ+x*(cos(thetaij)*tan(alpha)+sin(thetaij))+y*(sin(thetaij)*tan(alpha)-cos(thetaij)))/pitch) + |
---|
| 79 | floor(2.0*((-DZ+x*(cos(thetaij)*tan(alpha)+sin(thetaij)) + y*(sin(thetaij)*tan(alpha)-cos(thetaij)))/pitch - |
---|
| 80 | floor((-DZ+x*(cos(thetaij)*tan(alpha)+sin(thetaij)) + y*(sin(thetaij)*tan(alpha)-cos(thetaij)))/pitch)))); |
---|
| 81 | |
---|
| 82 | if(layer%2==1) |
---|
| 83 | ClosestStrip = (int) (floor( (-DZ+x*(cos(thetaij)*tan(alpha)-sin(thetaij))+y*(sin(thetaij)*tan(alpha)+cos(thetaij)))/pitch) + |
---|
| 84 | floor(2.0*((-DZ+x*(cos(thetaij)*tan(alpha)-sin(thetaij))+y*(sin(thetaij)*tan(alpha)+cos(thetaij)))/pitch - |
---|
| 85 | floor((-DZ+x*(cos(thetaij)*tan(alpha)-sin(thetaij))+y*(sin(thetaij)*tan(alpha)+cos(thetaij)))/pitch)))); |
---|
| 86 | |
---|
| 87 | int IsOK=1; |
---|
| 88 | |
---|
| 89 | // now check if the position is in the acceptance of the detector: |
---|
| 90 | if(ClosestStrip<0 || ClosestStrip>Nstrips) IsOK = 0; |
---|
| 91 | if(x*cos(thetaij)+y*sin(thetaij)< Rmin || x*cos(thetaij)+y*sin(thetaij)>Rmax) |
---|
| 92 | { |
---|
| 93 | // cout << " Outside Acceptance " << endl; |
---|
| 94 | IsOK = 0; |
---|
| 95 | } |
---|
| 96 | |
---|
| 97 | if(IsOK) return ClosestStrip; |
---|
| 98 | else return -1; |
---|
| 99 | |
---|
| 100 | |
---|
| 101 | } |
---|
| 102 | |
---|
| 103 | |
---|
| 104 | |
---|
| 105 | |
---|
| 106 | |
---|
| 107 | |
---|
| 108 | |
---|
| 109 | |
---|
| 110 | |
---|
| 111 | |
---|
| 112 | |
---|