File indexing completed on 2025-01-31 09:22:19
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 "globals.hh"
0030 #include "G4SystemOfUnits.hh"
0031 #include "G4Box.hh"
0032 #include "G4Tubs.hh"
0033 #include "G4UnionSolid.hh"
0034 #include "G4Trd.hh"
0035 #include "G4AssemblyVolume.hh"
0036 #include "G4VisAttributes.hh"
0037 #include "G4Colour.hh"
0038 #include "G4RunManager.hh"
0039 #include "G4LogicalVolume.hh"
0040 #include "G4PVPlacement.hh"
0041 #include "G4PVReplica.hh"
0042 #include "G4RotationMatrix.hh"
0043 #include "G4NistManager.hh"
0044 #include "G4NistElementBuilder.hh"
0045 #include "HadrontherapyDetectorConstruction.hh"
0046 #include "HadrontherapyTIFPAPassiveProtonBeamLine.hh"
0047 #include "HadrontherapyTIFPAPassiveProtonBeamLineMessenger.hh"
0048
0049
0050 TrentoPassiveProtonBeamLine::TrentoPassiveProtonBeamLine():
0051 logicTreatmentRoom(0), physicalTreatmentRoom(0),hadrontherapyDetectorConstruction(0),
0052 physiBeamLineSupport(0), physiBeamLineCover(0), physiBeamLineCover2(0),
0053 physiMonitorLayer1(0), physiMonitorLayer2(0),
0054 ScatteringFoil(0), logicScatteringFoil(0), physiScatteringFoil(0), ridgeFilterPhys(0), preCollimator(0), physiPreCollimator(0), Collimator(0), physiCollimator(0), solidAirTube(0), solidAirPreTube(0), physiAirTube(0), physiAirPreTube(0)
0055
0056
0057 {
0058
0059 TrentoPassiveMessenger = new TrentoPassiveProtonBeamLineMessenger(this);
0060
0061
0062 static G4String ROGeometryName = "DetectorROGeometry";
0063 RO = new HadrontherapyDetectorROGeometry(ROGeometryName);
0064
0065 G4cout << "Going to register Parallel world...";
0066 RegisterParallelWorld(RO);
0067 G4cout << "... done" << G4endl;
0068
0069
0070 }
0071
0072 TrentoPassiveProtonBeamLine::~TrentoPassiveProtonBeamLine()
0073 {
0074 delete TrentoPassiveMessenger;
0075 delete hadrontherapyDetectorConstruction;
0076 }
0077
0078 using namespace std;
0079
0080
0081 G4VPhysicalVolume* TrentoPassiveProtonBeamLine::Construct()
0082 {
0083
0084 SetDefaultDimensions();
0085
0086
0087 ConstructTrentoPassiveProtonBeamLine();
0088
0089
0090 if (!hadrontherapyDetectorConstruction)
0091
0092
0093 hadrontherapyDetectorConstruction = new HadrontherapyDetectorConstruction(physicalTreatmentRoom);
0094
0095
0096
0097
0098 hadrontherapyDetectorConstruction->InitializeDetectorROGeometry(RO,hadrontherapyDetectorConstruction->GetDetectorToWorldPosition());
0099
0100 return physicalTreatmentRoom;
0101 }
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113 void TrentoPassiveProtonBeamLine::SetDefaultDimensions()
0114 {
0115
0116 white = new G4VisAttributes( G4Colour());
0117 white -> SetVisibility(true);
0118 white -> SetForceSolid(true);
0119
0120 blue = new G4VisAttributes(G4Colour(0. ,0. ,1.));
0121 blue -> SetVisibility(true);
0122 blue -> SetForceSolid(true);
0123
0124 gray = new G4VisAttributes( G4Colour(0.5, 0.5, 0.5 ));
0125 gray-> SetVisibility(true);
0126 gray-> SetForceSolid(true);
0127
0128 red = new G4VisAttributes(G4Colour(1. ,0. ,0.));
0129 red-> SetVisibility(true);
0130 red-> SetForceSolid(true);
0131
0132 yellow = new G4VisAttributes(G4Colour(1., 1., 0. ));
0133 yellow-> SetVisibility(true);
0134 yellow-> SetForceSolid(true);
0135
0136 green = new G4VisAttributes( G4Colour(25/255. , 255/255. , 25/255. ));
0137 green -> SetVisibility(true);
0138 green -> SetForceSolid(true);
0139
0140 darkGreen = new G4VisAttributes( G4Colour(0/255. , 100/255. , 0/255. ));
0141 darkGreen -> SetVisibility(true);
0142 darkGreen -> SetForceSolid(true);
0143
0144 darkOrange3 = new G4VisAttributes( G4Colour(205/255. , 102/255. , 000/255. ));
0145 darkOrange3 -> SetVisibility(true);
0146 darkOrange3 -> SetForceSolid(false);
0147
0148 skyBlue = new G4VisAttributes( G4Colour(135/255. , 206/255. , 235/255. ));
0149 skyBlue -> SetVisibility(true);
0150 skyBlue -> SetForceSolid(true);
0151
0152
0153
0154
0155
0156 G4double defaultScatteringFoilXSize = 0.75*cm;
0157 ScatteringFoilXSize = defaultScatteringFoilXSize;
0158
0159 G4double defaultScatteringFoilYSize = 100*mm;
0160 ScatteringFoilYSize = defaultScatteringFoilYSize;
0161
0162 G4double defaultScatteringFoilZSize = 100 *mm;
0163 ScatteringFoilZSize = defaultScatteringFoilZSize;
0164
0165 G4double defaultScatteringFoilXPosition = -273.*cm;
0166 ScatteringFoilXPosition = defaultScatteringFoilXPosition;
0167
0168 G4double defaultScatteringFoilYPosition = 0 *mm;
0169 ScatteringFoilYPosition = defaultScatteringFoilYPosition;
0170
0171 G4double defaultScatteringFoilZPosition = 0 *mm;
0172 ScatteringFoilZPosition = defaultScatteringFoilZPosition;
0173
0174
0175 G4double defaultPreCollimatorXHalfSide = 12.5 * cm;
0176 preCollimatorXHalfSide = defaultPreCollimatorXHalfSide;
0177
0178 G4double defaultPreCollimatorXPosition = -50.*cm;
0179 preCollimatorXPosition = defaultPreCollimatorXPosition;
0180
0181
0182 G4double defaultYHalfSideAirTube= 5.*cm;
0183 YHalfSideAirTube = defaultYHalfSideAirTube;
0184
0185 G4double defaultZHalfSideAirTube = 5.*cm;
0186 ZHalfSideAirTube = defaultZHalfSideAirTube;
0187
0188
0189
0190
0191
0192
0193 G4bool isotopes = false;
0194 G4Material* aluminumNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Al", isotopes);
0195 G4Material* copperNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Cu", isotopes);
0196 G4Element* zincNist = G4NistManager::Instance()->FindOrBuildElement("Zn");
0197 G4Element* copper = G4NistManager::Instance()->FindOrBuildElement("Cu");
0198 G4Element* silicNist = G4NistManager::Instance()->FindOrBuildElement("Si");
0199 G4Element* hydrogenNist = G4NistManager::Instance()->FindOrBuildElement("H");
0200 G4Element* oxygenNist = G4NistManager::Instance()->FindOrBuildElement("O");
0201 G4Element* carbonNist = G4NistManager::Instance()->FindOrBuildElement("C");
0202
0203
0204 G4Material* airNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_AIR", isotopes);
0205 G4Material* PMMANist = G4NistManager::Instance()->FindOrBuildMaterial("G4_PLEXIGLASS", isotopes);
0206 G4Material* MylarNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_MYLAR");
0207
0208 G4int nComponents;
0209 G4int nAtoms;
0210 G4double fractionmass;
0211
0212
0213 G4Material* SiO2 = new G4Material("quartz", 2.200*g/cm3, nComponents=2);
0214 SiO2->AddElement(silicNist, nAtoms=1);
0215 SiO2->AddElement(oxygenNist , nAtoms=2);
0216
0217
0218 G4Material* Epoxy = new G4Material("Epoxy" , 1.2*g/cm3, nComponents=2);
0219 Epoxy->AddElement(hydrogenNist, nAtoms=2);
0220 Epoxy->AddElement(carbonNist, nAtoms=2);
0221
0222
0223 G4Material* FR4 = new G4Material("FR4" , 1.86*g/cm3, nComponents=2);
0224 FR4->AddMaterial(SiO2, fractionmass=0.528);
0225 FR4->AddMaterial(Epoxy, fractionmass=0.472);
0226
0227
0228 G4Material* brass = new G4Material("Brass", 8.40*g/cm3, nComponents=2);
0229 brass -> AddElement(zincNist, fractionmass = 30 *perCent);
0230 brass -> AddElement(copper, fractionmass = 70 *perCent);
0231
0232
0233 G4Material* plastic = new G4Material("Plastic", 1.40*g/cm3, nComponents=3);
0234 plastic -> AddElement(carbonNist, nAtoms = 21);
0235 plastic -> AddElement(oxygenNist, nAtoms = 4);
0236 plastic -> AddElement(hydrogenNist, nAtoms = 24);
0237
0238
0239
0240
0241
0242 new G4Material("dummyMat", 1., 1.*g/mole, 1.*g/cm3);
0243
0244
0245
0246
0247 beamLineSupportMaterial = aluminumNist;
0248
0249
0250 layerMonitorChamberMaterial = MylarNist;
0251 layerDefaultMaterial = airNist;
0252 internalStructureMaterial = FR4;
0253 FoilMaterial = copperNist;
0254 airgapMaterial = airNist;
0255
0256
0257 ScatteringFoilMaterial = copperNist;
0258
0259
0260 singleTrapMaterial = plastic;
0261
0262
0263 preCollimatorMaterial = PMMANist;
0264 CollimatorMaterial = brass;
0265
0266
0267 airTubeMaterial = airTube2Material = airTube3Material = airNist;
0268
0269 }
0270
0271
0272 void TrentoPassiveProtonBeamLine::ConstructTrentoPassiveProtonBeamLine()
0273 {
0274
0275
0276
0277
0278 const G4double worldX = 400.0 *cm;
0279 const G4double worldY = 400.0 *cm;
0280 const G4double worldZ = 400.0 *cm;
0281 G4bool isotopes = false;
0282
0283 G4Material* airNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_AIR", isotopes);
0284
0285 G4Box* treatmentRoom = new G4Box("TreatmentRoom",
0286 worldX,
0287 worldY,
0288 worldZ);
0289
0290 logicTreatmentRoom = new G4LogicalVolume(treatmentRoom,
0291 airNist,
0292 "logicTreatmentRoom",
0293 0,0,0);
0294
0295 physicalTreatmentRoom = new G4PVPlacement(0,
0296 G4ThreeVector(),
0297 "physicalTreatmentRoom",
0298 logicTreatmentRoom,
0299 0,
0300 false,
0301 0);
0302
0303
0304
0305 logicTreatmentRoom -> SetVisAttributes (G4VisAttributes::GetInvisible());
0306
0307
0308 HadrontherapyBeamLineSupport();
0309 HadrontherapyBeamMonitoring();
0310 HadrontherapyBeamScatteringFoils();
0311 HadrontherapyRidgeFilter();
0312 HadrontherapyBeamCollimators();
0313
0314 }
0315
0316
0317 void TrentoPassiveProtonBeamLine::HadrontherapyBeamLineSupport()
0318 {
0319
0320
0321
0322 const G4double beamLineSupportXSize = 1.2*m;
0323 const G4double beamLineSupportYSize = 20.*mm;
0324 const G4double beamLineSupportZSize = 600.*mm;
0325
0326 const G4double beamLineSupportXPosition = -1745.09 *mm;
0327 const G4double beamLineSupportYPosition = -230. *mm;
0328 const G4double beamLineSupportZPosition = 0.*mm;
0329
0330 G4Box* beamLineSupport = new G4Box("BeamLineSupport",
0331 beamLineSupportXSize,
0332 beamLineSupportYSize,
0333 beamLineSupportZSize);
0334
0335 G4LogicalVolume* logicBeamLineSupport = new G4LogicalVolume(beamLineSupport,
0336 beamLineSupportMaterial,
0337 "BeamLineSupport");
0338
0339 physiBeamLineSupport = new G4PVPlacement(0, G4ThreeVector(beamLineSupportXPosition,
0340 beamLineSupportYPosition,
0341 beamLineSupportZPosition),
0342 "BeamLineSupport",
0343 logicBeamLineSupport,
0344 physicalTreatmentRoom,
0345 false,
0346 0);
0347
0348
0349 logicBeamLineSupport -> SetVisAttributes(gray);
0350
0351
0352
0353
0354 const G4double beamLineCoverXSize = 1.2*m;
0355 const G4double beamLineCoverYSize = 750.*mm;
0356 const G4double beamLineCoverZSize = 10.*mm;
0357
0358 const G4double beamLineCoverXPosition = -1745.09 *mm;
0359 const G4double beamLineCoverYPosition = -1000.*mm;
0360 const G4double beamLineCoverZPosition = 600.*mm;
0361
0362 G4Box* beamLineCover = new G4Box("BeamLineCover",
0363 beamLineCoverXSize,
0364 beamLineCoverYSize,
0365 beamLineCoverZSize);
0366
0367 G4LogicalVolume* logicBeamLineCover = new G4LogicalVolume(beamLineCover,
0368 beamLineSupportMaterial,
0369 "BeamLineCover");
0370
0371 physiBeamLineCover = new G4PVPlacement(0, G4ThreeVector(beamLineCoverXPosition,
0372 beamLineCoverYPosition,
0373 beamLineCoverZPosition),
0374 "BeamLineCover",
0375 logicBeamLineCover,
0376 physicalTreatmentRoom,
0377 false,
0378 0);
0379
0380
0381
0382
0383
0384 physiBeamLineCover2 = new G4PVPlacement(0, G4ThreeVector(beamLineCoverXPosition,
0385 beamLineCoverYPosition,
0386 - beamLineCoverZPosition),
0387 "BeamLineCover2",
0388 logicBeamLineCover,
0389 physicalTreatmentRoom,
0390 false,
0391 0);
0392
0393 logicBeamLineCover -> SetVisAttributes(blue);
0394 }
0395
0396
0397 void TrentoPassiveProtonBeamLine::HadrontherapyBeamMonitoring()
0398 {
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412 const G4double monitorXSize = 12.*um;
0413 const G4double monitorYSize = 12.7*cm;
0414 const G4double monitorZSize = 12.7*cm;
0415
0416 const G4double shift = 17.*cm;
0417
0418 const G4double monitorlayer1XPosition = -269.*cm +shift;
0419 const G4double monitorlayer2XPosition = -270.4104*cm +shift;
0420
0421
0422
0423 G4Box* solidMonitorLayer1 = new G4Box("MonitorLayer1",
0424 monitorXSize/2,
0425 monitorYSize/2,
0426 monitorZSize/2);
0427
0428 G4LogicalVolume* logicMonitorLayer1 = new G4LogicalVolume(solidMonitorLayer1,
0429 layerMonitorChamberMaterial,
0430 "MonitorLayer1");
0431
0432 physiMonitorLayer1 = new G4PVPlacement(0,
0433 G4ThreeVector(monitorlayer1XPosition, 0.*cm, 0.*cm),
0434 "MonitorLayer1",
0435 logicMonitorLayer1,
0436 physicalTreatmentRoom,
0437 false,
0438 0);
0439
0440
0441 G4Box* solidMonitorLayer2 = new G4Box("MonitorLayer2",
0442 monitorXSize/2,
0443 monitorYSize/2,
0444 monitorZSize/2);
0445
0446 G4LogicalVolume* logicMonitorLayer2 = new G4LogicalVolume(solidMonitorLayer2,
0447 layerMonitorChamberMaterial,
0448 "MonitorLayer2");
0449
0450 physiMonitorLayer2 = new G4PVPlacement(0,
0451 G4ThreeVector(monitorlayer2XPosition, 0.*cm, 0.*cm),
0452 "MonitorLayer2",
0453 logicMonitorLayer2,
0454 physicalTreatmentRoom,
0455 false,
0456 0);
0457
0458 logicMonitorLayer1 -> SetVisAttributes(gray);
0459 logicMonitorLayer2 -> SetVisAttributes(gray);
0460
0461
0462
0463
0464
0465
0466 const G4double layerThickness = 816*um;
0467 const G4double layerXposition = -270.2684*cm;
0468 const G4int nofLayers = 5;
0469 const G4double internalStructureThickness = 800.*um;
0470 const G4double airGapThickness = 2.*mm;
0471 const G4double foilThickness = 8.*um;
0472 const G4double FirstCoppperLayerXPosition = -404.*um;
0473 const G4double SecondCoppperLayerXPosition = 404.*um;
0474 const G4double InternalStructureXPosition = 0.;
0475
0476
0477 G4VSolid* SolidAirLayer= new G4Box("Layer",
0478 layerThickness,
0479 monitorYSize/2,
0480 monitorZSize/2);
0481
0482 new G4LogicalVolume(SolidAirLayer,
0483 layerDefaultMaterial,
0484 "Layer");
0485
0486
0487
0488
0489 G4VSolid* SolidFirstCoppperLayer = new G4Box("SolidFirstCoppperLayer",
0490 foilThickness/2,
0491 monitorYSize/2,
0492 monitorZSize/2);
0493
0494 G4LogicalVolume* LogicFirstCoppperLayer = new G4LogicalVolume(
0495 SolidFirstCoppperLayer,
0496 FoilMaterial,
0497 "SolidFirstCoppperLayer");
0498
0499
0500
0501 G4VSolid* SolidInternalStructure = new G4Box("SolidInternalStructure",
0502 internalStructureThickness/2,
0503 monitorYSize/2,
0504 monitorZSize/2);
0505
0506 G4LogicalVolume* LogicInternalStructure = new G4LogicalVolume(
0507 SolidInternalStructure,
0508 internalStructureMaterial,
0509 "SolidInternalStructure");
0510
0511
0512
0513
0514 G4VSolid* SolidSecondCoppperLayer = new G4Box("SolidSecondCoppperLayer",
0515 foilThickness/2,
0516 monitorYSize/2,
0517 monitorZSize/2);
0518
0519 G4LogicalVolume* LogicSecondCoppperLayer= new G4LogicalVolume(
0520 SolidSecondCoppperLayer,
0521 FoilMaterial,
0522 "SolidSecondCoppperLayer");
0523
0524
0525 G4RotationMatrix Ra, Rm;
0526 G4ThreeVector Ta;
0527 G4Transform3D Tr;
0528 G4AssemblyVolume* assemblyMonitor = new G4AssemblyVolume();
0529
0530
0531 Ta.setX(FirstCoppperLayerXPosition); Ta.setY(0.); Ta.setZ(0.);
0532 Tr = G4Transform3D(Ra,Ta);
0533 assemblyMonitor->AddPlacedVolume(LogicFirstCoppperLayer, Tr);
0534
0535 Ta.setX(InternalStructureXPosition); Ta.setY(0.); Ta.setZ(0.);
0536 Tr = G4Transform3D(Ra,Ta);
0537 assemblyMonitor->AddPlacedVolume(LogicInternalStructure, Tr );
0538
0539 Ta.setX(SecondCoppperLayerXPosition); Ta.setY(0.); Ta.setZ(0.);
0540 Tr = G4Transform3D(Ra,Ta);
0541
0542 assemblyMonitor->AddPlacedVolume(LogicSecondCoppperLayer, Tr );
0543
0544
0545 for( unsigned int i = 0; i<nofLayers; i++ )
0546 {
0547 G4ThreeVector Tm(shift+layerXposition + i*(airGapThickness), 0., 0.);
0548 Tr = G4Transform3D(Rm,Tm);
0549 assemblyMonitor -> MakeImprint(logicTreatmentRoom, Tr);
0550 }
0551
0552 }
0553
0554
0555 void TrentoPassiveProtonBeamLine::HadrontherapyBeamScatteringFoils()
0556 {
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566 ScatteringFoil = new G4Box("ScatteringFoil",
0567 ScatteringFoilXSize,
0568 ScatteringFoilYSize,
0569 ScatteringFoilZSize);
0570
0571
0572 logicScatteringFoil = new G4LogicalVolume(ScatteringFoil,
0573 ScatteringFoilMaterial,
0574 "ScatteringFoil");
0575
0576 physiScatteringFoil = new G4PVPlacement(0, G4ThreeVector(ScatteringFoilXPosition,
0577 ScatteringFoilYPosition,
0578 ScatteringFoilZPosition),
0579 "SeconScatteringFoil",
0580 logicScatteringFoil,
0581 physicalTreatmentRoom,
0582 false,
0583 0);
0584
0585 logicScatteringFoil -> SetVisAttributes(skyBlue);
0586 }
0587
0588 void TrentoPassiveProtonBeamLine::HadrontherapyRidgeFilter()
0589 {
0590
0591
0592
0593
0594
0595
0596
0597 G4double ridgeXPosition = -200*cm;
0598
0599 const G4double XBase = 0.1 *mm;
0600 const G4double YBase = 38.75*mm;
0601
0602 G4VSolid* RidgeBase = new G4Box("Base_RidgeFilter",
0603 XBase,
0604 YBase,
0605 YBase);
0606
0607 G4LogicalVolume* RidgeBaseLog = new G4LogicalVolume(RidgeBase,
0608 singleTrapMaterial,
0609 "Base_RidgeFilter");
0610
0611 new G4PVPlacement(0,
0612 G4ThreeVector(
0613 -199.7*cm,
0614 0.,
0615 0.),
0616 "Base_RidgeFilter",
0617 RidgeBaseLog,
0618 physicalTreatmentRoom,
0619 false,
0620 0);
0621
0622 RidgeBaseLog->SetVisAttributes(yellow);
0623
0624
0625
0626 G4double x0 = 1.215*mm;
0627 G4double x1 = 1*mm;
0628 G4double x2 = 0.95*mm;
0629 G4double x3 = 0.87*mm;
0630 G4double x4 = 0.76*mm;
0631 G4double x5 = 0.71*mm;
0632 G4double x6 = 0.65*mm;
0633 G4double x7 = 0.56*mm;
0634 G4double x8 = 0.529*mm;
0635 G4double x9 = 0.258*mm;
0636 G4double x10 = 0.225*mm;
0637 G4double x11 = 0.144*mm;
0638 G4double x12 = 0.055*mm;
0639
0640 G4double heigth = 0.13*mm;
0641 G4double heigth0 = 0.11*mm;
0642 G4double heigth1 = 2.3*mm;
0643 G4double heigth2 = 0.65*mm;
0644 G4double heigth3 = 1.9*mm;
0645 G4double heigth4 = 0.615*mm;
0646 G4double heigth5 = 2.23*mm;
0647 G4double heigth6 = 0.3*mm;
0648 G4double heigth7 = 4.1*mm;
0649 G4double heigth8 = 0.1*mm;
0650 G4double heigth9 = 0.105*mm;
0651 G4double heigth10 = 0.065*mm;
0652
0653 G4VSolid* Trap00 = new G4Trd("singleTrap00", x0, x1, x0, x1, heigth);
0654 G4VSolid* Trap0 = new G4Trd("singleTrap0", x1, x2, x1, x2, heigth0);
0655 G4VSolid* Trap1 = new G4Trd("singleTrap1", x2, x3, x2, x3, heigth1);
0656 G4VSolid* Trap2 = new G4Trd("singleTrap2", x3, x4, x3, x4, heigth2);
0657 G4VSolid* Trap3 = new G4Trd("singleTrap3", x4, x5, x4, x5, heigth3);
0658 G4VSolid* Trap4 = new G4Trd("singleTrap4", x5, x6, x5, x6, heigth4);
0659 G4VSolid* Trap5 = new G4Trd("singleTrap5", x6, x7, x6, x7, heigth5);
0660 G4VSolid* Trap6 = new G4Trd("singleTrap6", x7, x8, x7, x8, heigth6);
0661 G4VSolid* Trap7 = new G4Trd("singleTrap7", x8, x9, x8, x9, heigth7);
0662 G4VSolid* Trap8 = new G4Trd("singleTrap8", x9, x10, x9, x10, heigth8);
0663 G4VSolid* Trap9 = new G4Trd("singleTrap9", x10, x11, x10, x11, heigth9);
0664 G4VSolid* Trap10 = new G4Trd("singleTrap10", x11, x12, x11, x12, heigth10);
0665
0666
0667 G4ThreeVector tr0(0., 0., 0.24);
0668 G4ThreeVector tr1(0., 0., 2.54);
0669 G4ThreeVector tr2(0., 0., 2.55);
0670 G4ThreeVector tr3(0., 0., 2.845);
0671 G4ThreeVector tr4(0., 0., 4.4);
0672
0673 G4RotationMatrix* yRot = new G4RotationMatrix;
0674 yRot->rotateY(0);
0675 G4UnionSolid* unionTrap00 = new G4UnionSolid("Trap01", Trap00, Trap0, yRot, tr0);
0676 G4UnionSolid* unionTrap01 = new G4UnionSolid("Trap01", unionTrap00, Trap1, yRot, tr1);
0677 G4UnionSolid* unionTrap23 = new G4UnionSolid("Trap23", Trap2, Trap3, yRot, tr2);
0678 G4UnionSolid* unionTrap45 = new G4UnionSolid("Trap45", Trap4, Trap5, yRot, tr3);
0679 G4UnionSolid* unionTrap67 = new G4UnionSolid("Trap67", Trap6, Trap7, yRot, tr4);
0680
0681 G4ThreeVector tr03(0., 0., 5.09);
0682 G4UnionSolid* unionTrap03 = new G4UnionSolid("unionTrap03", unionTrap01, unionTrap23, yRot, tr03);
0683
0684 G4ThreeVector tr05(0., 0., 7.935);
0685 G4UnionSolid* unionTrap05 = new G4UnionSolid("unionTrap05", unionTrap03, unionTrap45, yRot, tr05);
0686
0687 G4ThreeVector tr_blocco1(0., 0., 12.335);
0688 G4UnionSolid* unionTrap_blocco1 = new G4UnionSolid("unionTrap_blocco1", unionTrap05, unionTrap67, yRot, tr_blocco1);
0689
0690 G4ThreeVector tr_blocco2( 0., 0., 12.435);
0691 G4UnionSolid* unionTrap_blocco2 = new G4UnionSolid("unionTrap_blocco2", unionTrap_blocco1, Trap8, yRot, tr_blocco2);
0692
0693 G4ThreeVector tr_blocco3(0., 0., 12.54);
0694 G4UnionSolid* unionTrap_blocco3 = new G4UnionSolid("unionTrap_blocco3", unionTrap_blocco2, Trap9, yRot, tr_blocco3);
0695
0696 G4ThreeVector tr_tot( 0., 0., 12.605);
0697 G4UnionSolid* unionTrap = new G4UnionSolid("unionTrap", unionTrap_blocco3, Trap10, yRot, tr_tot);
0698
0699
0700 G4LogicalVolume* singleTrapLog = new G4LogicalVolume(unionTrap, singleTrapMaterial, "singleTrap");
0701
0702
0703 singleTrapLog->SetVisAttributes(yellow);
0704
0705
0706 G4int numberOfLayers = 31;
0707 G4double minZ = -37.5*mm;
0708 G4double minY = -37.5*mm;
0709 G4double sum_space = 1.25*mm;
0710
0711 vector<G4ThreeVector> singleTrapPositions;
0712
0713 for (int i = 0; i < numberOfLayers; i++)
0714 {
0715 for (int j = 0; j < numberOfLayers; j++)
0716 {
0717 singleTrapPositions.push_back({-0.01*cm+ridgeXPosition,
0718 minY + 2*i*sum_space,
0719 minZ + 2*j*sum_space,});
0720 }
0721 }
0722
0723 G4double ti = - 90. *deg;
0724 G4RotationMatrix rt;
0725 rt.rotateY(ti);
0726
0727 G4int peaks = numberOfLayers*numberOfLayers;
0728 for (int i = 0; i < peaks; i++)
0729 {
0730
0731 ostringstream tName;tName << "singleTrap" << i;
0732 new G4PVPlacement(G4Transform3D(rt,
0733 singleTrapPositions[i]),
0734 singleTrapLog,
0735 "tName.str()",
0736 logicTreatmentRoom,
0737 0,
0738 i);
0739
0740 }
0741
0742
0743 }
0744
0745 void TrentoPassiveProtonBeamLine::HadrontherapyBeamCollimators()
0746 {
0747
0748
0749
0750
0751
0752
0753 const G4double preCollimatorYHalfSide = 10.*cm;
0754 const G4double preCollimatorZHalfSide = 10.*cm;
0755
0756 preCollimator = new G4Box("PreCollimator",
0757 preCollimatorXHalfSide,
0758 preCollimatorYHalfSide,
0759 preCollimatorZHalfSide);
0760
0761
0762 G4LogicalVolume* logicPreCollimator = new G4LogicalVolume(preCollimator,
0763 preCollimatorMaterial,
0764 "PreCollimator");
0765
0766
0767 physiPreCollimator = new G4PVPlacement(0,
0768 G4ThreeVector(
0769 -50.*cm,
0770 0.,
0771 0.),
0772 "PreCollimator",
0773 logicPreCollimator,
0774 physicalTreatmentRoom,
0775 false,
0776 0);
0777
0778
0779
0780 logicPreCollimator -> SetVisAttributes(white);
0781
0782
0783
0784
0785
0786
0787
0788
0789 G4double collimatorYHalfSide = 10.*cm;
0790 G4double collimatorZHalfSide = 10.*cm;
0791 G4double collimatorXHalfSide = 3.25*cm;
0792
0793 G4double CollimatorXPosition = -34.25*cm;
0794
0795 Collimator = new G4Box("Collimator",
0796 collimatorXHalfSide,
0797 collimatorYHalfSide,
0798 collimatorZHalfSide);
0799
0800
0801 G4LogicalVolume* logicCollimator = new G4LogicalVolume(Collimator,
0802 CollimatorMaterial,
0803 "Collimator");
0804
0805
0806
0807 physiCollimator = new G4PVPlacement(0, G4ThreeVector(CollimatorXPosition,
0808 0.,
0809 0.),
0810 "Collimator",
0811 logicCollimator,
0812 physicalTreatmentRoom,
0813 false,
0814 0);
0815
0816
0817
0818 logicCollimator -> SetVisAttributes(darkGreen);
0819
0820
0821
0822
0823
0824
0825
0826
0827 solidAirTube = new G4Box("AirTube",
0828 collimatorXHalfSide,
0829 YHalfSideAirTube,
0830 ZHalfSideAirTube);
0831
0832 G4LogicalVolume* logicAirTube = new G4LogicalVolume(solidAirTube,
0833 airTubeMaterial,
0834 "AirTube",
0835 0, 0, 0);
0836
0837
0838 physiAirTube = new G4PVPlacement(0, G4ThreeVector(0,
0839 0.,
0840 0.),
0841 "AirTube",
0842 logicAirTube,
0843 physiCollimator,
0844 false,
0845 0);
0846
0847 logicAirTube -> SetVisAttributes(darkOrange3);
0848
0849
0850
0851
0852
0853
0854
0855
0856 solidAirPreTube = new G4Box("AirPreTube",
0857 preCollimatorXHalfSide,
0858 YHalfSideAirTube,
0859 ZHalfSideAirTube);
0860
0861 G4LogicalVolume* logicAirPreTube = new G4LogicalVolume(solidAirPreTube,
0862 airTubeMaterial,
0863 "AirPreTube",
0864 0, 0, 0);
0865
0866
0867 physiAirPreTube = new G4PVPlacement(0,
0868 G4ThreeVector(0,
0869 0.,
0870 0.),
0871 "AirPreTube",
0872 logicAirPreTube,
0873 physiPreCollimator,
0874 false,
0875 0);
0876
0877 logicAirPreTube -> SetVisAttributes(darkOrange3);
0878
0879
0880
0881 }
0882
0883
0884
0885
0886
0887
0888
0889 void TrentoPassiveProtonBeamLine::SetScatteringFoilXSize(G4double value)
0890 {
0891 ScatteringFoil -> SetXHalfLength(value);
0892 G4RunManager::GetRunManager() -> GeometryHasBeenModified();
0893 G4cout <<"The X size of the second scattering foil is (mm):"<<
0894 ((ScatteringFoil -> GetXHalfLength())*2.)/mm
0895 << G4endl;
0896 }
0897
0898
0899 void TrentoPassiveProtonBeamLine::SetPreCollimatorXSize(G4double value)
0900 {
0901 preCollimator -> SetXHalfLength(value);
0902 G4cout<<"The size of the pre collimator is (mm)"
0903 << ((preCollimator -> GetXHalfLength())*2)/mm << G4endl;
0904 G4RunManager::GetRunManager() -> GeometryHasBeenModified();
0905
0906 }
0907
0908 void TrentoPassiveProtonBeamLine::SetPreCollimatorXPosition(G4double value)
0909 {
0910 physiPreCollimator -> SetTranslation(G4ThreeVector(value, 0., 0.));
0911 G4RunManager::GetRunManager() -> GeometryHasBeenModified();
0912 G4cout <<" The pre collimator is translated to" << value/mm <<"mm along the X axis" << G4endl;
0913
0914 }
0915
0916 void TrentoPassiveProtonBeamLine::SetAirTubeYSize(G4double value)
0917 {
0918 solidAirTube -> SetYHalfLength(value);
0919 G4cout<<"The y side of brass tube is (mm)"
0920 << ((preCollimator -> GetYHalfLength())*2) << G4endl;
0921 G4RunManager::GetRunManager() -> GeometryHasBeenModified();
0922 }
0923
0924
0925 void TrentoPassiveProtonBeamLine::SetAirTubeZSize(G4double value)
0926 {
0927 solidAirTube -> SetZHalfLength(value);
0928 G4cout<<"The z side of the brass tube is (mm)"
0929 << ((Collimator -> GetZHalfLength())*2) << G4endl;
0930 G4RunManager::GetRunManager() -> GeometryHasBeenModified();
0931
0932 }
0933
0934
0935
0936 void TrentoPassiveProtonBeamLine::SetScattererMaterial(G4String materialChoice)
0937 {
0938 if (G4Material* pttoMaterial = G4NistManager::Instance()->FindOrBuildMaterial(materialChoice, false) )
0939 {
0940 if (pttoMaterial)
0941 {
0942 ScatteringFoilMaterial = pttoMaterial;
0943 logicScatteringFoil -> SetMaterial(pttoMaterial);
0944 G4cout << "The material of the Scatterer has been changed to " << materialChoice << G4endl;
0945 }
0946 }
0947 else
0948 {
0949 G4cout << "WARNING: material \"" << materialChoice << "\" doesn't exist in NIST elements/materials"
0950 " table [located in $G4INSTALL/source/materials/src/G4NistMaterialBuilder.cc]" << G4endl;
0951 G4cout << "Use command \"/parameter/nist\" to see full materials list!" << G4endl;
0952 }
0953 }