9 #include <Geant4/G4Box.hh>
10 #include <Geant4/G4Tubs.hh>
11 #include <Geant4/G4SubtractionSolid.hh>
12 #include <Geant4/G4Cons.hh>
13 #include <Geant4/G4LogicalVolume.hh>
14 #include <Geant4/G4PVPlacement.hh>
15 #include <Geant4/G4RotationMatrix.hh>
16 #include <Geant4/G4String.hh>
17 #include <Geant4/G4SystemOfUnits.hh>
18 #include <Geant4/G4ThreeVector.hh>
19 #include <Geant4/G4Transform3D.hh>
20 #include <Geant4/G4Types.hh>
21 #include <Geant4/G4VPhysicalVolume.hh>
22 #include <Geant4/G4PVParameterised.hh>
23 #include <Geant4/G4PVReplica.hh>
24 #include <Geant4/G4NistManager.hh>
25 #include <Geant4/G4OpticalSurface.hh>
26 #include <Geant4/G4LogicalSkinSurface.hh>
27 #include <Geant4/G4LogicalBorderSurface.hh>
48 , _place_in_x(0.0 *
mm)
49 , _place_in_y(0.0 *
mm)
50 , _place_in_z(4000.0 *
mm)
51 , _center_offset_x(0.0 *
mm)
52 , _center_offset_y(0.0 *
mm)
53 , _quadratic_detector(0)
65 , _tower_readout(0.5 *
mm)
68 , _tower_dz(1000.0 *
mm)
69 , _scintFiber_diam(1.0 *
mm)
70 , _cerenkovFiber_diam(1.0 *
mm)
71 , _cerenkovFiber_material(0)
72 , _tower_makeNotched(0)
73 , _absorber_Material(0)
74 , _materialScintillator(
"G4_POLYSTYRENE")
75 , _materialAbsorber(
"G4_Fe")
80 , _towerlogicnameprefix(
"hdrcaloTower")
81 , _superdetector(
"NONE")
82 , _mapping_tower_file(
"")
90 if (volume->GetName().find(
"scintillator") != string::npos)
97 else if (volume->GetName().find(
"cherenkov") != string::npos)
105 else if (volume->GetName().find(
"absorber") != string::npos)
112 else if (volume->GetName().find(
"envelope") != string::npos)
126 cout <<
"PHG4ForwardDualReadoutDetector: Begin Construction" << endl;
135 G4VSolid* drcalo_envelope_solid;
138 G4VSolid* beampipe_cutout =
new G4Cons(
"hdrcalo_beampipe_cutout",
143 drcalo_envelope_solid =
new G4Box(
"hdrcalo_envelope_solid_precut",
147 drcalo_envelope_solid =
new G4SubtractionSolid(G4String(
"hdrcalo_envelope_solid"), drcalo_envelope_solid, beampipe_cutout
148 , 0 ,G4ThreeVector( 0 , 0 ,0.));
150 drcalo_envelope_solid =
new G4Cons(
"hdrcalo_envelope_solid",
157 G4LogicalVolume* drcalo_envelope_log =
new G4LogicalVolume(drcalo_envelope_solid, Air, G4String(
"hdrcalo_envelope"), 0, 0, 0);
162 G4RotationMatrix drcalo_rotm;
168 ostringstream name_envelope;
169 name_envelope.str(
"");
173 drcalo_envelope_log, name_envelope.str().c_str(), logicWorld, 0,
false,
OverlapCheck());
176 G4LogicalVolume* singletower;
184 for(
int row=rowNtow;row>=-rowNtow;row--){
187 int currRowNtow = (int) ( ( 2* sqrt(pow(
_rMax1,2)-pow( (
abs(row)*
_tower_dy) ,2)) ) / _tower_dy );
188 if(currRowNtow==0)
continue;
190 if ( currRowNtow % 2 == 0) currRowNtow-=1;
196 int currRowNtowInner = (int) ( ( 2* sqrt(pow(
_rMin1,2)-pow( (
abs(row)*_tower_dy) ,2)) ) /
_tower_dy );
199 if ( currRowNtowInner % 2 == 0) currRowNtowInner+=1;
202 if ( currRowNtowInner % 2 == 0) currRowNtowInner+=1;
205 if ( offsetrows % 2 != 1) offsetrows-=1;
207 int currRowNtowMod = currRowNtow;
209 currRowNtowMod = 2*rowNtow;
213 auto DRCalRowLeftSolid =
new G4Box(
"DRCalRowLeftBox" +
std::to_string(row), ((currRowNtowMod - currRowNtowInner) / 2 + offsetrows) *
_tower_dx / 2.0,_tower_dy / 2.0,
_tower_dz / 2.0);
214 auto DRCalRowLeftLogical =
new G4LogicalVolume(DRCalRowLeftSolid,material_air,
"DRCalRowLeftLogical" +
std::to_string(row));
216 new G4PVReplica(
"DRCalRowLeftPhysical" +
std::to_string(row),singletower,DRCalRowLeftLogical,
217 kXAxis,((currRowNtowMod - currRowNtowInner) / 2 + offsetrows),
_tower_dx);
219 ostringstream name_row_twr_left;
220 name_row_twr_left.str(
"");
222 new G4PVPlacement(0, G4ThreeVector( - ( ( currRowNtowInner / 2.0 ) *
_tower_dx ) - ( ((currRowNtowMod - currRowNtowInner) / 2 - offsetrows) *
_tower_dx / 2.0 ), (row*_tower_dy), 0),
223 DRCalRowLeftLogical, name_row_twr_left.str().c_str(), drcalo_envelope_log, 0,
false,
OverlapCheck());
226 auto DRCalRowRightSolid =
new G4Box(
"DRCalRowRightBox" +
std::to_string(row), ((currRowNtowMod - currRowNtowInner) / 2 - offsetrows ) *
_tower_dx / 2.0,_tower_dy / 2.0,
_tower_dz / 2.0);
227 auto DRCalRowRightLogical =
new G4LogicalVolume(DRCalRowRightSolid,material_air,
"DRCalRowRightLogical" +
std::to_string(row));
229 new G4PVReplica(
"DRCalRowRightPhysical" +
std::to_string(row),singletower,DRCalRowRightLogical,
230 kXAxis,((currRowNtowMod - currRowNtowInner) / 2 - offsetrows ),
_tower_dx);
232 ostringstream name_row_twr_right;
233 name_row_twr_right.str(
"");
235 new G4PVPlacement(0, G4ThreeVector( ( ( currRowNtowInner / 2.0 ) *
_tower_dx ) + ( ((currRowNtowMod - currRowNtowInner) / 2 + offsetrows) *
_tower_dx / 2.0 ), (row*_tower_dy), 0),
236 DRCalRowRightLogical, name_row_twr_right.str().c_str(), drcalo_envelope_log, 0,
false,
OverlapCheck());
240 int currRowNtowInner = (int) ( ( 2* sqrt(pow(
_rMin1,2)-pow( (
abs(row)*_tower_dy) - (_tower_dy/2.0) ,2)) ) / _tower_dy );
242 if ( currRowNtowInner % 2 != 0) currRowNtowInner-=1;
244 int currRowNtowMod = currRowNtow;
246 currRowNtowMod = rowNtow;
249 auto DRCalRowSolid =
new G4Box(
"DRCalRowBox" +
std::to_string(row), (currRowNtowMod - currRowNtowInner) / 2 *
_tower_dx / 2.0,_tower_dy / 2.0,
_tower_dz / 2.0);
250 auto DRCalRowLogical =
new G4LogicalVolume(DRCalRowSolid,material_air,
"DRCalRowLogical" +
std::to_string(row));
252 new G4PVReplica(
"DRCalRowPhysical" +
std::to_string(row),singletower,DRCalRowLogical,
253 kXAxis,(currRowNtowMod - currRowNtowInner) / 2,
_tower_dx);
255 ostringstream name_row_twr;
256 name_row_twr.str(
"");
258 new G4PVPlacement(0, G4ThreeVector( - ( ( currRowNtowInner / 2.0 ) *
_tower_dx ) - ( (currRowNtowMod - currRowNtowInner) / 2 *
_tower_dx / 2.0 ), (row*_tower_dy), 0),
259 DRCalRowLogical, name_row_twr.str().c_str(), drcalo_envelope_log, 0,
false,
OverlapCheck());
261 ostringstream name_row_twr2;
262 name_row_twr2.str(
"");
264 new G4PVPlacement(0, G4ThreeVector( ( ( currRowNtowInner / 2.0 ) *
_tower_dx ) + ( (currRowNtowMod - currRowNtowInner) / 2 *
_tower_dx / 2.0 ), (row*_tower_dy), 0),
265 DRCalRowLogical, name_row_twr2.str().c_str(), drcalo_envelope_log, 0,
false,
OverlapCheck());
273 auto DRCalRowLogical =
new G4LogicalVolume(DRCalRowSolid,material_air,
"DRCalRowLogical" +
std::to_string(row));
275 new G4PVReplica(
"DRCalRowPhysical" +
std::to_string(row),singletower,DRCalRowLogical,
278 ostringstream name_row_twr;
279 name_row_twr.str(
"");
281 new G4PVPlacement(0, G4ThreeVector(0, (row*_tower_dy), 0),
282 DRCalRowLogical, name_row_twr.str().c_str(), drcalo_envelope_log, 0,
false,
OverlapCheck());
287 auto DRCalRowLogical =
new G4LogicalVolume(DRCalRowSolid,material_air,
"DRCalRowLogical" +
std::to_string(row));
289 new G4PVReplica(
"DRCalRowPhysical" +
std::to_string(row),singletower,DRCalRowLogical,
292 ostringstream name_row_twr;
293 name_row_twr.str(
"");
295 new G4PVPlacement(0, G4ThreeVector(0, (row*_tower_dy), 0),
296 DRCalRowLogical, name_row_twr.str().c_str(), drcalo_envelope_log, 0,
false,
OverlapCheck());
310 cout <<
"PHG4ForwardDualReadoutDetector: Build logical volume for single tower..." << endl;
316 G4VSolid* base_tower_solid =
new G4Box(G4String(
"base_tower_solid"),
321 G4LogicalVolume* base_tower_logic =
new G4LogicalVolume(base_tower_solid,
328 G4VSolid* single_tower_solid =
new G4Box(G4String(
"single_tower_solid"),
333 G4LogicalVolume* single_tower_logic =
new G4LogicalVolume(single_tower_solid,
335 "single_tower_logic",
343 G4double airgap = 0.1 *
mm;
346 G4VSolid* single_cutout_tube =
new G4Tubs(G4String(
"single_cutout_tube"),
348 ( diameter_fiber + airgap ) / 2.0,
351 G4VSolid* single_cutout_tube_cherenkov =
new G4Tubs(G4String(
"single_cutout_tube_cherenkov"),
353 ( diameter_fiber_cherenkov + airgap ) / 2.0,
357 G4VSolid* single_cutout_box =
new G4Box(G4String(
"single_cutout_box"),
358 ( diameter_fiber + airgap ) / 2.0,
359 1.03 * ( diameter_fiber + airgap ) / 4.0,
361 G4VSolid* single_cutout_box_cherenkov =
new G4Box(G4String(
"single_cutout_box_cherenkov"),
362 ( diameter_fiber_cherenkov + airgap ) / 2.0,
363 1.03 * ( diameter_fiber_cherenkov + airgap ) / 4.0,
366 G4VSolid* solid_absorber_cher =
new G4Box(G4String(
"solid_absorber_temp_cher"),
370 G4VSolid* solid_absorber_scin =
new G4Box(G4String(
"solid_absorber_temp_scin"),
377 solid_absorber_cher =
new G4SubtractionSolid(G4String(
"solid_absorber_cher_f1"), solid_absorber_cher, single_cutout_tube_cherenkov
378 , 0 ,G4ThreeVector( 0 , ( (
_tower_readout + addtowsize) / 4.0 ) - ( ( diameter_fiber_cherenkov + airgap ) / 2.0 ) ,0.));
379 solid_absorber_scin =
new G4SubtractionSolid(G4String(
"solid_absorber_scin_f1"), solid_absorber_scin, single_cutout_tube
380 , 0 ,G4ThreeVector( 0 , ( (
_tower_readout + addtowsize) / 4.0 ) - ( ( diameter_fiber + airgap ) / 2.0 ) ,0.));
382 solid_absorber_cher =
new G4SubtractionSolid(G4String(
"solid_absorber_cher_box1"), solid_absorber_cher, single_cutout_box_cherenkov
383 , 0 ,G4ThreeVector( 0 , ( (
_tower_readout + addtowsize) / 4.0 ) - ( ( diameter_fiber_cherenkov + airgap ) / 4.0 ) ,0.));
384 solid_absorber_scin =
new G4SubtractionSolid(G4String(
"solid_absorber_scin_box1"), solid_absorber_scin, single_cutout_box
385 , 0 ,G4ThreeVector( 0 , ( (
_tower_readout + addtowsize) / 4.0 ) - ( ( diameter_fiber + airgap ) / 4.0 ) ,0.));
387 solid_absorber_cher =
new G4SubtractionSolid(G4String(
"solid_absorber_temp_cher_f1"), solid_absorber_cher, single_cutout_tube_cherenkov
388 , 0 ,G4ThreeVector( 0 , 0 ,0.));
389 solid_absorber_scin =
new G4SubtractionSolid(G4String(
"solid_absorber_temp_scin_f1"), solid_absorber_scin, single_cutout_tube
390 , 0 ,G4ThreeVector( 0 , 0 ,0.));
392 G4VSolid* solid_scintillator =
new G4Tubs(G4String(
"single_scintillator_fiber"),
394 diameter_fiber / 2.0,
399 G4VSolid* solid_cherenkov =
new G4Tubs(G4String(
"single_cherenkov_fiber"),
401 diameter_fiber_cherenkov / 2.0,
409 G4NistManager* man = G4NistManager::Instance();
410 G4Material* material_absorber;
418 G4LogicalVolume* logic_absorber_cher =
new G4LogicalVolume(solid_absorber_cher,
420 "absorber_solid_logic_cher",
423 G4LogicalVolume* logic_absorber_scin =
new G4LogicalVolume(solid_absorber_scin,
425 "absorber_solid_logic_scin",
428 G4LogicalVolume* logic_scint =
new G4LogicalVolume(solid_scintillator,
429 material_scintillator,
430 "hdrcalo_single_scintillator_fiber_logic",
433 G4Material *material_cherenkov;
438 G4LogicalVolume* logic_cherenk =
new G4LogicalVolume(solid_cherenkov,
440 "hdrcalo_single_cherenkov_fiber_logic",
451 ostringstream name_absorber;
452 name_absorber.str(
"");
455 ostringstream name_scintillator;
456 name_scintillator.str(
"");
459 ostringstream name_cherenkov;
460 name_cherenkov.str(
"");
490 new G4PVPlacement(0, G4ThreeVector( -(
_tower_readout + addtowsize) / 4.0, ( (
_tower_readout + addtowsize) / 2.0 ) - ( ( diameter_fiber + airgap ) / 2.0 ) , 0),
495 new G4PVPlacement(0, G4ThreeVector( (
_tower_readout + addtowsize) / 4.0, - ( ( diameter_fiber + airgap ) / 2.0 ) , 0),
502 new G4PVPlacement(0, G4ThreeVector( (
_tower_readout + addtowsize) / 4.0 , ( (
_tower_readout + addtowsize) / 2.0 ) - ( ( diameter_fiber_cherenkov + airgap ) / 2.0 ) , 0),
507 new G4PVPlacement(0, G4ThreeVector( -(
_tower_readout + addtowsize) / 4.0 , - ( ( diameter_fiber_cherenkov + airgap ) / 2.0 ) , 0),
540 for(
int row=(rowNtow / 2);row>=-rowNtow / 2;row--){
543 auto DRCalRowLogical =
new G4LogicalVolume(DRCalRowSolid,material_air,
"DRCalRowLogicalBase" +
std::to_string(row));
545 new G4PVReplica(
"DRCalRowPhysicalBase" +
std::to_string(row),single_tower_logic,DRCalRowLogical,
549 ostringstream name_row_twr;
550 name_row_twr.str(
"");
552 new G4PVPlacement(0, G4ThreeVector(0, (row * (
_tower_readout + addtowsize)), 0),
553 DRCalRowLogical, name_row_twr.str().c_str(), base_tower_logic, 0,
false,
OverlapCheck());
558 cout <<
"PHG4ForwardDualReadoutDetector: Building logical volume for single tower done." << endl;
561 return base_tower_logic;
570 cout <<
"PHG4ForwardDualReadoutDetector: Build logical volume for single tower..." << endl;
576 G4VSolid* base_tower_solid =
new G4Box(G4String(
"base_tower_solid"),
581 G4LogicalVolume* base_tower_logic =
new G4LogicalVolume(base_tower_solid,
586 int maxsubtow = (int) ( (
_tower_dx) / (2 * copperTubeDiam));
587 G4double addtowsize = (
_tower_dx - (maxsubtow * 2 * copperTubeDiam))/maxsubtow;
589 G4VSolid* single_tower_solid =
new G4Box(G4String(
"single_tower_solid"),
590 (2 * copperTubeDiam + addtowsize) / 2.0,
591 (2 * copperTubeDiam + addtowsize) / 2.0,
594 G4LogicalVolume* single_tower_logic =
new G4LogicalVolume(single_tower_solid,
596 "single_tower_logic",
606 G4VSolid* solid_absorber =
new G4Tubs(G4String(
"ttl_copper_tube_solid"),
608 copperTubeDiam / 2.0,
612 G4VSolid* solid_scintillator =
new G4Tubs(G4String(
"single_scintillator_fiber"),
614 diameter_fiber / 2.0,
619 G4VSolid* solid_cherenkov =
new G4Tubs(G4String(
"single_cherenkov_fiber"),
621 diameter_fiber_cherenkov / 2.0,
629 G4NistManager* man = G4NistManager::Instance();
630 G4Material* material_absorber;
638 G4LogicalVolume* logic_absorber =
new G4LogicalVolume(solid_absorber,
640 "absorber_solid_logic",
643 G4LogicalVolume* logic_scint =
new G4LogicalVolume(solid_scintillator,
644 material_scintillator,
645 "hdrcalo_single_scintillator_fiber_logic",
648 G4Material *material_cherenkov;
653 G4LogicalVolume* logic_cherenk =
new G4LogicalVolume(solid_cherenkov,
655 "hdrcalo_single_cherenkov_fiber_logic",
664 ostringstream name_absorber;
665 name_absorber.str(
"");
668 ostringstream name_scintillator;
669 name_scintillator.str(
"");
672 ostringstream name_cherenkov;
673 name_cherenkov.str(
"");
677 new G4PVPlacement(0, G4ThreeVector( -copperTubeDiam/2, copperTubeDiam/2 , 0),
679 name_absorber.str().c_str(),
682 new G4PVPlacement(0, G4ThreeVector( -copperTubeDiam/2, -copperTubeDiam/2 , 0),
684 name_absorber.str().c_str(),
687 new G4PVPlacement(0, G4ThreeVector( copperTubeDiam/2, copperTubeDiam/2 , 0),
689 name_absorber.str().c_str(),
692 new G4PVPlacement(0, G4ThreeVector( copperTubeDiam/2, -copperTubeDiam/2 , 0),
694 name_absorber.str().c_str(),
699 new G4PVPlacement(0, G4ThreeVector( 0, 0 , 0),
701 name_scintillator.str().c_str(),
704 new G4PVPlacement(0, G4ThreeVector( copperTubeDiam, copperTubeDiam , 0),
706 name_scintillator.str().c_str(),
711 new G4PVPlacement(0, G4ThreeVector( copperTubeDiam, 0 , 0),
713 name_cherenkov.str().c_str(),
716 new G4PVPlacement(0, G4ThreeVector( 0, copperTubeDiam , 0),
718 name_cherenkov.str().c_str(),
723 int rowNtow = (int) ( (
_tower_dx) / (2 * copperTubeDiam + addtowsize));
724 for(
int row=(rowNtow / 2);row>=-rowNtow / 2;row--){
726 auto DRCalRowSolid =
new G4Box(
"DRCalRowBox",
_tower_dx / 2.0, (2 * copperTubeDiam + addtowsize) / 2.0,
_tower_dz / 2.0);
727 auto DRCalRowLogical =
new G4LogicalVolume(DRCalRowSolid,material_air,
"DRCalRowLogical");
729 new G4PVReplica(
"DRCalRowPhysical",single_tower_logic,DRCalRowLogical,
730 kXAxis, rowNtow, 2 * copperTubeDiam + addtowsize);
733 ostringstream name_row_twr;
734 name_row_twr.str(
"");
736 new G4PVPlacement(0, G4ThreeVector(0, (row * (2 * copperTubeDiam + addtowsize)), 0),
737 DRCalRowLogical, name_row_twr.str().c_str(), base_tower_logic, 0,
false,
OverlapCheck());
748 cout <<
"PHG4ForwardDualReadoutDetector: Building logical volume for single tower done." << endl;
751 return base_tower_logic;
760 cout <<
"PHG4ForwardDualReadoutDetector: Making Scintillator material..." << endl;
764 G4MaterialPropertiesTable *tab =
new G4MaterialPropertiesTable();
766 const G4int ntab = 31;
767 tab->AddConstProperty(
"FASTTIMECONSTANT", 2.8*
ns);
769 tab->AddConstProperty(
"SCINTILLATIONYIELD", 200/
MeV);
770 tab->AddConstProperty(
"RESOLUTIONSCALE", 1.0);
773 { 1.37760*
eV, 1.45864*
eV, 1.54980*
eV, 1.65312*
eV, 1.71013*
eV, 1.77120*
eV, 1.83680*
eV, 1.90745*
eV, 1.98375*
eV, 2.06640*
eV,
774 2.10143*
eV, 2.13766*
eV, 2.17516*
eV, 2.21400*
eV, 2.25426*
eV, 2.29600*
eV, 2.33932*
eV, 2.38431*
eV, 2.43106*
eV, 2.47968*
eV,
775 2.53029*
eV, 2.58300*
eV, 2.63796*
eV, 2.69531*
eV, 2.75520*
eV, 2.81782*
eV, 2.88335*
eV, 2.95200*
eV, 3.09960*
eV, 3.54241*
eV,
777 G4double scin_fast[] =
778 { 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0003, 0.0008, 0.0032,
779 0.0057, 0.0084, 0.0153, 0.0234, 0.0343, 0.0604, 0.0927, 0.1398, 0.2105, 0.2903,
780 0.4122, 0.5518, 0.7086, 0.8678, 1.0000, 0.8676, 0.2311, 0.0033, 0.0012, 0.0000,
782 tab->AddProperty(
"FASTCOMPONENT", opt_en, scin_fast, ntab);
785 { 1.5749, 1.5764, 1.5782, 1.5803, 1.5815, 1.5829, 1.5845, 1.5862, 1.5882, 1.5904,
786 1.5914, 1.5924, 1.5935, 1.5947, 1.5959, 1.5972, 1.5986, 1.6000, 1.6016, 1.6033,
787 1.6051, 1.6070, 1.6090, 1.6112, 1.6136, 1.6161, 1.6170, 1.6230, 1.62858, 1.65191,
789 tab->AddProperty(
"RINDEX", opt_en, opt_r, ntab);
792 { 2.714*
m, 3.619*
m, 5.791*
m, 4.343*
m, 7.896*
m, 5.429*
m, 36.19*
m, 17.37*
m, 36.19*
m, 5.429*
m,
793 13.00*
m, 14.50*
m, 16.00*
m, 18.00*
m, 16.50*
m, 17.00*
m, 14.00*
m, 16.00*
m, 15.00*
m, 14.50*
m,
794 13.00*
m, 12.00*
m, 10.00*
m, 8.000*
m, 7.238*
m, 4.000*
m, 1.200*
m, 0.500*
m, 0.200*
m, 0.200*
m,
796 tab->AddProperty(
"ABSLENGTH", opt_en, opt_abs, ntab);
801 G4Material* material_G4_POLYSTYRENE =
new G4Material(
"G4_POLYSTYRENE", density = 1.05 *
g /
cm3, ncomponents = 2);
802 material_G4_POLYSTYRENE->AddElement(G4Element::GetElement(
"C"), 8);
803 material_G4_POLYSTYRENE->AddElement(G4Element::GetElement(
"H"), 8);
804 material_G4_POLYSTYRENE->GetIonisation()->SetBirksConstant(0.126*
mm/
MeV);
805 material_G4_POLYSTYRENE->SetMaterialPropertiesTable(tab);
809 cout <<
"PHG4ForwardDualReadoutDetector: Making Scintillator material done." << endl;
812 return material_G4_POLYSTYRENE;
821 cout <<
"PHG4ForwardDualReadoutDetector: Making PMMA material..." << endl;
827 G4Material* material_PMMA =
new G4Material(
"PMMA", density = 1.18 *
g /
cm3, ncomponents = 3);
828 material_PMMA->AddElement(G4Element::GetElement(
"C"), 5);
829 material_PMMA->AddElement(G4Element::GetElement(
"H"), 8);
830 material_PMMA->AddElement(G4Element::GetElement(
"O"), 2);
832 const G4int nEntries = 31;
834 G4double photonEnergy[nEntries] =
835 { 1.37760*
eV, 1.45864*
eV, 1.54980*
eV, 1.65312*
eV, 1.71013*
eV, 1.77120*
eV, 1.83680*
eV, 1.90745*
eV, 1.98375*
eV, 2.06640*
eV,
836 2.10143*
eV, 2.13766*
eV, 2.17516*
eV, 2.21400*
eV, 2.25426*
eV, 2.29600*
eV, 2.33932*
eV, 2.38431*
eV, 2.43106*
eV, 2.47968*
eV,
837 2.53029*
eV, 2.58300*
eV, 2.63796*
eV, 2.69531*
eV, 2.75520*
eV, 2.81782*
eV, 2.88335*
eV, 2.95200*
eV, 3.09960*
eV, 3.54241*
eV,
839 G4double refractiveIndexWLSfiber[nEntries] =
840 { 1.4852, 1.4859, 1.4867, 1.4877, 1.4882, 1.4888, 1.4895, 1.4903, 1.4911, 1.4920,
841 1.4924, 1.4929, 1.4933, 1.4938, 1.4943, 1.4948, 1.4954, 1.4960, 1.4966, 1.4973,
842 1.4981, 1.4989, 1.4997, 1.5006, 1.5016, 1.5026, 1.5038, 1.5050, 1.5052, 1.5152,
845 G4double absWLSfiber[nEntries] =
846 { 0.414*
m, 0.965*
m, 2.171*
m, 4.343*
m, 1.448*
m, 4.343*
m, 14.48*
m, 21.71*
m, 8.686*
m, 39.48*
m,
847 48.25*
m, 54.29*
m, 57.91*
m, 54.29*
m, 33.40*
m, 31.02*
m, 43.43*
m, 43.43*
m, 41.36*
m, 39.48*
m,
848 37.76*
m, 36.19*
m, 36.19*
m, 33.40*
m, 31.02*
m, 28.95*
m, 25.55*
m, 24.13*
m, 21.71*
m, 2.171*
m,
853 G4MaterialPropertiesTable* mptWLSfiber =
new G4MaterialPropertiesTable();
854 mptWLSfiber->AddProperty(
"RINDEX",photonEnergy,refractiveIndexWLSfiber,nEntries);
855 mptWLSfiber->AddProperty(
"ABSLENGTH",photonEnergy,absWLSfiber,nEntries);
856 material_PMMA->SetMaterialPropertiesTable(mptWLSfiber);
859 cout <<
"PHG4ForwardDualReadoutDetector: Making PMMA material done." << endl;
862 return material_PMMA;
871 cout <<
"PHG4ForwardDualReadoutDetector: Making Scintillator material..." << endl;
874 G4MaterialPropertiesTable* mptWLSfiber =
new G4MaterialPropertiesTable();
880 G4Material *material_Quartz =
new G4Material(
"Quartz", density = 2.200 *
g /
cm3, ncomponents = 2);
881 material_Quartz->AddElement(G4Element::GetElement(
"Si"), 1);
882 material_Quartz->AddElement(G4Element::GetElement(
"O"), 2);
884 const G4int nEntriesQuartz = 279;
886 G4double photonEnergyQuartz[nEntriesQuartz] =
887 { 5.9040*
eV, 5.7667*
eV, 5.6356*
eV, 5.5104*
eV, 5.3906*
eV, 5.2759*
eV, 5.1660*
eV, 5.0606*
eV, 4.9594*
eV, 4.8621*
eV,
888 4.7686*
eV, 4.6786*
eV, 4.5920*
eV, 4.5085*
eV, 4.4280*
eV, 4.3503*
eV, 4.2753*
eV, 4.2029*
eV, 4.1328*
eV, 4.0651*
eV,
889 3.9995*
eV, 3.9360*
eV, 3.8745*
eV, 3.8149*
eV, 3.7571*
eV, 3.7010*
eV, 3.6466*
eV, 3.5937*
eV, 3.5424*
eV, 3.4925*
eV,
890 3.4440*
eV, 3.3968*
eV, 3.3509*
eV, 3.3062*
eV, 3.2627*
eV, 3.2204*
eV, 3.1791*
eV, 3.1388*
eV, 3.0996*
eV, 3.0613*
eV,
891 3.0240*
eV, 2.9876*
eV, 2.9520*
eV, 2.9173*
eV, 2.8834*
eV, 2.8502*
eV, 2.8178*
eV, 2.7862*
eV, 2.7552*
eV, 2.7249*
eV,
892 2.6953*
eV, 2.6663*
eV, 2.6380*
eV, 2.6102*
eV, 2.5830*
eV, 2.5564*
eV, 2.5303*
eV, 2.5047*
eV, 2.4797*
eV, 2.4551*
eV,
893 2.4311*
eV, 2.4075*
eV, 2.3843*
eV, 2.3616*
eV, 2.3393*
eV, 2.3175*
eV, 2.2960*
eV, 2.2749*
eV, 2.2543*
eV, 2.2339*
eV,
894 2.2140*
eV, 2.1944*
eV, 2.1752*
eV, 2.1562*
eV, 2.1377*
eV, 2.1194*
eV, 2.1014*
eV, 2.0838*
eV, 2.0664*
eV, 2.0493*
eV,
895 2.0325*
eV, 2.0160*
eV, 1.9997*
eV, 1.9837*
eV, 1.9680*
eV, 1.9525*
eV, 1.9373*
eV, 1.9222*
eV, 1.9074*
eV, 1.8929*
eV,
896 1.8785*
eV, 1.8644*
eV, 1.8505*
eV, 1.8368*
eV, 1.8233*
eV, 1.8100*
eV, 1.7969*
eV, 1.7839*
eV, 1.7712*
eV, 1.7463*
eV,
897 1.7220*
eV, 1.6984*
eV, 1.6755*
eV, 1.6531*
eV, 1.6314*
eV, 1.6102*
eV, 1.5895*
eV, 1.5694*
eV, 1.5498*
eV, 1.5307*
eV,
898 1.5120*
eV, 1.4938*
eV, 1.4760*
eV, 1.4586*
eV, 1.4417*
eV, 1.4251*
eV, 1.4089*
eV, 1.3931*
eV, 1.3776*
eV, 1.3625*
eV,
899 1.3477*
eV, 1.3332*
eV, 1.3190*
eV, 1.3051*
eV, 1.2915*
eV, 1.2782*
eV, 1.2651*
eV, 1.2524*
eV, 1.2398*
eV, 1.2276*
eV,
900 1.2155*
eV, 1.2037*
eV, 1.1922*
eV, 1.1808*
eV, 1.1697*
eV, 1.1587*
eV, 1.1480*
eV, 1.1375*
eV, 1.1271*
eV, 1.1170*
eV,
901 1.1070*
eV, 1.0972*
eV, 1.0876*
eV, 1.0781*
eV, 1.0688*
eV, 1.0597*
eV, 1.0507*
eV, 1.0419*
eV, 1.0332*
eV, 1.0247*
eV,
902 1.0163*
eV, 1.0080*
eV, 0.9999*
eV, 0.9919*
eV, 0.9840*
eV, 0.9763*
eV, 0.9686*
eV, 0.9611*
eV, 0.9537*
eV, 0.9464*
eV,
903 0.9393*
eV, 0.9322*
eV, 0.9253*
eV, 0.9184*
eV, 0.9116*
eV, 0.9050*
eV, 0.8984*
eV, 0.8920*
eV, 0.8856*
eV, 0.8793*
eV,
904 0.8731*
eV, 0.8670*
eV, 0.8610*
eV, 0.8551*
eV, 0.8492*
eV, 0.8434*
eV, 0.8377*
eV, 0.8321*
eV, 0.8266*
eV, 0.8211*
eV,
905 0.8157*
eV, 0.8104*
eV, 0.8051*
eV, 0.7999*
eV, 0.7948*
eV, 0.7897*
eV, 0.7847*
eV, 0.7798*
eV, 0.7749*
eV, 0.7701*
eV,
906 0.7653*
eV, 0.7606*
eV, 0.7560*
eV, 0.7514*
eV, 0.7469*
eV, 0.7424*
eV, 0.7380*
eV, 0.7336*
eV, 0.7293*
eV, 0.7251*
eV,
907 0.7208*
eV, 0.7167*
eV, 0.7126*
eV, 0.7085*
eV, 0.7045*
eV, 0.7005*
eV, 0.6965*
eV, 0.6926*
eV, 0.6888*
eV, 0.6850*
eV,
908 0.6812*
eV, 0.6775*
eV, 0.6738*
eV, 0.6702*
eV, 0.6666*
eV, 0.6630*
eV, 0.6595*
eV, 0.6560*
eV, 0.6525*
eV, 0.6491*
eV,
909 0.6458*
eV, 0.6424*
eV, 0.6391*
eV, 0.6358*
eV, 0.6326*
eV, 0.6294*
eV, 0.6262*
eV, 0.6230*
eV, 0.6199*
eV, 0.6168*
eV,
910 0.6138*
eV, 0.6108*
eV, 0.6078*
eV, 0.6048*
eV, 0.6019*
eV, 0.5990*
eV, 0.5961*
eV, 0.5932*
eV, 0.5904*
eV, 0.5876*
eV,
911 0.5848*
eV, 0.5821*
eV, 0.5794*
eV, 0.5767*
eV, 0.5740*
eV, 0.5714*
eV, 0.5687*
eV, 0.5661*
eV, 0.5636*
eV, 0.5610*
eV,
912 0.5585*
eV, 0.5560*
eV, 0.5535*
eV, 0.5510*
eV, 0.5486*
eV, 0.5462*
eV, 0.5438*
eV, 0.5414*
eV, 0.5391*
eV, 0.5367*
eV,
913 0.5344*
eV, 0.5321*
eV, 0.5298*
eV, 0.5276*
eV, 0.5254*
eV, 0.5231*
eV, 0.5209*
eV, 0.5188*
eV, 0.5166*
eV, 0.5145*
eV,
914 0.5123*
eV, 0.5102*
eV, 0.5081*
eV, 0.5061*
eV, 0.5040*
eV, 0.5020*
eV, 0.4999*
eV, 0.4979*
eV, 0.4959*
eV};
915 G4double refractiveIndexQuartz[nEntriesQuartz] =
916 { 1.5384, 1.5332, 1.5285, 1.5242, 1.5202, 1.5166, 1.5133, 1.5103, 1.5074, 1.5048,
917 1.5024, 1.5001, 1.4980, 1.4960, 1.4942, 1.4924, 1.4908, 1.4892, 1.4878, 1.4864,
918 1.4851, 1.4839, 1.4827, 1.4816, 1.4806, 1.4796, 1.4787, 1.4778, 1.4769, 1.4761,
919 1.4753, 1.4745, 1.4738, 1.4731, 1.4725, 1.4719, 1.4713, 1.4707, 1.4701, 1.4696,
920 1.4691, 1.4686, 1.4681, 1.4676, 1.4672, 1.4668, 1.4663, 1.4660, 1.4656, 1.4652,
921 1.4648, 1.4645, 1.4641, 1.4638, 1.4635, 1.4632, 1.4629, 1.4626, 1.4623, 1.4621,
922 1.4618, 1.4615, 1.4613, 1.4610, 1.4608, 1.4606, 1.4603, 1.4601, 1.4599, 1.4597,
923 1.4595, 1.4593, 1.4591, 1.4589, 1.4587, 1.4586, 1.4584, 1.4582, 1.4580, 1.4579,
924 1.4577, 1.4576, 1.4574, 1.4572, 1.4571, 1.4570, 1.4568, 1.4567, 1.4565, 1.4564,
925 1.4563, 1.4561, 1.4560, 1.4559, 1.4558, 1.4556, 1.4555, 1.4554, 1.4553, 1.4551,
926 1.4549, 1.4546, 1.4544, 1.4542, 1.4540, 1.4539, 1.4537, 1.4535, 1.4533, 1.4531,
927 1.4530, 1.4528, 1.4527, 1.4525, 1.4523, 1.4522, 1.4520, 1.4519, 1.4518, 1.4516,
928 1.4515, 1.4513, 1.4512, 1.4511, 1.4509, 1.4508, 1.4507, 1.4505, 1.4504, 1.4503,
929 1.4502, 1.4500, 1.4499, 1.4498, 1.4497, 1.4496, 1.4494, 1.4493, 1.4492, 1.4491,
930 1.4490, 1.4489, 1.4487, 1.4486, 1.4485, 1.4484, 1.4483, 1.4482, 1.4481, 1.4479,
931 1.4478, 1.4477, 1.4476, 1.4475, 1.4474, 1.4473, 1.4471, 1.4470, 1.4469, 1.4468,
932 1.4467, 1.4466, 1.4465, 1.4464, 1.4462, 1.4461, 1.4460, 1.4459, 1.4458, 1.4457,
933 1.4455, 1.4454, 1.4453, 1.4452, 1.4451, 1.4450, 1.4449, 1.4447, 1.4446, 1.4445,
934 1.4444, 1.4443, 1.4441, 1.4440, 1.4439, 1.4438, 1.4437, 1.4435, 1.4434, 1.4433,
935 1.4432, 1.4431, 1.4429, 1.4428, 1.4427, 1.4426, 1.4424, 1.4423, 1.4422, 1.4420,
936 1.4419, 1.4418, 1.4417, 1.4415, 1.4414, 1.4413, 1.4411, 1.4410, 1.4409, 1.4407,
937 1.4406, 1.4405, 1.4403, 1.4402, 1.4401, 1.4399, 1.4398, 1.4397, 1.4395, 1.4394,
938 1.4392, 1.4391, 1.4389, 1.4388, 1.4387, 1.4385, 1.4384, 1.4382, 1.4381, 1.4379,
939 1.4378, 1.4376, 1.4375, 1.4373, 1.4372, 1.4370, 1.4369, 1.4367, 1.4366, 1.4364,
940 1.4363, 1.4361, 1.4360, 1.4358, 1.4357, 1.4355, 1.4353, 1.4352, 1.4350, 1.4349,
941 1.4347, 1.4345, 1.4344, 1.4342, 1.4340, 1.4339, 1.4337, 1.4335, 1.4334, 1.4332,
942 1.4330, 1.4328, 1.4327, 1.4325, 1.4323, 1.4322, 1.4320, 1.4318, 1.4316, 1.4314,
943 1.4313, 1.4311, 1.4309, 1.4307, 1.4305, 1.4304, 1.4302, 1.4300, 1.4298 };
944 mptWLSfiber->AddProperty(
"RINDEX",photonEnergyQuartz,refractiveIndexQuartz,nEntriesQuartz);
947 const G4int nEntries_Quartz = 14;
948 G4double PhotonEnergy_Quartz[nEntries_Quartz] =
949 { 2.21*
eV, 2.30*
eV, 2.38*
eV, 2.48*
eV, 2.58*
eV, 2.70*
eV, 2.82*
eV, 2.95*
eV, 3.10*
eV, 3.26*
eV,
950 3.44*
eV, 3.65*
eV, 3.88*
eV, 4.13*
eV };
951 G4double Quartz_Abs[nEntries_Quartz] =
952 { 550.7*
mm, 530.7*
mm, 590.1*
mm, 490.7*
mm, 470.7*
mm, 520.3*
mm, 500.0*
mm, 470.7*
mm, 450.5*
mm, 270.5*
mm,
953 190.1*
mm, 60.9*
mm, 10.6*
mm, 4.0*
mm};
954 mptWLSfiber->AddProperty(
"ABSLENGTH", PhotonEnergy_Quartz, Quartz_Abs, nEntries_Quartz);
956 material_Quartz->SetMaterialPropertiesTable(mptWLSfiber);
960 cout <<
"PHG4ForwardDualReadoutDetector: Making Scintillator material done." << endl;
963 return material_Quartz;
970 ifstream istream_mapping;
972 if (!istream_mapping.is_open())
974 std::cout <<
"ERROR in PHG4ForwardHcalDetector: Failed to open mapping file " <<
_mapping_tower_file << std::endl;
980 while (
getline(istream_mapping, line_mapping))
983 if (line_mapping.find(
"#") != string::npos)
987 std::cout <<
"PHG4ForwardHcalDetector: SKIPPING line in mapping file: " << line_mapping << std::endl;
992 istringstream iss(line_mapping);
998 if (!(iss >> parname >> parval))
1000 cout <<
"ERROR in PHG4ForwardHcalDetector: Failed to read line in mapping file " <<
_mapping_tower_file << std::endl;
1008 std::map<string, G4double>::iterator parit;
1103 _dZ = parit->second *
cm;