File indexing completed on 2026-09-09 08:28:49
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include "DetectorConstruction.hh"
0030
0031 #include "DetectorMessenger.hh"
0032 #include "PrimaryGeneratorAction.hh"
0033
0034 #include "G4Box.hh"
0035 #include "G4Cons.hh"
0036 #include "G4FieldManager.hh"
0037 #include "G4GeometryManager.hh"
0038 #include "G4LogicalVolume.hh"
0039 #include "G4LogicalVolumeStore.hh"
0040 #include "G4Material.hh"
0041 #include "G4PVPlacement.hh"
0042 #include "G4PVReplica.hh"
0043 #include "G4PhysicalConstants.hh"
0044 #include "G4PhysicalVolumeStore.hh"
0045 #include "G4RotationMatrix.hh"
0046 #include "G4RunManager.hh"
0047 #include "G4SDManager.hh"
0048 #include "G4SolidStore.hh"
0049 #include "G4SystemOfUnits.hh"
0050 #include "G4ThreeVector.hh"
0051 #include "G4TransportationManager.hh"
0052 #include "G4Tubs.hh"
0053 #include "G4UniformMagField.hh"
0054 #include "globals.hh"
0055
0056
0057
0058 DetectorConstruction::DetectorConstruction()
0059 : fVacuum(nullptr),
0060 fIron(nullptr),
0061 fCopper(nullptr),
0062 fTungsten(nullptr),
0063 fLead(nullptr),
0064 fUranium(nullptr),
0065 fPbWO4(nullptr),
0066 fPolystyrene(nullptr),
0067 fLiquidArgon(nullptr),
0068 fSilicon(nullptr),
0069 fQuartz(nullptr),
0070 fBrass(nullptr),
0071 fAluminium(nullptr),
0072 fGraphite(nullptr),
0073 fAbsorberMaterial(nullptr),
0074 fActiveMaterial(nullptr),
0075 fExperimentalHall_log(nullptr),
0076 fExperimentalHall_phys(nullptr),
0077 fLogicCalo(nullptr),
0078 fPhysiCalo(nullptr),
0079 fLogicModule(nullptr),
0080 fPhysiModule(nullptr),
0081 fLogicAbsorber(nullptr),
0082 fPhysiAbsorber(nullptr),
0083 fLogicActive(nullptr),
0084 fPhysiActive(nullptr),
0085 fFieldMgr(nullptr),
0086 fUniformMagField(nullptr),
0087 fDetectorMessenger(nullptr),
0088
0089 fIsCalHomogeneous(false),
0090 fIsUnitInLambda(false),
0091 fAbsorberTotalLength(2.0 * CLHEP::m),
0092 fCalorimeterRadius(1.0 * CLHEP::m),
0093 fActiveLayerNumber(50),
0094 fActiveLayerSize(4.0 * CLHEP::mm),
0095 fIsRadiusUnitInLambda(false),
0096
0097 fCaloLength(2.0 * CLHEP::m),
0098
0099 fLogicScoringUpDown(nullptr),
0100 fPhysiScoringUpstream(nullptr),
0101 fPhysiScoringDownstream(nullptr),
0102 fLogicScoringSide(nullptr),
0103 fPhysiScoringSide(nullptr)
0104 {
0105 fFieldMgr = G4TransportationManager::GetTransportationManager()->GetFieldManager();
0106 DefineMaterials();
0107 fAbsorberMaterial = fIron;
0108 fActiveMaterial = fPolystyrene;
0109 fDetectorMessenger = new DetectorMessenger(this);
0110 }
0111
0112
0113
0114 DetectorConstruction::~DetectorConstruction()
0115 {
0116 delete fDetectorMessenger;
0117 delete fUniformMagField;
0118 }
0119
0120
0121
0122 G4VPhysicalVolume* DetectorConstruction::Construct()
0123 {
0124 return ConstructCalorimeter();
0125 }
0126
0127
0128
0129 void DetectorConstruction::ConstructSDandField() {}
0130
0131
0132
0133 void DetectorConstruction::DefineMaterials()
0134 {
0135 G4double a;
0136 G4double z;
0137 G4double density, pressure, temperature, fractionmass;
0138 G4String name, symbol;
0139 G4int nel, natoms;
0140
0141
0142
0143 a = 1.01 * g / mole;
0144 G4Element* elH = new G4Element(name = "Hydrogen", symbol = "H2", z = 1., a);
0145
0146 a = 2.01 * g / mole;
0147
0148
0149 a = 4. * g / mole;
0150
0151
0152 a = 6.94 * g / mole;
0153
0154
0155 a = 9.01 * g / mole;
0156
0157
0158 a = 12.01 * g / mole;
0159 G4Element* elC = new G4Element(name = "Carbon", symbol = "C", z = 6., a);
0160
0161 a = 14.01 * g / mole;
0162 G4Element* elN = new G4Element(name = "Nitrogen", symbol = "N2", z = 7., a);
0163
0164 a = 16. * g / mole;
0165 G4Element* elO = new G4Element(name = "Oxygen", symbol = "O2", z = 8., a);
0166
0167 a = 20.18 * g / mole;
0168
0169
0170 a = 22.99 * g / mole;
0171
0172
0173 a = 26.98 * g / mole;
0174
0175
0176 a = 28.085 * g / mole;
0177 G4Element* elSi = new G4Element(name = "Silicon", symbol = "Si", z = 14., a);
0178
0179 a = 40.08 * g / mole;
0180
0181
0182 a = 55.850 * g / mole;
0183
0184
0185 a = 63.54 * g / mole;
0186 G4Element* elCu = new G4Element(name = "Copper", symbol = "Cu", z = 29., a);
0187
0188 a = 65.41 * g / mole;
0189 G4Element* elZn = new G4Element(name = "Zinc", symbol = "Zn", z = 30., a);
0190
0191 a = 183.85 * g / mole;
0192 G4Element* elW = new G4Element(name = "Tungstenm", symbol = "W", z = 74., a);
0193
0194 a = 207.19 * g / mole;
0195 G4Element* elPb = new G4Element(name = "Lead", symbol = "Pb", z = 82., a);
0196
0197 a = 238.03 * g / mole;
0198
0199
0200
0201
0202
0203 density = 7.87 * g / cm3;
0204 a = 55.85 * g / mole;
0205 fIron = new G4Material(name = "Iron", z = 26., a, density);
0206
0207
0208 density = 8.96 * g / cm3;
0209 a = 63.54 * g / mole;
0210 fCopper = new G4Material(name = "Copper", z = 29., a, density);
0211
0212
0213 density = 19.3 * g / cm3;
0214 a = 183.85 * g / mole;
0215 fTungsten = new G4Material(name = "Tungsten", z = 74., a, density);
0216
0217
0218 density = 11.35 * g / cm3;
0219 a = 207.19 * g / mole;
0220 fLead = new G4Material(name = "Lead", z = 82., a, density);
0221
0222
0223 density = 18.95 * g / cm3;
0224 a = 238.03 * g / mole;
0225 fUranium = new G4Material(name = "Uranium", z = 92., a, density);
0226
0227
0228 density = 1.4 * g / cm3;
0229 a = 39.95 * g / mole;
0230 fLiquidArgon = new G4Material(name = "LiquidArgon", z = 18., a, density);
0231
0232 density = 0.002 * g / cm3;
0233 a = 39.95 * g / mole;
0234
0235
0236
0237 density = 2.33 * g / cm3;
0238 a = 28.085 * g / mole;
0239 fSilicon = new G4Material(name = "Silicon", z = 14., a, density);
0240
0241
0242 density = 2.7 * g / cm3;
0243 a = 26.98 * g / mole;
0244 fAluminium = new G4Material(name = "Aluminium", z = 13., a, density);
0245
0246
0247 density = 2.210 * g / cm3;
0248 a = 12.0107 * g / mole;
0249 fGraphite = new G4Material(name = "Graphite", z = 6., a, density);
0250
0251 density = 8.96 * g / cm3;
0252 a = 58.69 * g / mole;
0253
0254
0255
0256
0257 density = 1.290 * mg / cm3;
0258 G4Material* Air = new G4Material(name = "Air", density, nel = 2);
0259 Air->AddElement(elN, 0.7);
0260 Air->AddElement(elO, 0.3);
0261
0262 density = 1.e-5 * g / cm3;
0263 pressure = 2.e-2 * bar;
0264 temperature = STP_Temperature;
0265 fVacuum = new G4Material(name = "Vacuum", density, nel = 1, kStateGas, temperature, pressure);
0266 fVacuum->AddMaterial(Air, fractionmass = 1.);
0267
0268
0269
0270
0271 density = 1.032 * g / cm3;
0272 fPolystyrene = new G4Material(name = "Polystyrene", density, nel = 2);
0273 fPolystyrene->AddElement(elC, natoms = 19);
0274 fPolystyrene->AddElement(elH, natoms = 21);
0275
0276
0277 density = 8.28 * g / cm3;
0278 fPbWO4 = new G4Material(name = "PbWO4", density, nel = 3);
0279 fPbWO4->AddElement(elPb, natoms = 1);
0280 fPbWO4->AddElement(elW, natoms = 1);
0281 fPbWO4->AddElement(elO, natoms = 4);
0282
0283 fQuartz = new G4Material(name = "Quartz", density = 2.200 * g / cm3, nel = 2);
0284 fQuartz->AddElement(elSi, 1);
0285 fQuartz->AddElement(elO, 2);
0286
0287 fBrass = new G4Material(name = "Brass", density = 8.6 * g / cm3, nel = 2);
0288 fBrass->AddElement(elCu, 0.7);
0289 fBrass->AddElement(elZn, 0.3);
0290 }
0291
0292
0293
0294 G4VPhysicalVolume* DetectorConstruction::ConstructCalorimeter()
0295 {
0296 if (!AreParametersOK()) {
0297 G4cout << " DetectorConstruction::ConstructCalorimeter() : ***ERROR*** " << G4endl
0298 << "\t PARAMETERS NOT WELL-DEFINED! GEOMETRY UNCHANGED." << G4endl;
0299 return fExperimentalHall_phys;
0300 }
0301
0302
0303 G4GeometryManager::GetInstance()->OpenGeometry();
0304 G4PhysicalVolumeStore::GetInstance()->Clean();
0305 G4LogicalVolumeStore::GetInstance()->Clean();
0306 G4SolidStore::GetInstance()->Clean();
0307
0308 G4double lambda = 0.0;
0309 if (fIsUnitInLambda) {
0310 if (fAbsorberMaterial == fIron) {
0311 lambda = 16.760 * cm;
0312 }
0313 else if (fAbsorberMaterial == fCopper) {
0314 lambda = 15.056 * cm;
0315 }
0316 else if (fAbsorberMaterial == fBrass) {
0317 lambda = 15.056 * cm;
0318 }
0319 else if (fAbsorberMaterial == fTungsten) {
0320 lambda = 9.5855 * cm;
0321 }
0322 else if (fAbsorberMaterial == fLead) {
0323 lambda = 17.092 * cm;
0324 }
0325 else if (fAbsorberMaterial == fPbWO4) {
0326 lambda = 22.4 * cm;
0327 }
0328 else if (fAbsorberMaterial == fUranium) {
0329 lambda = 10.501 * cm;
0330 }
0331 else if (fAbsorberMaterial == fGraphite) {
0332 lambda = 38.82 * cm;
0333 }
0334 else {
0335 std::cout << "ERROR: absorber material not recognized" << std::endl;
0336 }
0337 }
0338
0339
0340
0341 G4double absorberTotalLength = fAbsorberTotalLength;
0342 G4double calorimeterRadius = fCalorimeterRadius;
0343 if (fIsUnitInLambda) {
0344 absorberTotalLength *= lambda;
0345 calorimeterRadius *= lambda;
0346 }
0347
0348
0349
0350 G4double expHall_x = 10.0 * m;
0351 G4double expHall_y = 10.0 * m;
0352 G4double expHall_z = 10.0 * m;
0353
0354 G4Box* experimentalHall_box = new G4Box("expHall_box", expHall_x, expHall_y, expHall_z);
0355 fExperimentalHall_log = new G4LogicalVolume(experimentalHall_box,
0356 fVacuum,
0357 "expHall_log",
0358 0,
0359 0,
0360 0);
0361 fExperimentalHall_phys = new G4PVPlacement(0,
0362 G4ThreeVector(),
0363 "expHall",
0364 fExperimentalHall_log,
0365 0,
0366 false,
0367 0);
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379 G4double zAbsorber = absorberTotalLength / static_cast<double>(fActiveLayerNumber);
0380
0381
0382
0383
0384 if (fIsCalHomogeneous) {
0385 fActiveMaterial = fAbsorberMaterial;
0386 zAbsorber -= fActiveLayerSize;
0387 }
0388 zAbsorber /= 2.0;
0389 G4Tubs* solidAbsorber = new G4Tubs("solidAbsorber",
0390 0.0,
0391 calorimeterRadius,
0392 zAbsorber,
0393 0.0,
0394 2.0 * pi);
0395 fLogicAbsorber = new G4LogicalVolume(solidAbsorber,
0396 fAbsorberMaterial,
0397 "logicAbsorber",
0398 0,
0399 0,
0400 0);
0401
0402
0403 G4double zActive = fActiveLayerSize / 2.0;
0404 G4Tubs* solidActive = new G4Tubs("solidActive",
0405 0.0,
0406 calorimeterRadius,
0407 zActive,
0408 0.0,
0409 2.0 * pi);
0410 fLogicActive = new G4LogicalVolume(solidActive,
0411 fActiveMaterial,
0412 "logicActive",
0413 0,
0414 0,
0415 0);
0416
0417
0418 G4double zModule = zAbsorber + zActive;
0419 G4Tubs* solidModule = new G4Tubs("solidModule",
0420 0.0,
0421 calorimeterRadius,
0422 zModule,
0423 0.0,
0424 2.0 * pi);
0425 fLogicModule = new G4LogicalVolume(solidModule,
0426 fLead,
0427 "logicModule",
0428 0,
0429 0,
0430 0);
0431
0432
0433 G4int numberOfModules = fActiveLayerNumber;
0434 G4double zCalo = numberOfModules * zModule;
0435 fCaloLength = 2.0 * zCalo;
0436 G4Tubs* solidCalo = new G4Tubs("solidCalo",
0437 0.0,
0438 calorimeterRadius,
0439 zCalo,
0440 0.0,
0441 2.0 * pi);
0442 fLogicCalo = new G4LogicalVolume(solidCalo,
0443 fLead,
0444 "logicCalo",
0445 0,
0446 0,
0447 0);
0448
0449
0450 G4double zpos = -zActive;
0451 fPhysiAbsorber = new G4PVPlacement(0,
0452 G4ThreeVector(0, 0, zpos),
0453 fLogicAbsorber,
0454 "physiAbsorber",
0455 fLogicModule,
0456 false,
0457 1000);
0458
0459
0460 zpos += zAbsorber + zActive;
0461 fPhysiActive = new G4PVPlacement(0,
0462 G4ThreeVector(0, 0, zpos),
0463 fLogicActive,
0464 "physiActive",
0465 fLogicModule,
0466 false,
0467 2000);
0468
0469
0470 fPhysiModule = new G4PVReplica("Calo",
0471 fLogicModule,
0472 fLogicCalo,
0473 kZAxis,
0474 numberOfModules,
0475 2 * (zAbsorber + zActive));
0476
0477
0478 fPhysiCalo = new G4PVPlacement(0,
0479 G4ThreeVector(),
0480 "physiCalo",
0481 fLogicCalo,
0482 fExperimentalHall_phys,
0483 false,
0484 100);
0485
0486
0487
0488
0489 G4Tubs* solidScoringUpDown = new G4Tubs("solidScoringUpDown",
0490 0.0,
0491 calorimeterRadius,
0492 0.5 * fScoringThickness,
0493 0.0,
0494 2.0 * pi);
0495 fLogicScoringUpDown = new G4LogicalVolume(solidScoringUpDown,
0496 fVacuum,
0497 "logicScoringUpDown",
0498 0,
0499 0,
0500 0);
0501 G4double zScoringUpDown = 0.5 * (fCaloLength + fScoringThickness);
0502 fPhysiScoringUpstream = new G4PVPlacement(0,
0503 G4ThreeVector(0.0, 0.0, -zScoringUpDown),
0504
0505 "physiScoringUpstream",
0506 fLogicScoringUpDown,
0507 fExperimentalHall_phys,
0508 false,
0509 0);
0510 fPhysiScoringDownstream = new G4PVPlacement(0,
0511 G4ThreeVector(0.0, 0.0, zScoringUpDown),
0512
0513 "physiScoringDownstream",
0514 fLogicScoringUpDown,
0515 fExperimentalHall_phys,
0516 false,
0517 0);
0518
0519 G4Tubs* solidScoringSide = new G4Tubs("solidScoringSide",
0520 calorimeterRadius,
0521 calorimeterRadius + fScoringThickness,
0522 0.5 * fCaloLength,
0523 0.0,
0524 2.0 * pi);
0525 fLogicScoringSide = new G4LogicalVolume(solidScoringSide,
0526 fVacuum,
0527 "logicScoringSide",
0528 0,
0529 0,
0530 0);
0531 fPhysiScoringSide = new G4PVPlacement(0,
0532 G4ThreeVector(0.0, 0.0, 0.0),
0533 "physiScoringSide",
0534 fLogicScoringSide,
0535 fExperimentalHall_phys,
0536 false,
0537 0);
0538
0539 return fExperimentalHall_phys;
0540 }
0541
0542
0543
0544 G4bool DetectorConstruction::AreParametersOK()
0545 {
0546 bool isOk = true;
0547 if (!fAbsorberMaterial) {
0548 isOk = false;
0549 G4cout << " DetectorConstruction::AreParametersOK() : UNDEFINED absorber material" << G4endl;
0550 }
0551 if (!fActiveMaterial) {
0552 isOk = false;
0553 G4cout << " DetectorConstruction::AreParametersOK() : UNDEFINED active material" << G4endl;
0554 }
0555 if (fAbsorberTotalLength <= 0.0) {
0556 isOk = false;
0557 G4cout << " DetectorConstruction::AreParametersOK() : fAbsorberTotalLength = "
0558 << fAbsorberTotalLength << G4endl;
0559 }
0560 if (fCalorimeterRadius <= 0.0) {
0561 isOk = false;
0562 G4cout << " DetectorConstruction::AreParametersOK() : fCalorimeterRadius = "
0563 << fCalorimeterRadius << G4endl;
0564 }
0565 if (fActiveLayerNumber <= 0) {
0566 isOk = false;
0567 G4cout << " DetectorConstruction::AreParametersOK() : fActiveLayerNumber = "
0568 << fActiveLayerNumber << G4endl;
0569 }
0570 if (fActiveLayerSize <= 0.0) {
0571 isOk = false;
0572 G4cout << " DetectorConstruction::AreParametersOK() : fActiveLayerSize = " << fActiveLayerSize
0573 << G4endl;
0574 }
0575 return isOk;
0576 }
0577
0578
0579
0580 void DetectorConstruction::SetMagField(const G4double fieldValue)
0581 {
0582 if (fUniformMagField) {
0583 delete fUniformMagField;
0584 }
0585 if (std::abs(fieldValue) > 0.0) {
0586
0587
0588
0589 fUniformMagField = new G4UniformMagField(G4ThreeVector(0.0, fieldValue, 0.0));
0590 fFieldMgr->SetDetectorField(fUniformMagField);
0591 fFieldMgr->CreateChordFinder(fUniformMagField);
0592 }
0593 }
0594
0595
0596
0597 void DetectorConstruction::SetAbsorberMaterial(const G4String name)
0598 {
0599 if (name == "Fe" || name == "Iron" || name == "iron") {
0600 fAbsorberMaterial = fIron;
0601 }
0602 else if (name == "Cu" || name == "Copper" || name == "copper") {
0603 fAbsorberMaterial = fCopper;
0604 }
0605 else if (name == "Brass" || name == "brass") {
0606 fAbsorberMaterial = fBrass;
0607 }
0608 else if (name == "Pb" || name == "Lead" || name == "lead") {
0609 fAbsorberMaterial = fLead;
0610 }
0611 else if (name == "PbWO4") {
0612 fAbsorberMaterial = fPbWO4;
0613 }
0614 else if (name == "W" || name == "Tungsten" || name == "tungsten") {
0615 fAbsorberMaterial = fTungsten;
0616 }
0617 else if (name == "U" || name == "Uranium" || name == "uranium") {
0618 fAbsorberMaterial = fUranium;
0619 }
0620 else if (name == "C" || name == "Graphite" || name == "graphite") {
0621 fAbsorberMaterial = fGraphite;
0622 }
0623 else {
0624 G4cout << G4endl << G4endl << "WARNING: the name of the material has not been recognized!"
0625 << G4endl << " ===> the default * Iron * will be used." << G4endl << G4endl;
0626 fAbsorberMaterial = fIron;
0627 }
0628 fLogicAbsorber->SetMaterial(fAbsorberMaterial);
0629 }
0630
0631
0632
0633 void DetectorConstruction::SetActiveMaterial(const G4String name)
0634 {
0635 if (name == "Scintillator" || name == "scintillator") {
0636 fActiveMaterial = fPolystyrene;
0637 }
0638 else if (name == "LAr" || name == "LiquidArgon" || name == "liquidArgon") {
0639 fActiveMaterial = fLiquidArgon;
0640 }
0641 else if (name == "PbWO4") {
0642 fActiveMaterial = fPbWO4;
0643 }
0644 else if (name == "Si" || name == "Silicon" || name == "silicon") {
0645 fActiveMaterial = fSilicon;
0646 }
0647 else if (name == "Quartz" || name == "quartz") {
0648 fActiveMaterial = fQuartz;
0649 }
0650 else if (name == "C" || name == "Graphite" || name == "graphite") {
0651 fActiveMaterial = fGraphite;
0652 }
0653 else {
0654 G4cout << G4endl << G4endl << "WARNING: the name of the material has not been recognized!"
0655 << G4endl << " ===> the default * Scintillator * will be used." << G4endl
0656 << G4endl;
0657 fActiveMaterial = fPolystyrene;
0658 }
0659 fLogicActive->SetMaterial(fActiveMaterial);
0660 }
0661
0662
0663
0664 void DetectorConstruction::UpdateGeometry()
0665 {
0666
0667 G4RunManager::GetRunManager()->ReinitializeGeometry();
0668 PrintParameters();
0669
0670 const PrimaryGeneratorAction* pPrimaryAction = dynamic_cast<const PrimaryGeneratorAction*>(
0671 G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction());
0672 if (pPrimaryAction) pPrimaryAction->SetGunPosition();
0673 }
0674
0675
0676
0677 void DetectorConstruction::PrintParameters()
0678 {
0679 G4cout << G4endl << G4endl << " ------ DetectorConstruction::PrintParameters() ------ " << G4endl
0680 << " Absorber Material = ";
0681 if (fAbsorberMaterial) {
0682 G4cout << fAbsorberMaterial->GetName();
0683 }
0684 else {
0685 G4cout << " UNDEFINED ";
0686 }
0687 G4cout << G4endl << " Active Material = ";
0688 if (fActiveMaterial) {
0689 G4cout << fActiveMaterial->GetName();
0690 }
0691 else {
0692 G4cout << " UNDEFINED ";
0693 }
0694 G4cout << G4endl << " Is the Calorimeter Homogeneous ? " << fIsCalHomogeneous;
0695 G4cout << G4endl << " Is the Unit in Lambda ? " << fIsUnitInLambda;
0696 G4cout << G4endl << " Absorber Total Length = ";
0697 if (fIsUnitInLambda) {
0698 G4cout << fAbsorberTotalLength << " lambdas";
0699 }
0700 else {
0701 G4cout << fAbsorberTotalLength / m << " m";
0702 }
0703 G4cout << G4endl << " Calorimeter Radius = ";
0704 if (fIsUnitInLambda) {
0705 G4cout << fCalorimeterRadius << " lambdas";
0706 }
0707 else {
0708 G4cout << fCalorimeterRadius / m << " m";
0709 }
0710 G4cout << G4endl << " Active Layer Number = " << fActiveLayerNumber;
0711 G4cout << G4endl << " Active Layer Size = " << fActiveLayerSize / mm << " mm";
0712 G4cout << G4endl << " Is the Radius Unit in Lambda ? " << fIsRadiusUnitInLambda;
0713 G4cout << G4endl << " Radius Bin Size = ";
0714 G4cout << G4endl << " Magnetic field [T] = ";
0715 if (fUniformMagField) {
0716 G4cout << fUniformMagField->GetConstantFieldValue() / tesla;
0717 }
0718 else {
0719 G4cout << "(0,0,0)";
0720 }
0721
0722 G4cout << G4endl << " -------------------------------------------------------- " << G4endl
0723 << G4endl;
0724 }
0725
0726