Warning, file /geant4/examples/advanced/hadrontherapy/src/BESTPassiveProtonBeamline.cc was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
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 "G4VisAttributes.hh"
0034 #include "G4Colour.hh"
0035 #include "G4RunManager.hh"
0036 #include "G4LogicalVolume.hh"
0037 #include "G4PVPlacement.hh"
0038 #include "G4RotationMatrix.hh"
0039 #include "G4NistManager.hh"
0040 #include "G4NistElementBuilder.hh"
0041 #include "HadrontherapyDetectorConstruction.hh"
0042 #include "HadrontherapyModulator.hh"
0043 #include "BESTPassiveProtonBeamLine.hh"
0044 #include "BESTPassiveProtonBeamLineMessenger.hh"
0045
0046
0047
0048
0049 BESTPassiveProtonBeamLine::BESTPassiveProtonBeamLine():
0050 modulator(0), physicalTreatmentRoom(0),hadrontherapyDetectorConstruction(0),
0051 physiBeamLineSupport(0), physiBeamLineCover(0), physiBeamLineCover2(0),
0052 BESTfirstScatteringFoil(0), physiBESTFirstScatteringFoil(0), physiBESTKaptonWindow(0),
0053 solidBESTStopper(0), physiBESTStopper(0), BESTsecondScatteringFoil(0), physiBESTSecondScatteringFoil(0),
0054 physiBESTFirstCollimator(0), solidBESTRangeShifterBox(0), logicBESTRangeShifterBox(0),
0055 physiBESTRangeShifterBox(0), physiBESTSecondCollimator(0), physiBESTFirstCollimatorModulatorBox(0),
0056 physiBESTHoleFirstCollimatorModulatorBox(0), physiBESTSecondCollimatorModulatorBox(0),
0057 physiBESTHoleSecondCollimatorModulatorBox(0),
0058 chamberPhys(0),innerchamberPhys(0),enterWindowPhys(0),enterElectrodePhys(0),kaptonLayerPhys1(0),copperLayerPhys1(0),nickelLayerPhys1(0),fFirstCavityPhys(0),centralElectrode1Phys(0), centralWindowPhys(0), centralElectrode2Phys(0),fSecondCavityPhys(0),exitElectrodePhys(0),kaptonLayerPhys2(0),copperLayerPhys2(0),nickelLayerPhys2(0),exitWindowPhys(0),physiNozzleSupport(0), physiBrassTube(0), solidFinalCollimator(0), physiFinalCollimator(0)
0059 {
0060
0061 passiveMessenger = new BESTPassiveProtonBeamLineMessenger(this);
0062
0063
0064 static G4String ROGeometryName = "DetectorROGeometry";
0065 RO = new HadrontherapyDetectorROGeometry(ROGeometryName);
0066
0067 G4cout << "Going to register Parallel world...";
0068 RegisterParallelWorld(RO);
0069 G4cout << "... done" << G4endl;
0070
0071 }
0072
0073 BESTPassiveProtonBeamLine::~BESTPassiveProtonBeamLine()
0074 {
0075
0076 delete hadrontherapyDetectorConstruction;
0077
0078 }
0079
0080
0081 G4VPhysicalVolume* BESTPassiveProtonBeamLine::Construct()
0082 {
0083
0084 SetDefaultDimensions();
0085
0086
0087 ConstructBESTPassiveProtonBeamLine();
0088
0089
0090 if (!hadrontherapyDetectorConstruction)
0091
0092
0093
0094
0095 hadrontherapyDetectorConstruction = new HadrontherapyDetectorConstruction(physicalTreatmentRoom);
0096
0097
0098
0099
0100 hadrontherapyDetectorConstruction->InitializeDetectorROGeometry(RO,hadrontherapyDetectorConstruction->GetDetectorToWorldPosition());
0101
0102
0103
0104 return physicalTreatmentRoom;
0105 }
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117 void BESTPassiveProtonBeamLine::SetDefaultDimensions()
0118 {
0119
0120 white = new G4VisAttributes( G4Colour());
0121 white -> SetVisibility(true);
0122 white -> SetForceSolid(true);
0123
0124 blue = new G4VisAttributes(G4Colour(0. ,0. ,1.));
0125 blue -> SetVisibility(true);
0126 blue -> SetForceSolid(true);
0127
0128 gray = new G4VisAttributes( G4Colour(0.5, 0.5, 0.5 ));
0129 gray-> SetVisibility(true);
0130 gray-> SetForceSolid(true);
0131
0132 red = new G4VisAttributes(G4Colour(1. ,0. ,0.));
0133 red-> SetVisibility(true);
0134 red-> SetForceSolid(true);
0135
0136 yellow = new G4VisAttributes(G4Colour(1., 1., 0. ));
0137 yellow-> SetVisibility(true);
0138 yellow-> SetForceSolid(true);
0139
0140 green = new G4VisAttributes( G4Colour(25/255. , 255/255. , 25/255. ));
0141 green -> SetVisibility(true);
0142 green -> SetForceSolid(true);
0143
0144 darkGreen = new G4VisAttributes( G4Colour(0/255. , 100/255. , 0/255. ));
0145 darkGreen -> SetVisibility(true);
0146 darkGreen -> SetForceSolid(true);
0147
0148 darkOrange3 = new G4VisAttributes( G4Colour(205/255. , 102/255. , 000/255. ));
0149 darkOrange3 -> SetVisibility(true);
0150 darkOrange3 -> SetForceSolid(true);
0151
0152 skyBlue = new G4VisAttributes( G4Colour(135/255. , 206/255. , 235/255. ));
0153 skyBlue -> SetVisibility(true);
0154 skyBlue -> SetForceSolid(true);
0155
0156
0157
0158
0159 G4double defaultBESTVacuumZoneXSize = 100.0 *mm;
0160 BESTvacuumZoneXSize = defaultBESTVacuumZoneXSize;
0161
0162 G4double defaultBESTVacuumZoneYSize = 52.5 *mm;
0163 BESTvacuumZoneYSize = defaultBESTVacuumZoneYSize;
0164
0165 G4double defaultBESTVacuumZoneZSize = 52.5 *mm;
0166 BESTvacuumZoneZSize = defaultBESTVacuumZoneZSize;
0167
0168 G4double defaultBESTVacuumZoneXPosition = -3010.0 *mm;
0169 BESTvacuumZoneXPosition = defaultBESTVacuumZoneXPosition;
0170
0171
0172
0173 G4double defaultBESTFirstScatteringFoilXSize = 0.0075 *mm;
0174 BESTfirstScatteringFoilXSize = defaultBESTFirstScatteringFoilXSize;
0175
0176 G4double defaultBESTFirstScatteringFoilYSize = 52.5 *mm;
0177 BESTfirstScatteringFoilYSize = defaultBESTFirstScatteringFoilYSize;
0178
0179 G4double defaultBESTFirstScatteringFoilZSize = 52.5 *mm;
0180 BESTfirstScatteringFoilZSize = defaultBESTFirstScatteringFoilZSize;
0181
0182 G4double defaultBESTFirstScatteringFoilXPosition = 0.0 *mm;
0183 BESTfirstScatteringFoilXPosition = defaultBESTFirstScatteringFoilXPosition;
0184
0185
0186 G4double defaultBESTKaptonWindowXSize = 0.010*mm;
0187 BESTkaptonWindowXSize = defaultBESTKaptonWindowXSize;
0188
0189 G4double defaultBESTKaptonWindowYSize = 5.25*cm;
0190 BESTkaptonWindowYSize = defaultBESTKaptonWindowYSize;
0191
0192 G4double defaultBESTKaptonWindowZSize = 5.25*cm;
0193 BESTkaptonWindowZSize = defaultBESTKaptonWindowZSize;
0194
0195 G4double defaultBESTKaptonWindowXPosition = 100.0*mm - defaultBESTKaptonWindowXSize;
0196 BESTkaptonWindowXPosition = defaultBESTKaptonWindowXPosition;
0197
0198
0199
0200
0201 G4double defaultBESTInnerRadiusStopper = 0.*cm;
0202 BESTinnerRadiusStopper = defaultBESTInnerRadiusStopper;
0203
0204 G4double defaultBESTHeightStopper = 4.5*mm;
0205 BESTheightStopper = defaultBESTHeightStopper;
0206
0207 G4double defaultBESTStartAngleStopper = 0.*deg;
0208 BESTstartAngleStopper = defaultBESTStartAngleStopper;
0209
0210 G4double defaultBESTSpanningAngleStopper = 360.*deg;
0211 BESTspanningAngleStopper = defaultBESTSpanningAngleStopper;
0212
0213 G4double defaultBESTStopperXPosition = -2705.0 *mm;
0214 BESTstopperXPosition = defaultBESTStopperXPosition;
0215
0216 G4double defaultBESTStopperYPosition = 0.*m;
0217 BESTstopperYPosition = defaultBESTStopperYPosition;
0218
0219 G4double defaultBESTStopperZPosition = 0.*m;
0220 BESTstopperZPosition = defaultBESTStopperZPosition;
0221
0222 G4double defaultBESTOuterRadiusStopper = 3 *mm;
0223 BESTouterRadiusStopper = defaultBESTOuterRadiusStopper;
0224
0225
0226
0227
0228 G4double defaultBESTSecondScatteringFoilXSize = 0.0125 *mm;
0229 BESTsecondScatteringFoilXSize = defaultBESTSecondScatteringFoilXSize;
0230
0231 G4double defaultBESTSecondScatteringFoilYSize = 52.5 *mm;
0232 BESTsecondScatteringFoilYSize = defaultBESTSecondScatteringFoilYSize;
0233
0234 G4double defaultBESTSecondScatteringFoilZSize = 52.5 *mm;
0235 BESTsecondScatteringFoilZSize = defaultBESTSecondScatteringFoilZSize;
0236
0237 G4double defaultBESTSecondScatteringFoilXPosition = defaultBESTStopperXPosition + defaultBESTHeightStopper + defaultBESTSecondScatteringFoilXSize;
0238 BESTsecondScatteringFoilXPosition = defaultBESTSecondScatteringFoilXPosition;
0239
0240 G4double defaultBESTSecondScatteringFoilYPosition = 0 *mm;
0241 BESTsecondScatteringFoilYPosition = defaultBESTSecondScatteringFoilYPosition;
0242
0243 G4double defaultBESTSecondScatteringFoilZPosition = 0 *mm;
0244 BESTsecondScatteringFoilZPosition = defaultBESTSecondScatteringFoilZPosition;
0245
0246
0247
0248
0249
0250
0251 G4double defaultBESTRangeShifterXSize = 5. *mm;
0252 BESTrangeShifterXSize = defaultBESTRangeShifterXSize;
0253
0254 G4double defaultBESTRangeShifterYSize = 176. *mm;
0255 BESTrangeShifterYSize = defaultBESTRangeShifterYSize;
0256
0257 G4double defaultBESTRangeShifterZSize = 176. *mm;
0258 BESTrangeShifterZSize = defaultBESTRangeShifterZSize;
0259
0260 G4double defaultBESTRangeShifterXPosition = -2393.0 *mm;
0261 BESTrangeShifterXPosition = defaultBESTRangeShifterXPosition;
0262
0263 G4double defaultBESTRangeShifterYPosition = 0. *mm;
0264 BESTrangeShifterYPosition = defaultBESTRangeShifterYPosition;
0265
0266 G4double defaultBESTRangeShifterZPosition = 0. *mm;
0267 BESTrangeShifterZPosition = defaultBESTRangeShifterZPosition;
0268
0269
0270
0271
0272
0273 G4double defaultBESTinnerRadiusFinalCollimator = 7.5 *mm;
0274 BESTinnerRadiusFinalCollimator = defaultBESTinnerRadiusFinalCollimator;
0275
0276
0277
0278
0279
0280 G4bool isotopes = false;
0281 G4Material* aluminumNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Al", isotopes);
0282 G4Material* tantalumNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Ta", isotopes);
0283 G4Material* copperNistAsMaterial = G4NistManager::Instance()->FindOrBuildMaterial("G4_Cu", isotopes);
0284 G4Element* zincNist = G4NistManager::Instance()->FindOrBuildElement("Zn");
0285 G4Element* copperNist = G4NistManager::Instance()->FindOrBuildElement("Cu");
0286
0287
0288 G4Material* airNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_AIR", isotopes);
0289 G4Material* kaptonNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_KAPTON", isotopes);
0290 G4Material* galacticNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Galactic", isotopes);
0291 G4Material* PMMANist = G4NistManager::Instance()->FindOrBuildMaterial("G4_PLEXIGLASS", isotopes);
0292 G4Material* mylarNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_MYLAR", isotopes);
0293
0294 G4Material* nichelNistAsMaterial = G4NistManager::Instance()->FindOrBuildMaterial("G4_Ni", isotopes);
0295
0296
0297
0298
0299 G4double d;
0300 G4int nComponents;
0301 G4double fractionmass;
0302
0303 d = 8.40*g/cm3;
0304 nComponents = 2;
0305 G4Material* brass = new G4Material("Brass", d, nComponents);
0306 brass -> AddElement(zincNist, fractionmass = 30 *perCent);
0307 brass -> AddElement(copperNist, fractionmass = 70 *perCent);
0308
0309
0310
0311
0312
0313 new G4Material("dummyMat", 1., 1.*g/mole, 1.*g/cm3);
0314
0315
0316
0317
0318
0319
0320
0321 rangeShifterMaterial = airNist;
0322
0323
0324 beamLineSupportMaterial = aluminumNist;
0325
0326
0327 vacuumZoneMaterial = galacticNist;
0328
0329
0330 firstScatteringFoilMaterial = tantalumNist;
0331
0332
0333 kaptonWindowMaterial = kaptonNist;
0334
0335
0336 stopperMaterial = brass;
0337
0338
0339 secondScatteringFoilMaterial = tantalumNist;
0340
0341
0342 firstCollimatorMaterial = PMMANist;
0343 holeFirstCollimatorMaterial = airNist;
0344
0345
0346 modulatorBoxMaterial = aluminumNist;
0347 holeModulatorBoxMaterial = airNist;
0348
0349
0350 CopperLayerMaterial=copperNistAsMaterial;
0351 NichelLayerMaterial=nichelNistAsMaterial;
0352 KaptonLayerMaterial=kaptonNist;
0353 WindowMaterial=mylarNist;
0354 CentralWindowMaterial=mylarNist;
0355 wallMaterial=aluminumNist;
0356 ElectrodeMaterial=aluminumNist;
0357 CavityMaterial=airNist;
0358
0359
0360
0361 nozzleSupportMaterial = PMMANist;
0362 brassTubeMaterial = brassTube2Material = brassTube3Material = brass;
0363 holeNozzleSupportMaterial = airNist;
0364
0365
0366 finalCollimatorMaterial = brass;
0367 }
0368
0369
0370 void BESTPassiveProtonBeamLine::ConstructBESTPassiveProtonBeamLine()
0371 {
0372
0373
0374
0375
0376 const G4double worldX = 400.0 *cm;
0377 const G4double worldY = 400.0 *cm;
0378 const G4double worldZ = 400.0 *cm;
0379 G4bool isotopes = false;
0380
0381 G4Material* airNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_AIR", isotopes);
0382 G4Box* treatmentRoom = new G4Box("TreatmentRoom",worldX,worldY,worldZ);
0383 G4LogicalVolume* logicTreatmentRoom = new G4LogicalVolume(treatmentRoom,
0384 airNist,
0385 "logicTreatmentRoom",
0386 0,0,0);
0387 physicalTreatmentRoom = new G4PVPlacement(0,
0388 G4ThreeVector(),
0389 "physicalTreatmentRoom",
0390 logicTreatmentRoom,
0391 0,false,0);
0392
0393
0394
0395
0396
0397
0398 BESTBeamLineSupport();
0399 BESTBeamScatteringFoils();
0400 BESTRangeShifter();
0401 BESTBeamCollimators();
0402 BESTBeamMonitoring();
0403 BESTBeamNozzle();
0404 BESTBeamFinalCollimator();
0405
0406
0407
0408
0409 modulator = new HadrontherapyModulator();
0410 modulator -> BuildModulator(physicalTreatmentRoom);
0411 }
0412
0413
0414 void BESTPassiveProtonBeamLine::BESTBeamLineSupport()
0415 {
0416
0417
0418
0419 const G4double beamLineSupportXSize = 1.5*m;
0420 const G4double beamLineSupportYSize = 20.*mm;
0421 const G4double beamLineSupportZSize = 600.*mm;
0422
0423 const G4double beamLineSupportXPosition = -1745.09 *mm;
0424 const G4double beamLineSupportYPosition = -230. *mm;
0425 const G4double beamLineSupportZPosition = 0.*mm;
0426
0427 G4Box* beamLineSupport = new G4Box("BeamLineSupport",
0428 beamLineSupportXSize,
0429 beamLineSupportYSize,
0430 beamLineSupportZSize);
0431
0432 G4LogicalVolume* logicBeamLineSupport = new G4LogicalVolume(beamLineSupport,
0433 beamLineSupportMaterial,
0434 "BeamLineSupport");
0435 physiBeamLineSupport = new G4PVPlacement(0, G4ThreeVector(beamLineSupportXPosition,
0436 beamLineSupportYPosition,
0437 beamLineSupportZPosition),
0438 "BeamLineSupport",
0439 logicBeamLineSupport,
0440 physicalTreatmentRoom, false, 0);
0441
0442
0443
0444 logicBeamLineSupport -> SetVisAttributes(gray);
0445
0446
0447
0448
0449 const G4double beamLineCoverXSize = 1.5*m;
0450 const G4double beamLineCoverYSize = 750.*mm;
0451 const G4double beamLineCoverZSize = 10.*mm;
0452
0453 const G4double beamLineCoverXPosition = -1745.09 *mm;
0454 const G4double beamLineCoverYPosition = -1000.*mm;
0455 const G4double beamLineCoverZPosition = 600.*mm;
0456
0457 G4Box* beamLineCover = new G4Box("BeamLineCover",
0458 beamLineCoverXSize,
0459 beamLineCoverYSize,
0460 beamLineCoverZSize);
0461
0462 G4LogicalVolume* logicBeamLineCover = new G4LogicalVolume(beamLineCover,
0463 beamLineSupportMaterial,
0464 "BeamLineCover");
0465
0466 physiBeamLineCover = new G4PVPlacement(0, G4ThreeVector(beamLineCoverXPosition,
0467 beamLineCoverYPosition,
0468 beamLineCoverZPosition),
0469 "BeamLineCover",
0470 logicBeamLineCover,
0471 physicalTreatmentRoom,
0472 false,
0473 0);
0474
0475
0476
0477
0478
0479 physiBeamLineCover2 = new G4PVPlacement(0, G4ThreeVector(beamLineCoverXPosition,
0480 beamLineCoverYPosition,
0481 - beamLineCoverZPosition),
0482 "BeamLineCover2",
0483 logicBeamLineCover,
0484 physicalTreatmentRoom,
0485 false,
0486 0);
0487
0488 logicBeamLineCover -> SetVisAttributes(blue);
0489
0490 }
0491
0492
0493 void BESTPassiveProtonBeamLine::BESTBeamScatteringFoils()
0494 {
0495
0496
0497
0498
0499
0500
0501 G4Box* BESTvacuumZone = new G4Box("VacuumZone", BESTvacuumZoneXSize, BESTvacuumZoneYSize, BESTvacuumZoneZSize);
0502 G4LogicalVolume* logicBESTVacuumZone = new G4LogicalVolume(BESTvacuumZone, vacuumZoneMaterial, "VacuumZone");
0503 G4VPhysicalVolume* physiBESTVacuumZone = new G4PVPlacement(0, G4ThreeVector(BESTvacuumZoneXPosition, 0., 0.),
0504 "VacuumZone",logicBESTVacuumZone, physicalTreatmentRoom, false, 0);
0505
0506
0507
0508
0509
0510 BESTfirstScatteringFoil = new G4Box("FirstScatteringFoil",
0511 BESTfirstScatteringFoilXSize,
0512 BESTfirstScatteringFoilYSize,
0513 BESTfirstScatteringFoilZSize);
0514
0515 G4LogicalVolume* logicBESTFirstScatteringFoil = new G4LogicalVolume(BESTfirstScatteringFoil,
0516 firstScatteringFoilMaterial,
0517 "FirstScatteringFoil");
0518
0519 physiBESTFirstScatteringFoil = new G4PVPlacement(0, G4ThreeVector(BESTfirstScatteringFoilXPosition, 0.,0.),
0520 "FirstScatteringFoil", logicBESTFirstScatteringFoil, physiBESTVacuumZone,
0521 false, 0);
0522
0523 logicBESTFirstScatteringFoil -> SetVisAttributes(skyBlue);
0524
0525
0526
0527
0528
0529 G4Box* solidBESTKaptonWindow = new G4Box("BESTKaptonWindow",
0530 BESTkaptonWindowXSize,
0531 BESTkaptonWindowYSize,
0532 BESTkaptonWindowZSize);
0533
0534 G4LogicalVolume* logicBESTKaptonWindow = new G4LogicalVolume(solidBESTKaptonWindow,
0535 kaptonWindowMaterial,
0536 "BESTKaptonWindow");
0537
0538 physiBESTKaptonWindow = new G4PVPlacement(0, G4ThreeVector(BESTkaptonWindowXPosition, 0., 0.),
0539 "BESTKaptonWindow", logicBESTKaptonWindow,
0540 physiBESTVacuumZone, false, 0);
0541
0542 logicBESTKaptonWindow -> SetVisAttributes(darkOrange3);
0543
0544
0545
0546
0547
0548
0549
0550 G4double phi = 90. *deg;
0551
0552 G4RotationMatrix rm;
0553 rm.rotateY(phi);
0554
0555 solidBESTStopper = new G4Tubs("Stopper",
0556 BESTinnerRadiusStopper,
0557 BESTouterRadiusStopper,
0558 BESTheightStopper,
0559 BESTstartAngleStopper,
0560 BESTspanningAngleStopper);
0561
0562 logicBESTStopper = new G4LogicalVolume(solidBESTStopper,
0563 stopperMaterial,
0564 "Stopper",
0565 0, 0, 0);
0566
0567 physiBESTStopper = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector(BESTstopperXPosition,
0568 BESTstopperYPosition,
0569 BESTstopperZPosition)),
0570 "BESTStopper",
0571 logicBESTStopper,
0572 physicalTreatmentRoom,
0573 false,
0574 0);
0575
0576 logicBESTStopper -> SetVisAttributes(red);
0577
0578
0579
0580
0581
0582
0583
0584
0585 BESTsecondScatteringFoil = new G4Box("SecondScatteringFoil",
0586 BESTsecondScatteringFoilXSize,
0587 BESTsecondScatteringFoilYSize,
0588 BESTsecondScatteringFoilZSize);
0589
0590 G4LogicalVolume* logicBESTSecondScatteringFoil = new G4LogicalVolume(BESTsecondScatteringFoil,
0591 secondScatteringFoilMaterial,
0592 "SecondScatteringFoil");
0593
0594 physiBESTSecondScatteringFoil = new G4PVPlacement(0, G4ThreeVector(BESTsecondScatteringFoilXPosition,
0595 BESTsecondScatteringFoilYPosition,
0596 BESTsecondScatteringFoilZPosition),
0597 "SeconScatteringFoil",
0598 logicBESTSecondScatteringFoil,
0599 physicalTreatmentRoom,
0600 false,
0601 0);
0602
0603 logicBESTSecondScatteringFoil -> SetVisAttributes(skyBlue);
0604
0605
0606 }
0607
0608 void BESTPassiveProtonBeamLine::BESTRangeShifter()
0609 {
0610
0611
0612
0613
0614
0615
0616
0617 solidBESTRangeShifterBox = new G4Box("RangeShifterBox",
0618 BESTrangeShifterXSize,
0619 BESTrangeShifterYSize,
0620 BESTrangeShifterZSize);
0621
0622 logicBESTRangeShifterBox = new G4LogicalVolume(solidBESTRangeShifterBox,
0623 rangeShifterMaterial,
0624 "RangeShifterBox");
0625 physiBESTRangeShifterBox = new G4PVPlacement(0,
0626 G4ThreeVector(BESTrangeShifterXPosition, 0., 0.),
0627 "RangeShifterBox",
0628 logicBESTRangeShifterBox,
0629 physicalTreatmentRoom,
0630 false,
0631 0);
0632
0633
0634 logicBESTRangeShifterBox -> SetVisAttributes(yellow);
0635
0636
0637 }
0638
0639 void BESTPassiveProtonBeamLine::BESTBeamCollimators()
0640 {
0641
0642
0643
0644
0645
0646
0647 const G4double firstCollimatorXSize = 20.*mm;
0648 const G4double firstCollimatorYSize = 100.*mm;
0649 const G4double firstCollimatorZSize = 100.*mm;
0650
0651 const G4double firstCollimatorXPosition = -2673.00*mm;
0652 const G4double firstCollimatorYPosition = 0.*mm;
0653 const G4double firstCollimatorZPosition = 0.*mm;
0654
0655
0656 G4Box* solidBESTFirstCollimator = new G4Box("FirstCollimator",
0657 firstCollimatorXSize,
0658 firstCollimatorYSize,
0659 firstCollimatorZSize);
0660
0661 G4LogicalVolume* logicBESTFirstCollimator = new G4LogicalVolume(solidBESTFirstCollimator,
0662 firstCollimatorMaterial,
0663 "FirstCollimator");
0664
0665 physiBESTFirstCollimator = new G4PVPlacement(0, G4ThreeVector(firstCollimatorXPosition,
0666 firstCollimatorYPosition,
0667 firstCollimatorZPosition),
0668 "FirstCollimator",
0669 logicBESTFirstCollimator,
0670 physicalTreatmentRoom,
0671 false,
0672 0);
0673
0674
0675
0676 G4double innerRadiusHoleFirstCollimator = 0.*mm;
0677 G4double outerRadiusHoleFirstCollimator = 15.*mm;
0678 G4double hightHoleFirstCollimator = 20.*mm;
0679 G4double startAngleHoleFirstCollimator = 0.*deg;
0680 G4double spanningAngleHoleFirstCollimator = 360.*deg;
0681
0682 G4Tubs* solidBESTHoleFirstCollimator = new G4Tubs("HoleFirstCollimator",
0683 innerRadiusHoleFirstCollimator,
0684 outerRadiusHoleFirstCollimator,
0685 hightHoleFirstCollimator,
0686 startAngleHoleFirstCollimator,
0687 spanningAngleHoleFirstCollimator);
0688
0689 G4LogicalVolume* logicBESTHoleFirstCollimator = new G4LogicalVolume(solidBESTHoleFirstCollimator,
0690 holeFirstCollimatorMaterial,
0691 "HoleFirstCollimator",
0692 0, 0, 0);
0693 G4double phi = 90. *deg;
0694
0695 G4RotationMatrix rm;
0696 rm.rotateY(phi);
0697
0698 physiBESTHoleFirstCollimator = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector()),
0699 "HoleFirstCollimator",
0700 logicBESTHoleFirstCollimator,
0701 physiBESTFirstCollimator,
0702 false,
0703 0);
0704
0705
0706
0707
0708 const G4double secondCollimatorXPosition = -1900.00*mm;
0709 const G4double secondCollimatorYPosition = 0*mm;
0710 const G4double secondCollimatorZPosition = 0*mm;
0711
0712 physiBESTSecondCollimator = new G4PVPlacement(0, G4ThreeVector(secondCollimatorXPosition,
0713 secondCollimatorYPosition,
0714 secondCollimatorZPosition),
0715 "SecondCollimator",
0716 logicBESTFirstCollimator,
0717 physicalTreatmentRoom,
0718 false,
0719 0);
0720
0721
0722
0723
0724 physiBESTHoleSecondCollimator = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector()),
0725 "HoleSecondCollimator",
0726 logicBESTHoleFirstCollimator,
0727 physiBESTSecondCollimator,
0728 false,
0729 0);
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740 const G4double firstCollimatorModulatorXSize = 10.*mm;
0741 const G4double firstCollimatorModulatorYSize = 200.*mm;
0742 const G4double firstCollimatorModulatorZSize = 200.*mm;
0743
0744 const G4double firstCollimatorModulatorXPosition = -2523.00*mm;
0745 const G4double firstCollimatorModulatorYPosition = 0.*mm;
0746 const G4double firstCollimatorModulatorZPosition = 0.*mm;
0747
0748 G4Box* solidBESTFirstCollimatorModulatorBox = new G4Box("FirstCollimatorModulatorBox",
0749 firstCollimatorModulatorXSize,
0750 firstCollimatorModulatorYSize,
0751 firstCollimatorModulatorZSize);
0752
0753 G4LogicalVolume* logicBESTFirstCollimatorModulatorBox = new G4LogicalVolume(solidBESTFirstCollimatorModulatorBox,
0754 modulatorBoxMaterial,
0755 "FirstCollimatorModulatorBox");
0756
0757 physiBESTFirstCollimatorModulatorBox = new G4PVPlacement(0, G4ThreeVector(firstCollimatorModulatorXPosition,
0758 firstCollimatorModulatorYPosition,
0759 firstCollimatorModulatorZPosition),
0760 "FirstCollimatorModulatorBox",
0761 logicBESTFirstCollimatorModulatorBox,
0762 physicalTreatmentRoom, false, 0);
0763
0764
0765
0766
0767 const G4double innerRadiusHoleFirstCollimatorModulatorBox = 0.*mm;
0768 const G4double outerRadiusHoleFirstCollimatorModulatorBox = 31.*mm;
0769 const G4double hightHoleFirstCollimatorModulatorBox = 10.*mm;
0770 const G4double startAngleHoleFirstCollimatorModulatorBox = 0.*deg;
0771 const G4double spanningAngleHoleFirstCollimatorModulatorBox = 360.*deg;
0772
0773 G4Tubs* solidBESTHoleFirstCollimatorModulatorBox = new G4Tubs("HoleFirstCollimatorModulatorBox",
0774 innerRadiusHoleFirstCollimatorModulatorBox,
0775 outerRadiusHoleFirstCollimatorModulatorBox,
0776 hightHoleFirstCollimatorModulatorBox ,
0777 startAngleHoleFirstCollimatorModulatorBox,
0778 spanningAngleHoleFirstCollimatorModulatorBox);
0779
0780 G4LogicalVolume* logicBESTHoleFirstCollimatorModulatorBox = new G4LogicalVolume(solidBESTHoleFirstCollimatorModulatorBox,
0781 holeModulatorBoxMaterial,
0782 "HoleFirstCollimatorModulatorBox",
0783 0, 0, 0);
0784
0785 physiBESTHoleFirstCollimatorModulatorBox = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector()),
0786 "HoleFirstCollimatorModulatorBox",
0787 logicBESTHoleFirstCollimatorModulatorBox,
0788 physiBESTFirstCollimatorModulatorBox, false, 0);
0789
0790
0791
0792
0793 const G4double secondCollimatorModulatorXSize = 10.*mm;
0794 const G4double secondCollimatorModulatorYSize = 200.*mm;
0795 const G4double secondCollimatorModulatorZSize = 200.*mm;
0796
0797 const G4double secondCollimatorModulatorXPosition = -1953.00 *mm;
0798
0799 const G4double secondCollimatorModulatorYPosition = 0.*mm;
0800 const G4double secondCollimatorModulatorZPosition = 0.*mm;
0801
0802 G4Box* solidBESTSecondCollimatorModulatorBox = new G4Box("SecondCollimatorModulatorBox",
0803 secondCollimatorModulatorXSize,
0804 secondCollimatorModulatorYSize,
0805 secondCollimatorModulatorZSize);
0806
0807 G4LogicalVolume* logicBESTSecondCollimatorModulatorBox = new G4LogicalVolume(solidBESTSecondCollimatorModulatorBox,
0808 modulatorBoxMaterial,
0809 "SecondCollimatorModulatorBox");
0810
0811 physiBESTSecondCollimatorModulatorBox = new G4PVPlacement(0, G4ThreeVector(secondCollimatorModulatorXPosition,
0812 secondCollimatorModulatorYPosition,
0813 secondCollimatorModulatorZPosition),
0814 "SecondCollimatorModulatorBox",
0815 logicBESTSecondCollimatorModulatorBox,
0816 physicalTreatmentRoom, false, 0);
0817
0818
0819
0820
0821 const G4double innerRadiusHoleSecondCollimatorModulatorBox = 0.*mm;
0822 const G4double outerRadiusHoleSecondCollimatorModulatorBox = 31.*mm;
0823 const G4double hightHoleSecondCollimatorModulatorBox = 10.*mm;
0824 const G4double startAngleHoleSecondCollimatorModulatorBox = 0.*deg;
0825 const G4double spanningAngleHoleSecondCollimatorModulatorBox = 360.*deg;
0826
0827 G4Tubs* solidBESTHoleSecondCollimatorModulatorBox = new G4Tubs("HoleSecondCollimatorModulatorBox",
0828 innerRadiusHoleSecondCollimatorModulatorBox,
0829 outerRadiusHoleSecondCollimatorModulatorBox,
0830 hightHoleSecondCollimatorModulatorBox ,
0831 startAngleHoleSecondCollimatorModulatorBox,
0832 spanningAngleHoleSecondCollimatorModulatorBox);
0833
0834 G4LogicalVolume* logicHBESToleSecondCollimatorModulatorBox = new G4LogicalVolume(solidBESTHoleSecondCollimatorModulatorBox,
0835 holeModulatorBoxMaterial,
0836 "HoleSecondCollimatorModulatorBox",
0837 0, 0, 0);
0838
0839 physiBESTHoleSecondCollimatorModulatorBox = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector()),
0840 "HoleSecondCollimatorModulatorBox",
0841 logicHBESToleSecondCollimatorModulatorBox,
0842 physiBESTSecondCollimatorModulatorBox, false, 0);
0843
0844 logicBESTFirstCollimator -> SetVisAttributes(yellow);
0845 logicBESTFirstCollimatorModulatorBox -> SetVisAttributes(blue);
0846 logicBESTSecondCollimatorModulatorBox -> SetVisAttributes(blue);
0847
0848
0849
0850 }
0851
0852
0853 void BESTPassiveProtonBeamLine::BESTBeamMonitoring()
0854 {
0855
0856
0857
0858 G4double fBoxOuterThickness { 100 * mm };
0859 G4double fBoxOuterHeight { 42 * cm };
0860 G4double fBoxOuterWidth { 42 * cm };
0861 G4double fEnterWindowThickness { 25 * um };
0862 G4double fCentralWindowThickness { 20 * um };
0863 G4double fExitWindowThickness { 25 * um };
0864 G4double fBoxInnerThickness { fBoxOuterThickness - fEnterWindowThickness - fExitWindowThickness };
0865 G4double fBoxInnerHeight { 41.95 * cm };
0866 G4double fBoxInnerWidth { 41.95 * cm };
0867 G4double fInnerHeight { 16 * cm };
0868 G4double fInnerWidth { 16 * cm };
0869 G4double fCentralElectrodeThickness { 2 * um };
0870 G4double fCopperLayerThickness { 5 * um };
0871 G4double fKaptonLayerThickness { 25 * um };
0872 G4double fNickelLayerThickness { 2 * um };
0873 G4double fFirstCavityThickness { 5 * mm };
0874 G4double fSecondCavityThickness { 10 * mm };
0875
0876 G4double monitor1XPosition = -1059.0 *mm;
0877 G4String name;
0878
0879 G4double phi = 90. *deg;
0880
0881 G4RotationMatrix rm;
0882 rm.rotateY(phi);
0883
0884
0885 name = "monitorChamber-externalBox";
0886 G4Box* chamberSolid = new G4Box(name, fBoxOuterWidth / 2, fBoxOuterHeight / 2, fBoxOuterThickness / 2);
0887 G4LogicalVolume* chamberLog = new G4LogicalVolume(chamberSolid, wallMaterial, name);
0888 chamberPhys=new G4PVPlacement(G4Transform3D(rm, G4ThreeVector(monitor1XPosition-10*cm,0.*cm,0.*cm)),name,chamberLog,physicalTreatmentRoom,
0889 false,
0890 0);
0891
0892
0893 name = "monitorChamber-innerBox";
0894
0895 G4Box* innerchamberSolid = new G4Box(name, fBoxInnerWidth / 2, fBoxInnerHeight / 2, fBoxInnerThickness / 2);
0896 G4LogicalVolume* innerchamberLog = new G4LogicalVolume(innerchamberSolid, CavityMaterial, name);
0897 innerchamberPhys=new G4PVPlacement(0, G4ThreeVector(0,0,0), name,innerchamberLog, chamberPhys, false, 0);
0898
0899
0900 name = "monitorChamber-enterWindow";
0901
0902
0903 G4Box* enterWindowSolid = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fEnterWindowThickness / 2);
0904 G4LogicalVolume* enterWindowLog = new G4LogicalVolume(enterWindowSolid, WindowMaterial, name);
0905 enterWindowPhys= new G4PVPlacement(0, G4ThreeVector((-fBoxOuterThickness + fEnterWindowThickness) / 2,0, 0), name,enterWindowLog, chamberPhys, false, 0);
0906 enterWindowLog->SetVisAttributes(green);
0907
0908 name = "monitorChamber-enterElectrode";
0909 G4double enterElectrodeThickness = fCopperLayerThickness + fKaptonLayerThickness + fNickelLayerThickness;
0910 G4double exitElectrodeThickness = enterElectrodeThickness;
0911
0912 G4Box* enterElectrodeSolid = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, enterElectrodeThickness / 2);
0913 G4LogicalVolume* enterElectrodeLog = new G4LogicalVolume(enterElectrodeSolid, CavityMaterial, name);
0914
0915 enterElectrodePhys=new G4PVPlacement(0, G4ThreeVector(-(fCentralWindowThickness + enterElectrodeThickness) / 2 - (fCentralElectrodeThickness + fFirstCavityThickness),0,0), name,enterElectrodeLog, innerchamberPhys, false, 0);
0916 enterElectrodeLog->SetVisAttributes(green);
0917
0918 name = "monitorChamber-kaptonLayer1";
0919 G4double position_kaptonLayer1 =-enterElectrodeThickness+fKaptonLayerThickness / 2;
0920 G4Box* kaptonLayerSolid1 = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fKaptonLayerThickness / 2);
0921 G4LogicalVolume* kaptonLayerLog1 = new G4LogicalVolume(kaptonLayerSolid1, KaptonLayerMaterial, name);
0922 kaptonLayerPhys1= new G4PVPlacement(0, G4ThreeVector(position_kaptonLayer1,0,0), name,kaptonLayerLog1, enterElectrodePhys, false, 0);
0923 kaptonLayerLog1->SetVisAttributes(green);
0924
0925 name = "monitorChamber-copperLayer1";
0926
0927 G4double position_copperLayer1=position_kaptonLayer1+(fKaptonLayerThickness+fCopperLayerThickness)/2;
0928 G4Box* copperLayerSolid1 = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fCopperLayerThickness / 2);
0929 G4LogicalVolume* copperLayerLog1 = new G4LogicalVolume(copperLayerSolid1, CopperLayerMaterial, name);
0930 copperLayerPhys1=new G4PVPlacement(0, G4ThreeVector(position_copperLayer1,0,0), name,copperLayerLog1, enterElectrodePhys, false, 0);
0931
0932 name = "monitorChamber-nickelLayer1";
0933
0934 G4double position_nichelLayer1=position_copperLayer1+(fCopperLayerThickness + fNickelLayerThickness)/2;
0935
0936 G4Box* nickelLayerSolid = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fNickelLayerThickness / 2);
0937 G4LogicalVolume* nickelLayerLog1 = new G4LogicalVolume(nickelLayerSolid, NichelLayerMaterial, name);
0938 nickelLayerPhys1=new G4PVPlacement(0, G4ThreeVector(position_nichelLayer1,0,0), name,nickelLayerLog1, enterElectrodePhys, false, 0);
0939
0940 name = "monitorChamber-firstCavity";
0941
0942
0943 G4double position_firstCavity=-fCentralWindowThickness/2-fCentralElectrodeThickness-(fFirstCavityThickness) / 2;
0944 G4Box* firstCavitySolid = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fFirstCavityThickness / 2);
0945 G4LogicalVolume*fFirstCavityLog = new G4LogicalVolume(firstCavitySolid, CavityMaterial, name);
0946 fFirstCavityPhys=new G4PVPlacement(0, G4ThreeVector( position_firstCavity,0,0), name, fFirstCavityLog, innerchamberPhys, false, 0);
0947
0948 name = "monitorChamber-centralElectrode1";
0949
0950 G4double position_centralElectrode1=(-fCentralWindowThickness-fCentralElectrodeThickness) / 2;
0951 G4Box* centralElectrode1Solid = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fCentralElectrodeThickness / 2);
0952 G4LogicalVolume* centralElectrode1Log = new G4LogicalVolume(centralElectrode1Solid, ElectrodeMaterial, name);
0953 centralElectrode1Phys=new G4PVPlacement(0, G4ThreeVector(position_centralElectrode1,0,0), name,centralElectrode1Log, innerchamberPhys, false, 0);
0954
0955 name = "monitorChamber-centralWindow";
0956
0957 G4Box* centralWindowSolid = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fCentralWindowThickness / 2);
0958 G4LogicalVolume* centralWindowLog = new G4LogicalVolume(centralWindowSolid, CentralWindowMaterial, name);
0959 centralWindowPhys =new G4PVPlacement(0, G4ThreeVector(0,0,0), name,centralWindowLog, innerchamberPhys, false, 0);
0960 centralWindowLog->SetVisAttributes(green);
0961
0962 name = "monitorChamber-centralElectrode2";
0963
0964 G4double position_centralElectrode2=(fCentralWindowThickness+fCentralElectrodeThickness) / 2;
0965 G4Box* centralElectrode2Solid = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fCentralElectrodeThickness / 2);
0966 G4LogicalVolume* centralElectrode2Log = new G4LogicalVolume(centralElectrode2Solid, ElectrodeMaterial, name);
0967 centralElectrode2Phys= new G4PVPlacement(0, G4ThreeVector(position_centralElectrode2,0,0),name, centralElectrode2Log,innerchamberPhys, false, 0);
0968
0969 name = "monitorChamber-secondCavity";
0970
0971 G4double position_secondCavity=(fCentralWindowThickness)/2+fCentralElectrodeThickness+(fSecondCavityThickness) / 2;
0972 G4Box* secondCavitySolid = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fSecondCavityThickness / 2);
0973 G4LogicalVolume*fSecondCavityLog = new G4LogicalVolume(secondCavitySolid, CavityMaterial, name);
0974 fSecondCavityPhys=new G4PVPlacement(0, G4ThreeVector(position_secondCavity,0,0), name, fSecondCavityLog, innerchamberPhys, false, 0);
0975
0976 name="monitorChamber-exitElectrode";
0977
0978 G4double position_exitElectrode=(fCentralWindowThickness)/2+fCentralElectrodeThickness+fSecondCavityThickness+(exitElectrodeThickness) / 2;
0979 G4Box* exitElectrodeSolid = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, exitElectrodeThickness / 2);
0980 G4LogicalVolume* exitElectrodeLog = new G4LogicalVolume(exitElectrodeSolid, ElectrodeMaterial, name);
0981 exitElectrodePhys=new G4PVPlacement(0, G4ThreeVector(position_exitElectrode,0,0), name,exitElectrodeLog,innerchamberPhys, false, 0);
0982 exitElectrodeLog->SetVisAttributes(green);
0983
0984 name = "monitorChamber-kaptonLayer2";
0985
0986 G4double position_kaptonLayer2=(exitElectrodeThickness-fKaptonLayerThickness) / 2;
0987 G4Box* kaptonLayerSolid2 = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fKaptonLayerThickness / 2);
0988 G4LogicalVolume* kaptonLayerLog2 = new G4LogicalVolume(kaptonLayerSolid2, KaptonLayerMaterial, name);
0989 kaptonLayerPhys2=new G4PVPlacement(0, G4ThreeVector(position_kaptonLayer2,0,0), name,kaptonLayerLog2, exitElectrodePhys, false, 0);
0990
0991 name = "monitorChamber-copperLayer2";
0992
0993 G4double position_copperLayer2=(exitElectrodeThickness)/2-fKaptonLayerThickness-(fCopperLayerThickness)/2;
0994 G4Box* copperLayerSolid2 = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fCopperLayerThickness / 2);
0995 G4LogicalVolume* copperLayerLog2 = new G4LogicalVolume(copperLayerSolid2, CopperLayerMaterial, name);
0996 copperLayerPhys2=new G4PVPlacement(0, G4ThreeVector(position_copperLayer2,0,0), name, copperLayerLog2, exitElectrodePhys, false, 0);
0997
0998 name = "monitorChamber-nickelLayer2";
0999
1000 G4double position_nichelLayer2=(exitElectrodeThickness)/2-fKaptonLayerThickness-fCopperLayerThickness-fNickelLayerThickness/2;
1001
1002 G4Box* nickelLayerSolid2 = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fNickelLayerThickness / 2);
1003 G4LogicalVolume* nickelLayerLog2 = new G4LogicalVolume(nickelLayerSolid2, NichelLayerMaterial, name);
1004 nickelLayerPhys2=new G4PVPlacement(0, G4ThreeVector(position_nichelLayer2,0,0), name,nickelLayerLog2, exitElectrodePhys, false, 0);
1005
1006 name = "monitorChamber-exitWindow";
1007
1008 G4double position_exitWindow=(fBoxOuterThickness - fEnterWindowThickness) / 2;
1009 G4Box* exitWindowSolid = new G4Box(name, fInnerWidth / 2, fInnerHeight / 2, fExitWindowThickness / 2);
1010 G4LogicalVolume* exitWindowLog = new G4LogicalVolume(exitWindowSolid, WindowMaterial, name);
1011 exitWindowPhys= new G4PVPlacement(0, G4ThreeVector(position_exitWindow,0,0), name,exitWindowLog, chamberPhys, false, 0);
1012 exitWindowLog->SetVisAttributes(green);
1013
1014
1015 }
1016
1017 void BESTPassiveProtonBeamLine::BESTBeamNozzle()
1018 {
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030 const G4double nozzleSupportXSize = 29.5 *mm;
1031 const G4double nozzleSupportYSize = 180. *mm;
1032 const G4double nozzleSupportZSize = 180. *mm;
1033
1034 const G4double nozzleSupportXPosition = -397.50 *mm;
1035
1036 G4double phi = 90. *deg;
1037
1038 G4RotationMatrix rm;
1039 rm.rotateY(phi);
1040
1041 G4Box* solidNozzleSupport = new G4Box("NozzleSupport",
1042 nozzleSupportXSize,
1043 nozzleSupportYSize,
1044 nozzleSupportZSize);
1045
1046 G4LogicalVolume* logicNozzleSupport = new G4LogicalVolume(solidNozzleSupport,
1047 nozzleSupportMaterial,
1048 "NozzleSupport");
1049
1050 physiNozzleSupport = new G4PVPlacement(0, G4ThreeVector(nozzleSupportXPosition,0., 0.),
1051 "NozzleSupport",
1052 logicNozzleSupport,
1053 physicalTreatmentRoom,
1054 false,
1055 0);
1056
1057 logicNozzleSupport -> SetVisAttributes(yellow);
1058
1059
1060
1061
1062
1063
1064 const G4double innerRadiusHoleNozzleSupport = 0.*mm;
1065 const G4double outerRadiusHoleNozzleSupport = 21.5*mm;
1066 const G4double hightHoleNozzleSupport = 29.5 *mm;
1067 const G4double startAngleHoleNozzleSupport = 0.*deg;
1068 const G4double spanningAngleHoleNozzleSupport = 360.*deg;
1069
1070 G4Tubs* solidHoleNozzleSupport = new G4Tubs("HoleNozzleSupport",
1071 innerRadiusHoleNozzleSupport,
1072 outerRadiusHoleNozzleSupport,
1073 hightHoleNozzleSupport,
1074 startAngleHoleNozzleSupport,
1075 spanningAngleHoleNozzleSupport);
1076
1077 G4LogicalVolume* logicHoleNozzleSupport = new G4LogicalVolume(solidHoleNozzleSupport,
1078 holeNozzleSupportMaterial,
1079 "HoleNozzleSupport",
1080 0,
1081 0,
1082 0);
1083
1084
1085 physiHoleNozzleSupport = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector()),
1086 "HoleNozzleSupport",
1087 logicHoleNozzleSupport,
1088 physiNozzleSupport,
1089 false, 0);
1090
1091 logicHoleNozzleSupport -> SetVisAttributes(darkOrange3);
1092
1093
1094
1095
1096 const G4double innerRadiusBrassTube= 18.*mm;
1097 const G4double outerRadiusBrassTube = 21.5 *mm;
1098 const G4double hightBrassTube = 140.5*mm;
1099 const G4double startAngleBrassTube = 0.*deg;
1100 const G4double spanningAngleBrassTube = 360.*deg;
1101
1102 const G4double brassTubeXPosition = -227.5 *mm;
1103
1104 G4Tubs* solidBrassTube = new G4Tubs("BrassTube",
1105 innerRadiusBrassTube,
1106 outerRadiusBrassTube,
1107 hightBrassTube,
1108 startAngleBrassTube,
1109 spanningAngleBrassTube);
1110
1111 G4LogicalVolume* logicBrassTube = new G4LogicalVolume(solidBrassTube,
1112 brassTubeMaterial,
1113 "BrassTube",
1114 0, 0, 0);
1115
1116 physiBrassTube = new G4PVPlacement(G4Transform3D(rm,
1117 G4ThreeVector(brassTubeXPosition,
1118 0.,
1119 0.)),
1120 "BrassTube",
1121 logicBrassTube,
1122 physicalTreatmentRoom,
1123 false,
1124 0);
1125
1126 logicBrassTube -> SetVisAttributes(darkOrange3);
1127
1128
1129
1130
1131 const G4double innerRadiusBrassTube2= 18.*mm;
1132 const G4double outerRadiusBrassTube2 = 21.5 *mm;
1133 const G4double hightBrassTube2 = 29.5*mm;
1134 const G4double startAngleBrassTube2 = 0.*deg;
1135 const G4double spanningAngleBrassTube2 = 360.*deg;
1136
1137
1138 G4Tubs* solidBrassTube2 = new G4Tubs("BrassTube2",
1139 innerRadiusBrassTube2,
1140 outerRadiusBrassTube2,
1141 hightBrassTube2,
1142 startAngleBrassTube2,
1143 spanningAngleBrassTube2);
1144
1145 G4LogicalVolume* logicBrassTube2 = new G4LogicalVolume(solidBrassTube2,
1146 brassTube2Material,
1147 "BrassTube2",
1148 0, 0, 0);
1149
1150 physiBrassTube2 = new G4PVPlacement(0,
1151 G4ThreeVector(0,0.,0.),
1152 logicBrassTube2,
1153 "BrassTube2",
1154 logicHoleNozzleSupport,
1155 false,
1156 0);
1157
1158 logicBrassTube2 -> SetVisAttributes(darkOrange3);
1159
1160
1161
1162
1163
1164 const G4double innerRadiusBrassTube3= 18.*mm;
1165 const G4double outerRadiusBrassTube3 = 21.5 *mm;
1166 const G4double hightBrassTube3 = 10.0 *mm;
1167 const G4double startAngleBrassTube3 = 0.*deg;
1168 const G4double spanningAngleBrassTube3 = 360.*deg;
1169
1170 const G4double brassTube3XPosition = -437 *mm;
1171
1172 G4Tubs* solidBrassTube3 = new G4Tubs("BrassTube3",
1173 innerRadiusBrassTube3,
1174 outerRadiusBrassTube3,
1175 hightBrassTube3,
1176 startAngleBrassTube3,
1177 spanningAngleBrassTube3);
1178
1179 G4LogicalVolume* logicBrassTube3 = new G4LogicalVolume(solidBrassTube3,
1180 brassTube3Material,
1181 "BrassTube3",
1182 0, 0, 0);
1183
1184 physiBrassTube3 = new G4PVPlacement(G4Transform3D(rm,
1185 G4ThreeVector(brassTube3XPosition,
1186 0.,
1187 0.)),
1188 "BrassTube3",
1189 logicBrassTube3,
1190 physicalTreatmentRoom,
1191 false,
1192 0);
1193
1194 logicBrassTube3 -> SetVisAttributes(darkOrange3);
1195 }
1196
1197
1198 void BESTPassiveProtonBeamLine::BESTBeamFinalCollimator()
1199 {
1200
1201
1202
1203 const G4double outerRadiusFinalCollimator = 21.5*mm;
1204 const G4double hightFinalCollimator = 4.5*mm;
1205 const G4double startAngleFinalCollimator = 0.*deg;
1206 const G4double spanningAngleFinalCollimator = 360.*deg;
1207 const G4double finalCollimatorXPosition = -82.5 *mm;
1208
1209 G4double phi = 90. *deg;
1210
1211
1212 G4RotationMatrix rm;
1213 rm.rotateY(phi);
1214
1215 solidFinalCollimator = new G4Tubs("FinalCollimator",
1216 BESTinnerRadiusFinalCollimator,
1217 outerRadiusFinalCollimator,
1218 hightFinalCollimator,
1219 startAngleFinalCollimator,
1220 spanningAngleFinalCollimator);
1221
1222 G4LogicalVolume* logicFinalCollimator = new G4LogicalVolume(solidFinalCollimator,
1223 finalCollimatorMaterial,
1224 "FinalCollimator",
1225 0,
1226 0,
1227 0);
1228
1229 physiFinalCollimator = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector(finalCollimatorXPosition,0.,0.)),
1230 "FinalCollimator", logicFinalCollimator, physicalTreatmentRoom, false, 0);
1231
1232 logicFinalCollimator -> SetVisAttributes(yellow);
1233 }
1234
1235
1236
1237
1238
1239 void BESTPassiveProtonBeamLine::SetRangeShifterXSize(G4double value)
1240 {
1241 solidBESTRangeShifterBox -> SetXHalfLength(value) ;
1242 G4cout << "RangeShifter size X (mm): "<< ((solidBESTRangeShifterBox -> GetXHalfLength())*2.)/mm
1243 << G4endl;
1244 G4RunManager::GetRunManager() -> GeometryHasBeenModified();
1245 }
1246
1247
1248 void BESTPassiveProtonBeamLine::SetFirstScatteringFoilXSize(G4double value)
1249 {
1250 BESTfirstScatteringFoil -> SetXHalfLength(value);
1251 G4RunManager::GetRunManager() -> GeometryHasBeenModified();
1252 G4cout <<"The X size of the first scattering foil is (mm):"<<
1253 ((BESTfirstScatteringFoil -> GetXHalfLength())*2.)/mm
1254 << G4endl;
1255 }
1256
1257
1258 void BESTPassiveProtonBeamLine::SetSecondScatteringFoilXSize(G4double value)
1259 {
1260 BESTsecondScatteringFoil -> SetXHalfLength(value);
1261 G4RunManager::GetRunManager() -> GeometryHasBeenModified();
1262 G4cout <<"The X size of the second scattering foil is (mm):"<<
1263 ((BESTsecondScatteringFoil -> GetXHalfLength())*2.)/mm
1264 << G4endl;
1265 }
1266
1267
1268 void BESTPassiveProtonBeamLine::SetOuterRadiusStopper(G4double value)
1269 {
1270 solidBESTStopper -> SetOuterRadius(value);
1271 G4RunManager::GetRunManager() -> GeometryHasBeenModified();
1272 G4cout << "OuterRadius od the Stopper is (mm):"
1273 << solidBESTStopper -> GetOuterRadius()/mm
1274 << G4endl;
1275 }
1276
1277
1278 void BESTPassiveProtonBeamLine::SetInnerRadiusFinalCollimator(G4double value)
1279 {
1280 solidFinalCollimator -> SetInnerRadius(value);
1281 G4RunManager::GetRunManager() -> GeometryHasBeenModified();
1282 G4cout<<"Inner Radius of the final collimator is (mm):"
1283 << solidFinalCollimator -> GetInnerRadius()/mm
1284 << G4endl;
1285 }
1286
1287
1288 void BESTPassiveProtonBeamLine::SetRSMaterial(G4String materialChoice)
1289 {
1290 if (G4Material* pttoMaterial = G4NistManager::Instance()->FindOrBuildMaterial(materialChoice, false) )
1291 {
1292 if (pttoMaterial)
1293 {
1294 rangeShifterMaterial = pttoMaterial;
1295 logicBESTRangeShifterBox -> SetMaterial(pttoMaterial);
1296 G4cout << "The material of the Range Shifter has been changed to " << materialChoice << G4endl;
1297 }
1298 }
1299 else
1300 {
1301 G4cout << "WARNING: material \"" << materialChoice << "\" doesn't exist in NIST elements/materials"
1302 " table [located in $G4INSTALL/source/materials/src/G4NistMaterialBuilder.cc]" << G4endl;
1303 G4cout << "Use command \"/parameter/nist\" to see full materials list!" << G4endl;
1304 }
1305 }
1306
1307
1308 void BESTPassiveProtonBeamLine::SetModulatorAngle(G4double value)
1309 {
1310 modulator -> SetModulatorAngle(value);
1311
1312 }
1313