]>
Commit | Line | Data |
---|---|---|
2e5f0f7b | 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 | ||
2e5f0f7b | 16 | #include "AliRICHChamber.h" |
a277aaca | 17 | #include "AliRICHConst.h" //for kR2d |
853634d3 | 18 | #include "AliRICHParam.h" |
2e5f0f7b | 19 | #include <TRandom.h> |
488e98ba | 20 | #include <TRotMatrix.h> |
853634d3 | 21 | #include "AliRICHTresholdMap.h" |
22 | #include "AliSegmentation.h" | |
23 | #include "AliRICHSegmentationV0.h" | |
24 | #include "AliRICHGeometry.h" | |
25 | #include "AliRICHResponse.h" | |
2e5f0f7b | 26 | |
27 | ClassImp(AliRICHChamber) | |
853634d3 | 28 | //______________________________________________________________________________ |
2e5f0f7b | 29 | AliRICHChamber::AliRICHChamber() |
853634d3 | 30 | {//default ctor |
31 | fpParam=0; | |
32 | fpRotMatrix=0; | |
33 | ||
2e5f0f7b | 34 | fSegmentation = 0; |
4faf338d | 35 | fResponse = 0; |
36 | fGeometry = 0; | |
37 | fTresh = 0; | |
ef42d733 | 38 | for(Int_t i=0; i<50; ++i) fIndexMap[i] = 0; |
2e5f0f7b | 39 | } |
853634d3 | 40 | //______________________________________________________________________________ |
41 | AliRICHChamber::AliRICHChamber(Int_t iModuleN,AliRICHParam *pParam) | |
c64f7552 | 42 | {//main ctor. Defines all geometry parameters for the given module. |
43 | SetToZenith();//put to up position | |
853634d3 | 44 | switch(iModuleN){ |
853634d3 | 45 | case 1: |
0ffe413c | 46 | RotateX(-pParam->AngleYZ()); |
3ea9cb08 | 47 | RotateZ(-pParam->AngleXY()); |
853634d3 | 48 | fName="RICHc1";fTitle="RICH chamber 1"; |
49 | break; | |
50 | case 2: | |
3ea9cb08 | 51 | RotateZ(-pParam->AngleXY()); |
853634d3 | 52 | fName="RICHc2";fTitle="RICH chamber 2"; |
53 | break; | |
54 | case 3: | |
3ea9cb08 | 55 | RotateX(-pParam->AngleYZ()); |
853634d3 | 56 | fName="RICHc3";fTitle="RICH chamber 3"; |
57 | break; | |
3ea9cb08 | 58 | case 4: |
59 | fName="RICHc4";fTitle="RICH chamber 4"; //no turns | |
853634d3 | 60 | break; |
61 | case 5: | |
3ea9cb08 | 62 | RotateX(pParam->AngleYZ()); |
853634d3 | 63 | fName="RICHc5";fTitle="RICH chamber 5"; |
64 | break; | |
65 | case 6: | |
3ea9cb08 | 66 | RotateZ(pParam->AngleXY()); |
853634d3 | 67 | fName="RICHc6";fTitle="RICH chamber 6"; |
68 | break; | |
3ea9cb08 | 69 | case 7: |
70 | RotateX(pParam->AngleYZ()); | |
71 | RotateZ(pParam->AngleXY()); | |
72 | fName="RICHc7";fTitle="RICH chamber 7"; | |
73 | break; | |
853634d3 | 74 | default: |
c64f7552 | 75 | Fatal("named ctor","Wrong chamber number %i, check CreateChamber ctor",iModuleN); |
853634d3 | 76 | }//switch(iModuleN) |
77 | RotateZ(pParam->AngleRot());//apply common rotation | |
a277aaca | 78 | fpRotMatrix=new TRotMatrix("rot"+fName,"rot"+fName, Rot().ThetaX()*kR2d, Rot().PhiX()*kR2d, |
79 | Rot().ThetaY()*kR2d, Rot().PhiY()*kR2d, | |
80 | Rot().ThetaZ()*kR2d, Rot().PhiZ()*kR2d); | |
853634d3 | 81 | fpParam=pParam; |
c60862bf | 82 | fX=fCenterV3.X();fY=fCenterV3.Y();fZ=fCenterV3.Z(); |
1f63a0be | 83 | |
84 | fSegmentation = 0; fResponse = 0; fGeometry = 0; | |
85 | fTresh = 0; for(Int_t i=0; i<50; ++i) fIndexMap[i] = 0; | |
853634d3 | 86 | } |
87 | //______________________________________________________________________________ | |
2e5f0f7b | 88 | |
0ffe413c | 89 | void AliRICHChamber::LocaltoGlobal(Float_t local[3],Float_t global[3]) |
853634d3 | 90 | {//Local coordinates to global coordinates transformation |
237c933d | 91 | |
2d857021 | 92 | Double_t *pMatrix; |
93 | pMatrix = fpRotMatrix->GetMatrix(); | |
0ffe413c | 94 | global[0]=local[0]*pMatrix[0]+local[1]*pMatrix[3]+local[2]*pMatrix[6]; |
95 | global[1]=local[0]*pMatrix[1]+local[1]*pMatrix[4]+local[2]*pMatrix[7]; | |
96 | global[2]=local[0]*pMatrix[2]+local[1]*pMatrix[5]+local[2]*pMatrix[8]; | |
97 | global[0]+=fX; | |
98 | global[1]+=fY; | |
99 | global[2]+=fZ; | |
2e5f0f7b | 100 | } |
101 | ||
0ffe413c | 102 | void AliRICHChamber::GlobaltoLocal(Float_t global[3],Float_t local[3]) |
853634d3 | 103 | {// Global coordinates to local coordinates transformation |
2d857021 | 104 | TMatrix matrixCopy(3,3); |
105 | Double_t *pMatrixOrig = fpRotMatrix->GetMatrix(); | |
2e5f0f7b | 106 | for(Int_t i=0;i<3;i++) |
107 | { | |
108 | for(Int_t j=0;j<3;j++) | |
2d857021 | 109 | matrixCopy(j,i)=pMatrixOrig[j+3*i]; |
2e5f0f7b | 110 | } |
2d857021 | 111 | matrixCopy.Invert(); |
0ffe413c | 112 | local[0] = global[0] - fX; |
113 | local[1] = global[1] - fY; | |
114 | local[2] = global[2] - fZ; | |
115 | local[0]=local[0]*matrixCopy(0,0)+local[1]*matrixCopy(0,1)+local[2]*matrixCopy(0,2); | |
116 | local[1]=local[0]*matrixCopy(1,0)+local[1]*matrixCopy(1,1)+local[2]*matrixCopy(1,2); | |
117 | local[2]=local[0]*matrixCopy(2,0)+local[1]*matrixCopy(2,1)+local[2]*matrixCopy(2,2); | |
2e5f0f7b | 118 | } |
119 | ||
2e5f0f7b | 120 | void AliRICHChamber::DisIntegration(Float_t eloss, Float_t xhit, Float_t yhit, |
3ea9cb08 | 121 | Int_t& iNpads,Float_t cluster[5][500],ResponseType res) |
122 | {//Generates pad hits (simulated cluster) using the segmentation and the response model | |
0ffe413c | 123 | |
124 | Float_t local[3],global[3]; | |
3ea9cb08 | 125 | // Width of the integration area |
126 | Float_t dx=(fResponse->SigmaIntegration())*(fResponse->ChargeSpreadX()); | |
127 | Float_t dy=(fResponse->SigmaIntegration())*(fResponse->ChargeSpreadY()); | |
128 | // Get pulse height from energy loss and generate feedback photons | |
129 | Float_t qtot=0; | |
130 | local[0]=xhit; | |
131 | //z-position of the wires relative to the RICH mother volume (2 mm before CsI) old value: 6.076 ??????? | |
132 | local[1]=1.276 + fGeometry->GetGapThickness()/2 - .2; | |
133 | local[2]=yhit; | |
2e5f0f7b | 134 | |
3ea9cb08 | 135 | LocaltoGlobal(local,global); |
2e5f0f7b | 136 | |
0ffe413c | 137 | |
138 | ||
3ea9cb08 | 139 | //To calculate wire sag, the origin of y-position must be the middle of the photcathode |
140 | AliRICHSegmentationV0* segmentation = (AliRICHSegmentationV0*) GetSegmentationModel(); | |
141 | Float_t newy; | |
142 | if (yhit>0) | |
143 | newy = yhit - segmentation->GetPadPlaneLength()/2; | |
144 | else | |
145 | newy = yhit + segmentation->GetPadPlaneLength()/2; | |
0ffe413c | 146 | |
3ea9cb08 | 147 | if(res==kMip){ |
148 | qtot = fResponse->IntPH(eloss, newy); | |
0ffe413c | 149 | fResponse->FeedBackPhotons(global,qtot); |
150 | }else if(res==kPhoton){ | |
3ea9cb08 | 151 | qtot = fResponse->IntPH(newy); |
0ffe413c | 152 | fResponse->FeedBackPhotons(global,qtot); |
3ea9cb08 | 153 | } |
2e5f0f7b | 154 | |
2e5f0f7b | 155 | // Loop Over Pads |
0ffe413c | 156 | |
3ea9cb08 | 157 | Float_t qcheck=0, qp=0; |
0ffe413c | 158 | |
3ea9cb08 | 159 | iNpads=0; |
c712cb2f | 160 | for(fSegmentation->FirstPad(xhit, yhit, 0, dx, dy); fSegmentation->MorePads(); fSegmentation->NextPad()) { |
3ea9cb08 | 161 | qp= fResponse->IntXY(fSegmentation); |
162 | qp= TMath::Abs(qp); | |
163 | if(qp >1.e-4){ | |
164 | qcheck+=qp; | |
165 | cluster[0][iNpads]=qp*qtot;// --- store signal information | |
166 | cluster[1][iNpads]=fSegmentation->Ix(); | |
167 | cluster[2][iNpads]=fSegmentation->Iy(); | |
168 | cluster[3][iNpads]=fSegmentation->ISector(); | |
0ffe413c | 169 | iNpads++; |
3ea9cb08 | 170 | } |
171 | }//pad loop | |
853634d3 | 172 | }//void AliRICHChamber::DisIntegration(... |
0ffe413c | 173 | //__________________________________________________________________________________________________ |
4faf338d | 174 | void AliRICHChamber::GenerateTresholds() |
0ffe413c | 175 | {//Generates random treshold charges for all pads |
4faf338d | 176 | Int_t nx = fSegmentation->Npx(); |
177 | Int_t ny = fSegmentation->Npy(); | |
178 | ||
4faf338d | 179 | fTresh = new AliRICHTresholdMap(fSegmentation); |
853634d3 | 180 | for(Int_t i=-nx/2;i<nx/2;i++){ |
181 | for(Int_t j=-ny/2;j<ny/2;j++){ | |
182 | Int_t pedestal = (Int_t)(gRandom->Gaus(50, 10)); | |
183 | fTresh->SetHit(i,j,pedestal); | |
4faf338d | 184 | } |
853634d3 | 185 | } |
186 | }//void AliRICHChamber::GenerateTresholds() | |
0ffe413c | 187 | //__________________________________________________________________________________________________ |
cc23c5c6 | 188 | void AliRICHChamber::Print(Option_t *) const |
853634d3 | 189 | { |
0ffe413c | 190 | printf("%s r=%8.3f theta=%5.1f phi=%5.1f x=%8.3f y=%8.3f z=%8.3f %6.2f,%6.2f %6.2f,%6.2f %6.2f,%6.2f\n",fName.Data(), |
191 | Rho(), ThetaD(),PhiD(), X(), Y(), Z(), | |
3ea9cb08 | 192 | ThetaXd(),PhiXd(),ThetaYd(),PhiYd(),ThetaZd(),PhiZd()); |
853634d3 | 193 | }//void AliRICHChamber::Print(Option_t *option)const |
0ffe413c | 194 | //__________________________________________________________________________________________________ |