BOSS 7.0.7
BESIII Offline Software System
Loading...
Searching...
No Matches
BesCrystalParameterisation.cc
Go to the documentation of this file.
1//---------------------------------------------------------------------------//
2// BOOST --- BESIII Object_Oreiented Simulation Tool //
3//---------------------------------------------------------------------------//
4//Descpirtion: EMC detector
5//Author: Fu Chengdong
6//Created: Sep 4, 2003
7//Comment:
8//---------------------------------------------------------------------------//
9//
11
12#include "BesEmcConstruction.hh"
13#include "BesEmcGeometry.hh"
14//#include "BesDetectorConstruction.hh"
15
16#include "G4VPhysicalVolume.hh"
17#include "G4LogicalVolume.hh"
18#include "G4ThreeVector.hh"
19#include "G4Trap.hh"
20
21//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
22
24 const G4int startID,
25 const G4int endID,
26 const G4int thetaAllCrystals,
27 BesEmcGeometry* besEMCGeometry,
28 const G4int verboseLevel
29 ):fVerboseLevel(0)
30{
31 //for debug
32 //G4Exception("BesCrystalParameterisation::BesCrystalParameterisation() starting........");
33 fBesEmcGeometry = besEMCGeometry;
34 fVerboseLevel = verboseLevel; //if need to debug this class,open it
35 fStartID = startID;
36 fAllCrystals = thetaAllCrystals;
37 fCrystalID = 0;
38 fFlagLeft = true;
39 if (startID>endID||endID>thetaAllCrystals||startID<1)
40 {
41 G4Exception("BesCrystalParameterisation construction: ID of crystal>No avaible!");
42 }
43
44}
45
46//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
47
49{}
50
51//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
52
54(const G4int copyNo, G4VPhysicalVolume* physVol) const
55{
56 //for debug
57 //G4Exception("BesCrystalParameterisation::ComputeTransformation() starting........");
58 ComputeIDAndSide(physVol);
59
60 if(fVerboseLevel>3)
61 {
62 G4cout<<"*BesCrystalParameterisation::ComputeTransformation()*"<<G4endl;
63 G4cout << "copyNo(transfered)=" << copyNo << G4endl
64 << "copyNo(gotten) =" << physVol->GetCopyNo() << G4endl
65 << "fStartID =" << fStartID << G4endl
66 << "fCrystalID =" << fCrystalID << G4endl;
67 G4cout << "point of fBesEmcGeometry=" << fBesEmcGeometry << G4endl;
68 }
69
70 G4double xPosition= fBesEmcGeometry->GetXPosition(fCrystalID);
71 G4double yPosition= fBesEmcGeometry->GetYPosition(fCrystalID);
72 G4double zPosition= fBesEmcGeometry->GetZPosition(fCrystalID);
73 //G4Exception("BesCrystalParameterisation::ComputeTransformation() running........");
74 //G4double xPosition=0,yPosition=0,zPosition=0;
75 if(fFlagLeft) zPosition=-zPosition;
76 G4ThreeVector origin(xPosition,yPosition,zPosition);
77 physVol->SetTranslation(origin);
78
79 //G4double thetaPosition=fBesEmcGeometry->GetThetaPosition(fCrystalID);
80 //G4RotationMatrix *rotateMatrix;
81 //rotateMatrix = new G4RotationMatrix();
82 //if(fFlagLeft)
83 // {
84 // rotateMatrix->rotateZ(-90*deg);
85 // rotateMatrix->rotateX(-180*deg+thetaPosition);
86 // }
87 //else
88 // {
89 // rotateMatrix->rotateZ(-90*deg);
90 // rotateMatrix->rotateX(-thetaPosition);
91 // }
92 //G4double delta = 0*deg;
93 //G4ThreeVector axis = G4ThreeVector(0,0,0);
94 //rotateMatrix->getAngleAxis(delta, axis);
95 if(fVerboseLevel>5)
96 {
97 G4cout << "The crystals are at the position:" << G4endl
98 << origin/cm <<"(cm)" << G4endl;
99 //G4cout << thetaPosition/deg <<"(deg)." << G4endl
100 //<< "The axis of crystals in the world system is: " << G4endl
101 //<< delta/deg << "(deg)(delta) " << G4endl
102 //<< axis << "(Z axis)" << G4endl;
103 }
104 //physVol->SetRotation(rotateMatrix);
105
106}
107
108//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
109
111(G4Trap& trackerChamber, const G4int copyNo,
112 const G4VPhysicalVolume* physVol) const
113{
114 //for debug
115 //G4Exception("BesCrystalParameterisation::ComputeDimensions() starting........");
116 ComputeIDAndSide(physVol);
117
118 G4double zHalfLength = fBesEmcGeometry->GetZHalfLength(fCrystalID);
119 G4double thetaAxis = fBesEmcGeometry->GetThetaAxis(fCrystalID);
120 G4double phiAxis = fBesEmcGeometry->GetPhiAxis(fCrystalID);
121 G4double yHalfLength1 = fBesEmcGeometry->GetYHalfLength1(fCrystalID);
122 G4double xHalfLength1 = fBesEmcGeometry->GetXHalfLength1(fCrystalID);
123 G4double xHalfLength2 = fBesEmcGeometry->GetXHalfLength2(fCrystalID);
124 G4double tanAlpha1 = fBesEmcGeometry->GetTanAlpha1(fCrystalID);
125 G4double yHalfLength2 = fBesEmcGeometry->GetYHalfLength2(fCrystalID);
126 G4double xHalfLength3 = fBesEmcGeometry->GetXHalfLength3(fCrystalID);
127 G4double xHalfLength4 = fBesEmcGeometry->GetXHalfLength4(fCrystalID);
128 G4double tanAlpha2 = fBesEmcGeometry->GetTanAlpha2(fCrystalID);
129
130 if(!fFlagLeft)
131 {
132 phiAxis=-phiAxis;
133 tanAlpha1=-tanAlpha1;
134 tanAlpha2=-tanAlpha2;
135 G4double tmp;
136 tmp=xHalfLength1;
137 xHalfLength1=xHalfLength2;
138 xHalfLength2=tmp;
139 tmp=xHalfLength3;
140 xHalfLength3=xHalfLength4;
141 xHalfLength4=tmp;
142 }
143 if(fVerboseLevel>5)
144 G4cout << "The size of No." << copyNo << " crystal(placed) are:" << G4endl
145 << "zHalfLength =" << zHalfLength/cm << "(cm), " << G4endl
146 << "thetaAxis =" << thetaAxis/deg << "(degree), " << G4endl
147 << "phiAxis =" << phiAxis/deg << "(degree), " << G4endl
148 << "yHalfLength1=" << yHalfLength1/cm << "(cm), " << G4endl
149 << "xHalfLength1=" << xHalfLength1/cm << "(cm), " << G4endl
150 << "xHalfLength2=" << xHalfLength2/cm << "(cm), " << G4endl
151 << "tanAlpha1 =" << tanAlpha1 << "(), " << G4endl
152 << "yHalfLength2=" << yHalfLength2/cm << "(cm), " << G4endl
153 << "xHalfLength3=" << xHalfLength3/cm << "(cm), " << G4endl
154 << "xHalfLength4=" << xHalfLength4/cm << "(cm)." << G4endl
155 << "tanAlpha2 =" << tanAlpha2 << "(), " << G4endl
156 << "(x4-x3)*y1/(x2-x1)/y2="
157 << (xHalfLength4-xHalfLength3)*yHalfLength1/(xHalfLength2-xHalfLength1)/yHalfLength2 << G4endl
158 << "tanAlpha2/tanAlpha1=" << tanAlpha2/tanAlpha1 <<G4endl;
159 //G4cout << fStartID << "-->This is an output sentence for debug." << G4endl;
160
161 trackerChamber.SetAllParameters(
162 zHalfLength,
163 thetaAxis,
164 phiAxis,
165 yHalfLength1,
166 xHalfLength1,
167 xHalfLength2,
168 tanAlpha1,
169 yHalfLength2,
170 xHalfLength3,
171 xHalfLength4,
172 tanAlpha2);
173
174}
175
176//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
177G4VSolid* BesCrystalParameterisation::ComputeSolid(const G4int copyNo,
178 G4VPhysicalVolume *pPhysicalVol)
179{
180 if(0) G4cout<<copyNo<<G4endl;
181 ComputeIDAndSide(pPhysicalVol);
182 return pPhysicalVol->GetLogicalVolume()->GetSolid();
183}
184
185G4Material* BesCrystalParameterisation::ComputeMaterial(const G4int copyNo,
186 G4VPhysicalVolume *pPhysicalVol, const G4VTouchable *parentTouch)
187{
188 if(0) G4cout<<copyNo<<parentTouch<<G4endl;
189 ComputeIDAndSide(pPhysicalVol);
190 G4int nBSCTheta=fBesEmcGeometry->GetBSCNbTheta();
191 //if(fVerboseLevel>5)
192 //G4cout <<"******BesCrystalParameterisation::ComputeMaterial******"<<G4endl
193 // <<"Number of all crystals=" << nBSCTheta << G4endl
194 // <<"No of current crystal =" << pPhysicalVol->GetCopyNo() << G4endl
195 // <<"*******************************************************"<<G4endl;
196 if(pPhysicalVol->GetCopyNo()>2*nBSCTheta)
198 else
200}
201
203 const G4VPhysicalVolume* pPhyVol)const
204{
205 //for debug
206 //G4Exception("BesCrystalParameterisation::ComputeIDAndSide() starting......");
207 G4int* pCrystalID=const_cast<G4int*>(&fCrystalID);
208 G4bool* pFlagLeft=const_cast<G4bool*>(&fFlagLeft);
209 G4int* pVerboseLevel=const_cast<G4int*>(&fVerboseLevel);
210
211 *pVerboseLevel=
213
214 //*pCrystalID=pPhyVol->GetMotherPhysical()->GetCopyNo();
215 *pCrystalID=-1;
216 for(G4int i=fStartID;i<=fAllCrystals;i++)
217 {
218 //G4cout << fBesEmcGeometry->GetPhysiBSCCrystal(i) << ".vs."
219 // << pPhyVol << G4endl;
220 if(fBesEmcGeometry->GetPhysiBSCCrystal(i)==pPhyVol)
221 {
222 *pCrystalID=i;
223 }
224 }
225 if(*pCrystalID==-1)
226 G4Exception("The point of PhysicCrystal error!!!!!!!!!!!");
227
228 //*pCrystalID=pPhyVol->GetCopyNo();
229 //if(fVerboseLevel>6)
230 //G4cout<<"******BesCrystalParameterisation::ComputeIDAndSide******"<<G4endl
231 // <<"point of pPhyVol =" << pPhyVol << G4endl
232 // <<"point of mother =" << pPhyVol->GetMother() << G4endl
233 // <<"CopyNo of pPhyVol=" << pPhyVol->GetCopyNo() << G4endl
234 // <<"CopyNo of mother =" << pPhyVol->GetMother()->GetCopyNo() << G4endl
235 // <<"********************************************************"<<G4endl;
236
237 if(fCrystalID>fAllCrystals/2)
238 {
239 *pFlagLeft=false;
240 *pCrystalID=fCrystalID-fAllCrystals/2;
241 }
242 else
243 {
244 *pFlagLeft=true;
245 *pCrystalID=fAllCrystals/2-fCrystalID+1;
246 }
247 *pCrystalID=*pCrystalID-1;
248}
const DifPoint origin
G4VSolid * ComputeSolid(const G4int, G4VPhysicalVolume *)
BesCrystalParameterisation(const G4int, const G4int, const G4int, BesEmcGeometry *, const G4int)
void ComputeTransformation(const G4int, G4VPhysicalVolume *) const
virtual void ComputeDimensions(G4Box &, const G4int, const G4VPhysicalVolume *) const
void ComputeIDAndSide(const G4VPhysicalVolume *) const
G4Material * ComputeMaterial(const G4int, G4VPhysicalVolume *, const G4VTouchable *parentTouch=0)
static BesEmcConstruction * GetBesEmcConstruction()
G4Material * GetCasingMaterial()
G4Material * GetCrystalMaterial()
G4double GetYPosition(G4int NbCrystal)
G4double GetZHalfLength(G4int NbCrystal)
G4double GetXHalfLength2(G4int NbCrystal)
G4double GetTanAlpha2(G4int NbCrystal)
G4double GetTanAlpha1(G4int NbCrystal)
G4double GetYHalfLength1(G4int NbCrystal)
G4double GetThetaAxis(G4int NbCrystal)
G4double GetXHalfLength4(G4int NbCrystal)
G4double GetYHalfLength2(G4int NbCrystal)
G4VPhysicalVolume * GetPhysiBSCCrystal(G4int NbCrystal)
G4double GetXPosition(G4int NbCrystal)
G4double GetZPosition(G4int NbCrystal)
G4int GetBSCNbTheta()
G4double GetXHalfLength1(G4int NbCrystal)
G4double GetPhiAxis(G4int NbCrystal)
G4double GetXHalfLength3(G4int NbCrystal)