CGEM BOSS 6.6.5.h
BESIII Offline Software System
Loading...
Searching...
No Matches
EmcRecBarrelGeo.cxx
Go to the documentation of this file.
1//
2// EmcRecBarrelGeo
3//
4// Dec 18, 2003, Created by Wang.Zhe
5//
6// unit: mm, radian
7//
8//#include "BesGeoEMC/DB2BesGeoEMC.h"
10
12{
13 ParameterInitialize();
14 CalculateStandardCrystal();
15 Transform2Column1();
16 FillCCenterVector();
17}
18
20{
21 fStandard.clear();
22 fCCenter.clear();
23 fCFrontCenter.clear();
24}
25
26void EmcRecBarrelGeo::ParameterInitialize()
27{
28 /*
29 DB2BesGeoEMC obj1;
30 vector<BesGeoEMC> VecA;
31
32 obj1.Get_BesGeoEMC(VecA);
33 fBarrelR=VecA[0].Get_BarrelR();
34 fBarrelOffset1=VecA[0].Get_BarrelOffset1();
35 fBarrelOffset2=VecA[0].Get_BarrelOffset2();
36 fBarrelh1=VecA[0].Get_Barrelh1();
37 fBarrelh2=VecA[0].Get_Barrelh2();
38 fBarrelh3=VecA[0].Get_Barrelh3();
39 fBarrelL=VecA[0].Get_BarrelL();
40 fBarrelL2=VecA[0].Get_BarrelL2();
41 fBarrelNPhiMax=(int)VecA[0].Get_BarrelNPhiMax();
42 fBarrelNThetaMax=(int)VecA[0].Get_BarrelNThetaMax();
43 */
44
45 fBarrelR=942;
46 fBarrelOffset1=25;
47 fBarrelOffset2=50;
48 fBarrelh1=51;
49 fBarrelh2=52;
50 fBarrelh3=52.466;
51 fBarrelL=280;
52 fBarrelL2=240;
53 fBarrelNPhiMax=120;
54 fBarrelNThetaMax=22;
55
56 fBarrelAlpha=twopi/fBarrelNPhiMax;
57
58 fStandard.clear();
59 fCCenter.clear();
60 fCFrontCenter.clear();
61}
62
63void EmcRecBarrelGeo::CalculateStandardCrystal()
64{
65 double R1,R2,a;
66 EmcRecCrystal pre,now;
67 double dx,dy,dz;
68 HepPoint3D t1,t2;
69 double L,h;
70
71 HepPoint3D O1(0,0,0);
72 HepPoint3D O2(0,0,fBarrelOffset1);
73 HepPoint3D O3(0,0,fBarrelOffset2);
74
75 R1=2*fBarrelR*sin(fBarrelAlpha/2)/sin(fBarrelAlpha);
76 R2=2*fBarrelR*sin(fBarrelAlpha/2)*(tan(fBarrelAlpha)+1/tan(fBarrelAlpha));
77 a=2*fBarrelR*sin(fBarrelAlpha/2)/cos(fBarrelAlpha);
78
79 HepPoint3D M4(0,R1,0);
80 HepPoint3D A1(a,R1,0);
81
82// cout<<O1<<", "<<O2<<", "<<O3<<endl;
83// cout<<M4<<", "<<A1<<endl;
84// cout<<R1<<", "<<R2<<endl;
85
86 // No. 1 theta: 21; phi: 30
87 EmcRecCrystal Crystal1;
88
89 Crystal1.Set(0,M4);
90 Crystal1.Set(1,A1);
91 Crystal1.Set(2,A1); Crystal1.SetZ(2,A1.z()+fBarrelh1);
92 Crystal1.Set(3,M4); Crystal1.SetZ(3,M4.z()+fBarrelh1);
93
94 Crystal1.Set(4,M4); Crystal1.SetY(4,M4.y()+fBarrelL);
95 dx=a*(R1+fBarrelL)/R1;
96 Crystal1.Set(5,Crystal1.Get(4)); Crystal1.SetX(5,dx);
97 dz=fBarrelOffset1+(fBarrelh1-fBarrelOffset1)*(R1+fBarrelL)/R1;
98 Crystal1.Set(6,Crystal1.Get(5)); Crystal1.SetZ(6,Crystal1.Get(5).z()+dz);
99 Crystal1.Set(7,Crystal1.Get(4)); Crystal1.SetZ(7,Crystal1.Get(4).z()+dz);
100
101 fStandard.push_back(Crystal1);
102 pre=fStandard[0];
103
104 // No. 2 theta: 20; phi: 30
105 EmcRecCrystal Crystal2;
106 double sin_gamma,cos_gamma,tan_gamma;
107
108 tan_gamma=R1/(fBarrelh1-fBarrelOffset1);
109 sin_gamma=tan_gamma/(sqrt(1+tan_gamma*tan_gamma));
110 cos_gamma=1/(sqrt(1+tan_gamma*tan_gamma));
111
112 double aa,bb,Rp;
113 aa=fBarrelh1/sin_gamma;
114 bb=fBarrelh1/tan_gamma;
115
116 Crystal2.Set(0,pre.Get(3)); Crystal2.SetZ(0,pre.Get(3).z()+bb*cos_gamma);
117 Crystal2.SetY(0,pre.Get(3).y()+bb*sin_gamma);
118 Rp=R1/sin_gamma;
119 dx=a*(Rp+bb)/Rp;
120 Crystal2.Set(1,Crystal2.Get(0)); Crystal2.SetX(1,dx);
121 Crystal2.Set(3,pre.Get(3)); Crystal2.SetZ(3,pre.Get(3).z()+aa);
122 Crystal2.Set(2,Crystal2.Get(3)); Crystal2.SetX(2,a);
123
124 dz=(fBarrelL+bb)*cos_gamma;
125 dy=(fBarrelL+bb)*sin_gamma;
126 Crystal2.Set(4,pre.Get(3)); Crystal2.SetZ(4,pre.Get(3).z()+dz);
127 Crystal2.SetY(4,pre.Get(3).y()+dy);
128 dx=a*(Rp+bb+fBarrelL)/Rp;
129 Crystal2.Set(5,Crystal2.Get(4)); Crystal2.SetX(5,dx);
130 double gam2,gam3,Lp,Rpp;
131 t1=pre.Get(3)-Crystal2.Get(3);
132 t2=O3-Crystal2.Get(3);
133 gam2=acos(t1*t2/(t1.mag()*t2.mag()));
134 gam3=acos(cos_gamma)-gam2;
135 Lp=fBarrelL/cos(gam3);
136 dz=Lp*cos(gam2);
137 dy=Lp*sin(gam2);
138 Crystal2.Set(7,Crystal2.Get(3)); Crystal2.SetZ(7,Crystal2.Get(3).z()+dz);
139 Crystal2.SetY(7,Crystal2.Get(3).y()+dy);
140 Rpp=R1/sin(gam2);
141 dx=a*(Rpp+Lp)/Rpp;
142 Crystal2.Set(6,Crystal2.Get(7)); Crystal2.SetX(6,dx);
143
144 fStandard.push_back(Crystal2);
145
146 // No. 3 -- No. 22 theta: 19-0; phi: 30
147 for(int i=3; i<=fBarrelNThetaMax; i++) {
148 pre=fStandard[i-2];
149
150 if(i<fBarrelNThetaMax) {
151 L=fBarrelL;
152 h=fBarrelh2;
153 }
154 else {
155 L=fBarrelL2;
156 h=fBarrelh3;
157 }
158
159 tan_gamma=R1/(pre.Get(3).z()-fBarrelOffset2);
160 sin_gamma=tan_gamma/(sqrt(1+tan_gamma*tan_gamma));
161 cos_gamma=1/(sqrt(1+tan_gamma*tan_gamma));
162
163 aa=h/sin_gamma;
164 bb=h/tan_gamma;
165
166 now.Set(3,pre.Get(3)); now.SetZ(3,pre.Get(3).z()+aa);
167 now.Set(0,pre.Get(3)); now.SetZ(0,pre.Get(3).z()+bb*cos_gamma);
168 now.SetY(0,pre.Get(3).y()+bb*sin_gamma);
169
170 now.Set(4,pre.Get(3)); now.SetZ(4,pre.Get(3).z()+(L+bb)*cos_gamma);
171 now.SetY(4,pre.Get(3).y()+(L+bb)*sin_gamma);
172
173 gam2=atan(R1/(now.Get(3).z()-fBarrelOffset2));
174 gam3=acos(cos_gamma)-gam2;
175
176 Lp=L/cos(gam3);
177 dz=Lp*cos(gam2);
178 dy=Lp*sin(gam2);
179
180 now.Set(7,now.Get(3)); now.SetZ(7,now.Get(3).z()+dz);
181 now.SetY(7,now.Get(3).y()+dy);
182
183 Rp=R1/sin_gamma;
184 dx=a*(Rp+bb)/Rp;
185 now.Set(1,now.Get(0)); now.SetX(1,dx);
186 dx=a*(Rp+bb+L)/Rp;
187 now.Set(5,now.Get(4)); now.SetX(5,dx);
188
189 now.Set(2,now.Get(3)); now.SetX(2,a);
190
191 Rpp=R1/sin(gam2);
192 dx=a*(Rpp+Lp)/Rpp;
193 now.Set(6,now.Get(7)); now.SetX(6,dx);
194
195 fStandard.push_back(now);
196 }
197
198// for(int i=1; i<=fBarrelNThetaMax; i++) {
199// cout<<endl;
200// cout<<"No. "<<i<<endl;
201// now=fStandard[i-1];
202// now.BarrelCheckout();
203// now.Dump();
204// }
205}
206
207void EmcRecBarrelGeo::Transform2Column1() // to theta: 21-0; phi: 0
208{
209 HepPoint3D O1(fBarrelR*sin(fBarrelAlpha/2),
210 fBarrelR*cos(fBarrelAlpha/2)-2*fBarrelR*sin(fBarrelAlpha/2)/tan(fBarrelAlpha),
211 0);
212
213 HepPoint3D R=fStandard[0].Get(5);
214 double phi=(R.rotateZ(fBarrelAlpha)+O1).phi();
215
216 for(int i=1; i<=fBarrelNThetaMax; i++) {
217 for(int m=0;m<8;m++)
218 {
219 fStandard[i-1].Type(EmcRecCrystal::SixPlane());
220 fStandard[i-1].Set(m,fStandard[i-1].Get(m).rotateZ(fBarrelAlpha));
221 fStandard[i-1].Set(m,fStandard[i-1].Get(m)+O1);
222 fStandard[i-1].Set(m,fStandard[i-1].Get(m).rotateZ(-phi));
223 }
224
225// cout<<endl;
226// cout<<"No. "<<i<<endl;
227// fStandard[i-1].BarrelCheckout();
228// fStandard[i-1].Dump();
229 }
230}
231
232void EmcRecBarrelGeo::FillCCenterVector()
233{
234 int phi,theta;
235 EmcRecCrystal aCry;
236 HepPoint3D aCenter;
237 HepPoint3D aFrontCenter;
238
239 for(theta=0;theta<2*fBarrelNThetaMax;++theta) {
240 for(phi=0;phi<fBarrelNPhiMax;++phi) {
242 aCenter=aCry.Center();
243 aFrontCenter=aCry.FrontCenter();
244 fCCenter.push_back(aCenter);
245 fCFrontCenter.push_back(aFrontCenter);
246// aCry.Dump();
247// cout<<"("<<theta<<","<<phi<<") ";
248// cout<<aCenter<<endl;
249 }
250 }
251}
252
253
254// Access
256{
257 EmcRecCrystal cry;
258 unsigned int theta=EmcID::theta_module(id);
259 unsigned int phi=EmcID::phi_module(id);
260
261 double dphi=phi*fBarrelAlpha;
262
263 if((int)theta>=fBarrelNThetaMax) {
264 cry=fStandard[theta-fBarrelNThetaMax];
265 for(int m=0;m<8;++m)
266 {
267 cry.SetZ(m,-cry.Get(m).z());
268 }
269 }
270 else {
271 cry=fStandard[fBarrelNThetaMax-theta-1];
272 }
273
274 for(int m=0;m<8;++m)
275 {
276 cry.Set(m,cry.Get(m).rotateZ(dphi));
277 }
278
279 return cry;
280}
281
283{
284 unsigned int theta=EmcID::theta_module(id);
285 unsigned int phi=EmcID::phi_module(id);
286
287 return fCCenter[theta*fBarrelNPhiMax+phi];
288}
289
291{
292 unsigned int theta=EmcID::theta_module(id);
293 unsigned int phi=EmcID::phi_module(id);
294
295 return fCFrontCenter[theta*fBarrelNPhiMax+phi];
296}
double tan(const BesAngle a)
Definition BesAngle.h:216
double sin(const BesAngle a)
Definition BesAngle.h:210
double cos(const BesAngle a)
Definition BesAngle.h:213
static Identifier crystal_id(const unsigned int barrel_ec, const unsigned int theta_module, const unsigned int phi_module)
For a single crystal.
Definition EmcID.cxx:71
static unsigned int getBARREL()
Definition EmcID.cxx:146
static unsigned int theta_module(const Identifier &id)
Definition EmcID.cxx:43
static unsigned int phi_module(const Identifier &id)
Definition EmcID.cxx:48
EmcRecCrystal GetCrystal(const Identifier &id) const
HepPoint3D GetCFrontCenter(const Identifier &id) const
HepPoint3D GetCCenter(const Identifier &id) const
HepPoint3D Center() const
void SetY(int index, double value)
HepPoint3D Get(int index) const
static int SixPlane()
void SetX(int index, double value)
HepPoint3D FrontCenter() const
void SetZ(int index, double value)
void Set(int index, const HepPoint3D &aPoint)
complex_t R(double Q2, double M2, double G, double Mp2, double Mm2)
Definition TUtil.h:27