BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
KalFitReadGdml.cxx
Go to the documentation of this file.
1#include "G4Geo/BesG4Geo.h"
2#include "G4Geo/MdcG4Geo.h"
3#include "G4Material.hh"
4#include "G4Processor/GDMLProcessor.h"
5#include "G4Tubs.hh"
6#include "KalFitAlg.h"
7#include "KalFitAlg/KalFitTrack.h"
8
10
11 int i( 0 );
12 double Z( 0. ), A( 0. ), Ionization( 0. ), Density( 0. ), Radlen( 0. );
13
14 G4LogicalVolume* logicalMdc = 0;
15 MdcG4Geo* aMdcG4Geo = new MdcG4Geo();
16 logicalMdc = aMdcG4Geo->GetTopVolume();
17
18 /// mdcgas
19 G4Material* mdcMaterial = logicalMdc->GetMaterial();
20
21 for ( i = 0; i < mdcMaterial->GetElementVector()->size(); i++ )
22 {
23 Z += ( mdcMaterial->GetElement( i )->GetZ() ) * ( mdcMaterial->GetFractionVector()[i] );
24 A += ( mdcMaterial->GetElement( i )->GetA() ) * ( mdcMaterial->GetFractionVector()[i] );
25 }
26 Ionization = mdcMaterial->GetIonisation()->GetMeanExcitationEnergy();
27 Density = mdcMaterial->GetDensity() / ( g / cm3 );
28 Radlen = mdcMaterial->GetRadlen();
29 std::cout << "mdcgas: Z: " << Z << " A: " << ( A / ( g / mole ) )
30 << " Ionization: " << ( Ionization / eV ) << " Density: " << Density
31 << " Radlen: " << Radlen << std::endl;
32 KalFitMaterial FitMdcMaterial( Z, A / g / mole, Ionization / eV, Density, Radlen / 10. );
33 _BesKalmanFitMaterials.push_back( FitMdcMaterial );
34 KalFitTrack::mdcGasRadlen_ = Radlen / 10.;
35
36 /// inner wall shield fiml1 Al by wangll 2012-09-07
37 G4LogicalVolume* innerWallFilm1Volume = const_cast<G4LogicalVolume*>(
38 GDMLProcessor::GetInstance()->GetLogicalVolume( "LogicalMdcInnerFilm1" ) );
39 G4Material* innerWallFilm1Material = innerWallFilm1Volume->GetMaterial();
40 G4Tubs* innerwallFilm1Tub = dynamic_cast<G4Tubs*>( innerWallFilm1Volume->GetSolid() );
41
42 Z = 0.;
43 A = 0.;
44 for ( i = 0; i < innerWallFilm1Material->GetElementVector()->size(); i++ )
45 {
46 Z += ( innerWallFilm1Material->GetElement( i )->GetZ() ) *
47 ( innerWallFilm1Material->GetFractionVector()[i] );
48 A += ( innerWallFilm1Material->GetElement( i )->GetA() ) *
49 ( innerWallFilm1Material->GetFractionVector()[i] );
50 }
51
52 Ionization = innerWallFilm1Material->GetIonisation()->GetMeanExcitationEnergy();
53 Density = innerWallFilm1Material->GetDensity() / ( g / cm3 );
54 Radlen = innerWallFilm1Material->GetRadlen();
55 std::cout << "Mdc innerwall Film1, Al: Z: " << Z << " A: " << ( A / ( g / mole ) )
56 << " Ionization: " << ( Ionization / eV ) << " Density: " << Density
57 << " Radlen: " << Radlen << std::endl;
58 KalFitMaterial FitInnerwallFilm1Material( Z, A / g / mole, Ionization / eV, Density,
59 Radlen / 10. );
60 _BesKalmanFitMaterials.push_back( FitInnerwallFilm1Material );
61
62 /// inner wall CarbonFiber by wll 2012-09-06
63 G4LogicalVolume* innerwallVolume = const_cast<G4LogicalVolume*>(
64 GDMLProcessor::GetInstance()->GetLogicalVolume( "logicalMdcSegment2" ) );
65 G4Material* innerwallMaterial = innerwallVolume->GetMaterial();
66 G4Tubs* innerwallTub = dynamic_cast<G4Tubs*>( innerwallVolume->GetSolid() );
67
68 Z = 0.;
69 A = 0.;
70 for ( i = 0; i < innerwallMaterial->GetElementVector()->size(); i++ )
71 {
72 Z += ( innerwallMaterial->GetElement( i )->GetZ() ) *
73 ( innerwallMaterial->GetFractionVector()[i] );
74 A += ( innerwallMaterial->GetElement( i )->GetA() ) *
75 ( innerwallMaterial->GetFractionVector()[i] );
76 }
77
78 Ionization = innerwallMaterial->GetIonisation()->GetMeanExcitationEnergy();
79 Density = innerwallMaterial->GetDensity() / ( g / cm3 );
80 Radlen = innerwallMaterial->GetRadlen();
81 std::cout << "Mdc innerwall, Al: Z: " << Z << " A: " << ( A / ( g / mole ) )
82 << " Ionization: " << ( Ionization / eV ) << " Density: " << Density
83 << " Radlen: " << Radlen << std::endl;
84 KalFitMaterial FitInnerwallMaterial( Z, A / g / mole, Ionization / eV, Density,
85 Radlen / 10. );
86 _BesKalmanFitMaterials.push_back( FitInnerwallMaterial );
87
88 /// inner wall shield film0 Al by wangll 2012-09-07
89 G4LogicalVolume* innerWallFilm0Volume = const_cast<G4LogicalVolume*>(
90 GDMLProcessor::GetInstance()->GetLogicalVolume( "LogicalMdcInnerFilm0" ) );
91 G4Material* innerWallFilm0Material = innerWallFilm0Volume->GetMaterial();
92 G4Tubs* innerwallFilm0Tub = dynamic_cast<G4Tubs*>( innerWallFilm0Volume->GetSolid() );
93
94 Z = 0.;
95 A = 0.;
96 for ( i = 0; i < innerWallFilm0Material->GetElementVector()->size(); i++ )
97 {
98 Z += ( innerWallFilm0Material->GetElement( i )->GetZ() ) *
99 ( innerWallFilm0Material->GetFractionVector()[i] );
100 A += ( innerWallFilm0Material->GetElement( i )->GetA() ) *
101 ( innerWallFilm0Material->GetFractionVector()[i] );
102 }
103
104 Ionization = innerWallFilm0Material->GetIonisation()->GetMeanExcitationEnergy();
105 Density = innerWallFilm0Material->GetDensity() / ( g / cm3 );
106 Radlen = innerWallFilm0Material->GetRadlen();
107 std::cout << "Mdc innerwall Film0, Al: Z: " << Z << " A: " << ( A / ( g / mole ) )
108 << " Ionization: " << ( Ionization / eV ) << " Density: " << Density
109 << " Radlen: " << Radlen << std::endl;
110 KalFitMaterial FitInnerwallFilm0Material( Z, A / g / mole, Ionization / eV, Density,
111 Radlen / 10. );
112 _BesKalmanFitMaterials.push_back( FitInnerwallFilm0Material );
113
114 ///////////////////////////////////////////////////////////////////////////////////////////////////
115 G4LogicalVolume* logicalBes = 0;
116 BesG4Geo* aBesG4Geo = new BesG4Geo();
117 logicalBes = aBesG4Geo->GetTopVolume();
118
119 /// air
120 G4LogicalVolume* logicalAirVolume = const_cast<G4LogicalVolume*>(
121 GDMLProcessor::GetInstance()->GetLogicalVolume( "logicalWorld" ) );
122 G4Material* airMaterial = logicalAirVolume->GetMaterial();
123 Z = 0.;
124 A = 0.;
125 for ( i = 0; i < airMaterial->GetElementVector()->size(); i++ )
126 {
127 Z += ( airMaterial->GetElement( i )->GetZ() ) * ( airMaterial->GetFractionVector()[i] );
128 A += ( airMaterial->GetElement( i )->GetA() ) * ( airMaterial->GetFractionVector()[i] );
129 }
130
131 Ionization = airMaterial->GetIonisation()->GetMeanExcitationEnergy();
132 Density = airMaterial->GetDensity() / ( g / cm3 );
133 Radlen = airMaterial->GetRadlen();
134 std::cout << "air: Z: " << Z << " A: " << ( A / ( g / mole ) )
135 << " Ionization: " << ( Ionization / eV ) << " Density: " << Density
136 << " Radlen: " << Radlen << std::endl;
137 KalFitMaterial FitAirMaterial( Z, A / g / mole, Ionization / eV, Density, Radlen / 10. );
138 _BesKalmanFitMaterials.push_back( FitAirMaterial );
139
140 /// outer beryllium pipe
141 G4LogicalVolume* logicalOuterBeVolume = const_cast<G4LogicalVolume*>(
142 GDMLProcessor::GetInstance()->GetLogicalVolume( "logicalouterBe" ) );
143 G4Material* outerBeMaterial = logicalOuterBeVolume->GetMaterial();
144
145 G4Tubs* outerBeTub = dynamic_cast<G4Tubs*>( logicalOuterBeVolume->GetSolid() );
146 Z = 0.;
147 A = 0.;
148 for ( i = 0; i < outerBeMaterial->GetElementVector()->size(); i++ )
149 {
150 Z += ( outerBeMaterial->GetElement( i )->GetZ() ) *
151 ( outerBeMaterial->GetFractionVector()[i] );
152 A += ( outerBeMaterial->GetElement( i )->GetA() ) *
153 ( outerBeMaterial->GetFractionVector()[i] );
154 }
155 Ionization = outerBeMaterial->GetIonisation()->GetMeanExcitationEnergy();
156 Density = outerBeMaterial->GetDensity() / ( g / cm3 );
157 Radlen = outerBeMaterial->GetRadlen();
158 std::cout << "outer beryllium: Z: " << Z << " A: " << ( A / ( g / mole ) )
159 << " Ionization: " << ( Ionization / eV ) << " Density: " << Density
160 << " Radlen: " << Radlen << std::endl;
161 KalFitMaterial FitOuterBeMaterial( Z, A / g / mole, Ionization / eV, Density, Radlen / 10. );
162 _BesKalmanFitMaterials.push_back( FitOuterBeMaterial );
163
164 /// cooling oil
165 G4LogicalVolume* logicalOilLayerVolume = const_cast<G4LogicalVolume*>(
166 GDMLProcessor::GetInstance()->GetLogicalVolume( "logicaloilLayer" ) );
167 G4Material* oilLayerMaterial = logicalOilLayerVolume->GetMaterial();
168 G4Tubs* oilLayerTub = dynamic_cast<G4Tubs*>( logicalOilLayerVolume->GetSolid() );
169
170 Z = 0.;
171 A = 0.;
172 for ( i = 0; i < oilLayerMaterial->GetElementVector()->size(); i++ )
173 {
174 Z += ( oilLayerMaterial->GetElement( i )->GetZ() ) *
175 ( oilLayerMaterial->GetFractionVector()[i] );
176 A += ( oilLayerMaterial->GetElement( i )->GetA() ) *
177 ( oilLayerMaterial->GetFractionVector()[i] );
178 }
179 Ionization = oilLayerMaterial->GetIonisation()->GetMeanExcitationEnergy();
180 Density = oilLayerMaterial->GetDensity() / ( g / cm3 );
181 Radlen = oilLayerMaterial->GetRadlen();
182 std::cout << "cooling oil: Z: " << Z << " A: " << ( A / ( g / mole ) )
183 << " Ionization: " << ( Ionization / eV ) << " Density: " << Density
184 << " Radlen: " << Radlen << std::endl;
185 KalFitMaterial FitOilLayerMaterial( Z, A / g / mole, Ionization / eV, Density,
186 Radlen / 10. );
187 _BesKalmanFitMaterials.push_back( FitOilLayerMaterial );
188
189 /// inner beryllium pipe
190 G4LogicalVolume* logicalInnerBeVolume = const_cast<G4LogicalVolume*>(
191 GDMLProcessor::GetInstance()->GetLogicalVolume( "logicalinnerBe" ) );
192 G4Material* innerBeMaterial = logicalInnerBeVolume->GetMaterial();
193 G4Tubs* innerBeTub = dynamic_cast<G4Tubs*>( logicalInnerBeVolume->GetSolid() );
194 Z = 0.;
195 A = 0.;
196 for ( i = 0; i < innerBeMaterial->GetElementVector()->size(); i++ )
197 {
198 Z += ( innerBeMaterial->GetElement( i )->GetZ() ) *
199 ( innerBeMaterial->GetFractionVector()[i] );
200 A += ( innerBeMaterial->GetElement( i )->GetA() ) *
201 ( innerBeMaterial->GetFractionVector()[i] );
202 }
203
204 Ionization = innerBeMaterial->GetIonisation()->GetMeanExcitationEnergy();
205 Density = innerBeMaterial->GetDensity() / ( g / cm3 );
206 Radlen = innerBeMaterial->GetRadlen();
207 std::cout << "inner beryllium: Z: " << Z << " A: " << ( A / ( g / mole ) )
208 << " Ionization: " << ( Ionization / eV ) << " Density: " << Density
209 << " Radlen: " << Radlen << std::endl;
210 KalFitMaterial FitInnerBeMaterial( Z, A / g / mole, Ionization / eV, Density, Radlen / 10. );
211 _BesKalmanFitMaterials.push_back( FitInnerBeMaterial );
212
213 /// gold
214 G4LogicalVolume* logicalGoldLayerVolume = const_cast<G4LogicalVolume*>(
215 GDMLProcessor::GetInstance()->GetLogicalVolume( "logicalgoldLayer" ) );
216 G4Material* goldLayerMaterial = logicalGoldLayerVolume->GetMaterial();
217 G4Tubs* goldLayerTub = dynamic_cast<G4Tubs*>( logicalGoldLayerVolume->GetSolid() );
218
219 Z = 0.;
220 A = 0.;
221 for ( i = 0; i < goldLayerMaterial->GetElementVector()->size(); i++ )
222 {
223 Z += ( goldLayerMaterial->GetElement( i )->GetZ() ) *
224 ( goldLayerMaterial->GetFractionVector()[i] );
225 A += ( goldLayerMaterial->GetElement( i )->GetA() ) *
226 ( goldLayerMaterial->GetFractionVector()[i] );
227 }
228 Ionization = goldLayerMaterial->GetIonisation()->GetMeanExcitationEnergy();
229 Density = goldLayerMaterial->GetDensity() / ( g / cm3 );
230 Radlen = goldLayerMaterial->GetRadlen();
231 std::cout << "gold layer: Z: " << Z << " A: " << ( A / ( g / mole ) )
232 << " Ionization: " << ( Ionization / eV ) << " Density: " << Density
233 << " Radlen: " << Radlen << std::endl;
234 KalFitMaterial FitGoldLayerMaterial( Z, A / g / mole, Ionization / eV, Density,
235 Radlen / 10. );
236 _BesKalmanFitMaterials.push_back( FitGoldLayerMaterial );
237
238 /// now construct the cylinders
239 double radius, thick, length, z0;
240
241 /// film1 of the innerwall of inner drift chamber
242 radius = innerwallFilm1Tub->GetInnerRadius() / ( cm );
243 thick =
244 innerwallFilm1Tub->GetOuterRadius() / (cm)-innerwallFilm1Tub->GetInnerRadius() / ( cm );
245 length = 2.0 * innerwallFilm1Tub->GetZHalfLength() / ( cm );
246 z0 = 0.0;
247 std::cout << "innerwallFilm1: "
248 << " radius: " << radius << " thick:" << thick << " length: " << length
249 << std::endl;
250 KalFitCylinder innerwallFilm1Cylinder( &_BesKalmanFitMaterials[1], radius, thick, length,
251 z0 );
252 _BesKalmanFitWalls.push_back( innerwallFilm1Cylinder );
253
254 /// innerwall of inner drift chamber
255 radius = innerwallTub->GetInnerRadius() / ( cm );
256 thick = innerwallTub->GetOuterRadius() / (cm)-innerwallTub->GetInnerRadius() / ( cm );
257 length = 2.0 * innerwallTub->GetZHalfLength() / ( cm );
258 z0 = 0.0;
259 std::cout << "innerwall: "
260 << " radius: " << radius << " thick:" << thick << " length: " << length
261 << std::endl;
262 KalFitCylinder innerwallCylinder( &_BesKalmanFitMaterials[2], radius, thick, length, z0 );
263 _BesKalmanFitWalls.push_back( innerwallCylinder );
264
265 /// film0 of the innerwall of inner drift chamber
266 radius = innerwallFilm0Tub->GetInnerRadius() / ( cm );
267 thick =
268 innerwallFilm0Tub->GetOuterRadius() / (cm)-innerwallFilm0Tub->GetInnerRadius() / ( cm );
269 length = 2.0 * innerwallFilm0Tub->GetZHalfLength() / ( cm );
270 z0 = 0.0;
271 std::cout << "innerwallFilm0: "
272 << " radius: " << radius << " thick:" << thick << " length: " << length
273 << std::endl;
274 KalFitCylinder innerwallFilm0Cylinder( &_BesKalmanFitMaterials[3], radius, thick, length,
275 z0 );
276 _BesKalmanFitWalls.push_back( innerwallFilm0Cylinder );
277
278 /// outer air, be attention the calculation of the radius and thick of the air cylinder is
279 /// special
280 radius = outerBeTub->GetOuterRadius() / ( cm );
281 thick = innerwallFilm0Tub->GetInnerRadius() / ( cm )-outerBeTub->GetOuterRadius() / ( cm );
282 length = 2.0 * innerwallTub->GetZHalfLength() / ( cm );
283 z0 = 0.0;
284 std::cout << "outer air: "
285 << " radius: " << radius << " thick:" << thick << " length: " << length
286 << std::endl;
287 KalFitCylinder outerAirCylinder( &_BesKalmanFitMaterials[4], radius, thick, length, z0 );
288 _BesKalmanFitWalls.push_back( outerAirCylinder );
289
290 /// outer Beryllium layer
291 radius = outerBeTub->GetInnerRadius() / ( cm );
292 thick = outerBeTub->GetOuterRadius() / (cm)-outerBeTub->GetInnerRadius() / ( cm );
293 length = 2.0 * outerBeTub->GetZHalfLength() / ( cm );
294 z0 = 0.0;
295 std::cout << "outer Be: "
296 << " radius: " << radius << " thick:" << thick << " length: " << length
297 << std::endl;
298 KalFitCylinder outerBeCylinder( &_BesKalmanFitMaterials[5], radius, thick, length, z0 );
299 _BesKalmanFitWalls.push_back( outerBeCylinder );
300
301 /// oil layer
302 radius = oilLayerTub->GetInnerRadius() / ( cm );
303 thick = oilLayerTub->GetOuterRadius() / (cm)-oilLayerTub->GetInnerRadius() / ( cm );
304 length = 2.0 * oilLayerTub->GetZHalfLength() / ( cm );
305 z0 = 0.0;
306 std::cout << "oil layer: "
307 << " radius: " << radius << " thick:" << thick << " length: " << length
308 << std::endl;
309 KalFitCylinder oilLayerCylinder( &_BesKalmanFitMaterials[6], radius, thick, length, z0 );
310 _BesKalmanFitWalls.push_back( oilLayerCylinder );
311
312 /// inner Beryllium layer
313 radius = innerBeTub->GetInnerRadius() / ( cm );
314 thick = innerBeTub->GetOuterRadius() / (cm)-innerBeTub->GetInnerRadius() / ( cm );
315 length = 2.0 * innerBeTub->GetZHalfLength() / ( cm );
316 z0 = 0.0;
317 std::cout << "inner Be: "
318 << " radius: " << radius << " thick:" << thick << " length: " << length
319 << std::endl;
320 KalFitCylinder innerBeCylinder( &_BesKalmanFitMaterials[7], radius, thick, length, z0 );
321 _BesKalmanFitWalls.push_back( innerBeCylinder );
322
323 /// gold layer
324 radius = goldLayerTub->GetInnerRadius() / ( cm );
325 thick = goldLayerTub->GetOuterRadius() / (cm)-goldLayerTub->GetInnerRadius() / ( cm );
326 length = 2.0 * goldLayerTub->GetZHalfLength() / ( cm );
327 z0 = 0.0;
328 std::cout << "gold layer: "
329 << " radius: " << radius << " thick:" << thick << " length: " << length
330 << std::endl;
331 KalFitCylinder goldLayerCylinder( &_BesKalmanFitMaterials[8], radius, thick, length, z0 );
332 _BesKalmanFitWalls.push_back( goldLayerCylinder );
333
334 std::cout << "exit from KalFitAlg::setBesFromGdml()" << std::endl;
335}
void setBesFromGdml(void)
Cylinder is an Element whose shape is a cylinder.
G4LogicalVolume * GetTopVolume()
Get the top(world) volume;.