2168 lines
105 KiB
C++
2168 lines
105 KiB
C++
//
|
|
// ********************************************************************
|
|
// * License and Disclaimer *
|
|
// * *
|
|
// * The Geant4 software is copyright of the Copyright Holders of *
|
|
// * the Geant4 Collaboration. It is provided under the terms and *
|
|
// * conditions of the Geant4 Software License, included in the file *
|
|
// * LICENSE and available at http://cern.ch/geant4/license . These *
|
|
// * include a list of copyright holders. *
|
|
// * *
|
|
// * Neither the authors of this software system, nor their employing *
|
|
// * institutes,nor the agencies providing financial support for this *
|
|
// * work make any representation or warranty, express or implied, *
|
|
// * regarding this software system or assume any liability for its *
|
|
// * use. Please see the license in the file LICENSE and URL above *
|
|
// * for the full disclaimer and the limitation of liability. *
|
|
// * *
|
|
// * This code implementation is the result of the scientific and *
|
|
// * technical work of the GEANT4 collaboration. *
|
|
// * By using, copying, modifying or distributing the software (or *
|
|
// * any work based on the software) you agree to acknowledge its *
|
|
// * use in resulting scientific publications, and indicate your *
|
|
// * acceptance of all terms of the Geant4 Software license. *
|
|
// ********************************************************************
|
|
//
|
|
// Hadrontherapy advanced example for Geant4
|
|
// See more at: https://twiki.cern.ch/twiki/bin/view/Geant4/AdvancedExamplesHadrontherapy
|
|
|
|
#include "globals.hh"
|
|
#include "G4SystemOfUnits.hh"
|
|
#include "G4Box.hh"
|
|
#include "G4Tubs.hh"
|
|
#include "G4Sphere.hh"
|
|
#include "G4NistManager.hh"
|
|
#include "G4NistElementBuilder.hh"
|
|
#include "G4VisAttributes.hh"
|
|
#include "G4Colour.hh"
|
|
#include "G4RunManager.hh"
|
|
#include "G4LogicalVolume.hh"
|
|
#include "G4PVPlacement.hh"
|
|
#include "G4RotationMatrix.hh"
|
|
#include "HadrontherapyDetectorConstruction.hh"
|
|
#include "LaserDrivenBeamLine.hh"
|
|
#include "LaserDrivenBeamLineMessenger.hh"
|
|
//
|
|
#include "G4PhysicalConstants.hh"
|
|
#include "G4ThreeVector.hh"
|
|
#include "G4Material.hh"
|
|
//
|
|
#include "G4FieldManager.hh"
|
|
#include "G4MagIntegratorStepper.hh"
|
|
#include "G4Mag_UsualEqRhs.hh"
|
|
#include "G4ExplicitEuler.hh"
|
|
#include "G4ChordFinder.hh"
|
|
//#include "G4TransportationManager.hh"
|
|
#include "G4EqMagElectricField.hh"
|
|
#include "G4UniformMagField.hh"
|
|
#include "G4PropagatorInField.hh"
|
|
#include "G4VisCommandsViewer.hh"
|
|
#include "G4UImanager.hh"
|
|
#include "G4ExplicitEuler.hh"
|
|
#include "G4ImplicitEuler.hh"
|
|
#include "G4SimpleRunge.hh"
|
|
#include "G4SimpleHeum.hh"
|
|
#include "G4ClassicalRK4.hh"
|
|
#include "G4HelixExplicitEuler.hh"
|
|
#include "G4HelixImplicitEuler.hh"
|
|
#include "G4HelixSimpleRunge.hh"
|
|
#include "G4CashKarpRKF45.hh"
|
|
#include "G4RKG3_Stepper.hh"
|
|
#include "G4SubtractionSolid.hh"
|
|
|
|
//
|
|
#include "G4UniformElectricField.hh"
|
|
#include "G4ElectricField.hh"
|
|
#include "HadrontherapyElectricTabulatedField3D.hh"
|
|
|
|
#include "HadrontherapyMagneticField3D.hh"
|
|
//
|
|
//G4bool LaserDrivenBeamLine::doCalculation = false;
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
LaserDrivenBeamLine::LaserDrivenBeamLine():
|
|
hadrontherapydetectorconstruction(0), physicTreatmentRoom(0),
|
|
PFirstTriplet(0),PSecondTriplet(0),PThirdTriplet(0),PFourthTriplet(0), physicFirstQuad(0),physicSecondQuad(0),physicThirdQuad(0),physicFourthQuad(0),
|
|
solidExternalChamber(0),logicExternalChamber(0),physicExternalChamber(0),
|
|
solidInternalChamber(0),logicInternalChamber(0),physicInternalChamber(0),
|
|
solidCollimator(0),logicCollimator(0),physicCollimator(0),
|
|
solidCollimatorHole(0),logicCollimatorHole(0),physicCollimatorHole(0),
|
|
solidFinalCollimator(0), logicFinalCollimator(0),physicFinalCollimator(0),
|
|
solidFinalCollimatorHole(0),logicFinalCollimatorHole(0),physicFinalCollimatorHole(0),
|
|
solidExternalMagnet_1(0),logicExternalMagnet_1(0),physicExternalMagnet_1(0), physicExternalMagnet_1Down(0),
|
|
solidMagnet_1(0),logicMagnet_1(0),physicMagnet_1Right(0),physicMagnet_1Left(0), solidExternalMagnet_2(0),logicExternalMagnet_2(0),
|
|
physicExternalMagnet_2(0),physicExternalMagnet_2Down(0),solidMagnet_2(0),logicMagnet_2(0),physicMagnet_2Right(0),physicMagnet_2Left(0), solidExternalMagnet_3(0),logicExternalMagnet_3(0),physicExternalMagnet_3(0),physicExternalMagnet_3Down(0),
|
|
solidMagnet_3(0),logicMagnet_3(0),physicMagnet_3Right(0),physicMagnet_3Left(0),
|
|
solidExternalMagnet_4(0),logicExternalMagnet_4(0),physicExternalMagnet_4(0),physicExternalMagnet_4Down(0),
|
|
solidMagnet_4(0),logicMagnet_4(0),physicMagnet_4Right(0),physicMagnet_4Left(0),
|
|
solidExternalSlit(0), logicExternalSlit(0), physicExternalSlit(0),
|
|
solidInternalSlit(0),logicInternalSlit(0),physicInternalSlit(0),
|
|
physicExitPipe(0),physicExitWindow(0),physicExithole(0),physicEntrancePipe(0),physicEntrancehole(0)
|
|
{
|
|
laserDrivenMessenger = new LaserDrivenBeamLineMessenger(this);
|
|
|
|
//***************************** PW ***************************************
|
|
|
|
static G4String ROGeometryName = "DetectorROGeometry";
|
|
RO = new HadrontherapyDetectorROGeometry(ROGeometryName);
|
|
|
|
G4cout << "Going to register Parallel world...";
|
|
RegisterParallelWorld(RO);
|
|
G4cout << "... done" << G4endl;
|
|
//***************************** PW ***************************************
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
LaserDrivenBeamLine::~LaserDrivenBeamLine()
|
|
{
|
|
//delete laserDrivenMessenger;
|
|
delete hadrontherapydetectorconstruction;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
G4VPhysicalVolume* LaserDrivenBeamLine::Construct()
|
|
{
|
|
// Sets default geometry and materials
|
|
SetDefaultDimensions();
|
|
|
|
// Construct the energyselector (magnetic part and slit) and detector plane
|
|
ConstructLaserDrivenBeamLine();
|
|
|
|
//***************************** PW ***************************************
|
|
if (!hadrontherapydetectorconstruction)
|
|
|
|
//***************************** PW ***************************************
|
|
|
|
// HadrontherapyDetectorConstruction builds ONLY the phantom and the detector with its associated ROGeometry
|
|
hadrontherapydetectorconstruction = new HadrontherapyDetectorConstruction(physicTreatmentRoom);
|
|
G4cout<<"HadrontherapyDetectorConstruction"<<G4endl;
|
|
//***************************** PW ***************************************
|
|
|
|
hadrontherapydetectorconstruction->InitializeDetectorROGeometry(RO,hadrontherapydetectorconstruction->GetDetectorToWorldPosition());
|
|
|
|
//***************************** PW ***************************************
|
|
return physicTreatmentRoom;
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void LaserDrivenBeamLine::SetDefaultDimensions()
|
|
{
|
|
///////////////////////////////////////////////////////////////////////
|
|
// Definition of the colour sets
|
|
white = new G4VisAttributes( G4Colour(1.,1.,1., 0.2));
|
|
white -> SetVisibility(true);
|
|
white -> SetForceSolid(true);
|
|
white -> SetForceWireframe(true);
|
|
|
|
blue = new G4VisAttributes(G4Colour(0. ,0. ,1.));
|
|
blue -> SetVisibility(true);
|
|
//blue -> SetForceSolid(true);
|
|
|
|
gray = new G4VisAttributes( G4Colour(0.5, 0.5, 0.5, 0.5 ));
|
|
gray-> SetVisibility(true);
|
|
gray-> SetForceSolid(true);
|
|
|
|
red = new G4VisAttributes(G4Colour(1. ,0. ,0., 0.2));
|
|
red-> SetVisibility(true);
|
|
red-> SetForceSolid(true);
|
|
//red -> SetForceWireframe(true);
|
|
|
|
yellow = new G4VisAttributes(G4Colour(1., 1., 0., 0.2));
|
|
yellow-> SetVisibility(true);
|
|
yellow-> SetForceSolid(true);
|
|
|
|
green = new G4VisAttributes( G4Colour(25/255. , 255/255. , 25/255., 0.4));
|
|
green -> SetVisibility(true);
|
|
green -> SetForceWireframe(true);
|
|
green -> SetForceSolid(true);
|
|
|
|
black = new G4VisAttributes( G4Colour(255/255. , 255/255., 255/255.));
|
|
black -> SetVisibility(true);
|
|
black -> SetForceSolid(true);
|
|
|
|
darkGreen = new G4VisAttributes( G4Colour(0/255. , 100/255. , 0/255.));
|
|
darkGreen -> SetVisibility(true);
|
|
darkGreen -> SetForceSolid(true);
|
|
|
|
darkOrange3 = new G4VisAttributes( G4Colour(205/255. , 102/255. , 000/255., 0.7));
|
|
darkOrange3 -> SetVisibility(true);
|
|
darkOrange3 -> SetForceSolid(true);
|
|
|
|
skyBlue = new G4VisAttributes( G4Colour(135/255. , 206/255. , 235/255., 0.1));
|
|
skyBlue -> SetVisibility(true);
|
|
skyBlue -> SetForceSolid(true);
|
|
|
|
// DEFAULT DIMENSIONS AND POSITIONS ARE PROVIDED HERE.
|
|
/////////////////////// Exit Window ///////////////////////////////////////////////
|
|
G4double defaultInnerRadiusExitWindow=0. *mm;
|
|
InnerRadiusExitWindow=defaultInnerRadiusExitWindow;
|
|
|
|
G4double defaultExternalRadiusExitWindow=55*mm;
|
|
ExternalRadiusExitWindow=defaultExternalRadiusExitWindow;
|
|
|
|
G4double defaultExitWindowThickness=25 *um;
|
|
ExitWindowThickness=defaultExitWindowThickness;
|
|
|
|
G4double defaultExitWindowXPosition=-ExitWindowThickness/2.;
|
|
ExitWindowXPosition=defaultExitWindowXPosition;
|
|
|
|
G4double defaultExitWindowYPosition=0.;
|
|
ExitWindowYPosition=defaultExitWindowYPosition;
|
|
|
|
G4double defaultExitWindowZPosition=0.0*mm;
|
|
ExitWindowZPosition=defaultExitWindowZPosition;
|
|
|
|
G4double defaultStartAngleExitWindow = 0.0 *deg;
|
|
startAngleExitWindow = defaultStartAngleExitWindow;
|
|
|
|
G4double defaultSpanningAngleExitWindow = 360.*deg;
|
|
spanningAngleExitWindow = defaultSpanningAngleExitWindow;
|
|
////////////////////////////// Exit pipe ////////////////////////////////
|
|
G4double defaultExitPipeheight=105. *mm;
|
|
ExitPipeheight=defaultExitPipeheight;
|
|
|
|
G4double defaultInnerRadiusExitPipe=50. *mm;
|
|
InnerRadiusExitPipe=defaultInnerRadiusExitPipe;
|
|
|
|
G4double defaultExternalRadiusExitPipe=55 *mm;
|
|
ExternalRadiusExitPipe=defaultExternalRadiusExitPipe;
|
|
|
|
G4double defaultExitPipeXPosition=-ExitPipeheight/2-ExitWindowThickness;
|
|
ExitPipeXPosition=defaultExitPipeXPosition;
|
|
|
|
G4double defaultExitPipeYPosition=0;
|
|
ExitPipeYPosition=defaultExitPipeYPosition;
|
|
|
|
G4double defaultExitPipeZPosition=0.0*mm;
|
|
ExitPipeZPosition=defaultExitPipeZPosition;
|
|
|
|
G4double defaultStartAngleExitPipe = 0.0 *deg;
|
|
startAngleExitPipe = defaultStartAngleExitPipe;
|
|
|
|
G4double defaultSpanningAngleExitPipe = 360.*deg;
|
|
spanningAngleExitPipe = defaultSpanningAngleExitPipe;
|
|
//////////////////////////////////////////////// Vacuum chamber //////////////////////////////
|
|
G4double defaultExternalChamberXSize = 79.6*cm;
|
|
externalChamberXSize = defaultExternalChamberXSize;
|
|
|
|
G4double defaultExternalChamberYSize = 50. *cm;
|
|
externalChamberYSize = defaultExternalChamberYSize;
|
|
|
|
G4double defaultExternalChamberZSize = 50. *cm;
|
|
externalChamberZSize = defaultExternalChamberZSize;
|
|
|
|
G4double defaultExternalChamberXPosition = -(externalChamberXSize/2.+ExitPipeheight/2.)+ ExitPipeXPosition;
|
|
externalChamberXPosition = defaultExternalChamberXPosition;
|
|
|
|
G4double defaultExternalChamberYPosition = 0.0 *mm;
|
|
externalChamberYPosition = defaultExternalChamberYPosition;
|
|
|
|
G4double defaultExternalChamberZPosition = 0.0 *mm;
|
|
externalChamberZPosition = defaultExternalChamberZPosition;
|
|
|
|
// Defaults of the internal chamber dimensions
|
|
// The position of its center is in the center
|
|
// of the internal chamber while the dimension are
|
|
// authomatically calculated respect to the external chamber ones
|
|
G4double defaultVaccumChamberWallThickness=5 *mm;
|
|
VaccumChamberWallThickness=defaultVaccumChamberWallThickness;
|
|
|
|
G4double defaultInternalChamberXSize =externalChamberXSize - 2*VaccumChamberWallThickness;
|
|
internalChamberXSize = defaultInternalChamberXSize;
|
|
|
|
G4double defaultInternalChamberYSize =externalChamberYSize - 2*VaccumChamberWallThickness;
|
|
internalChamberYSize = defaultInternalChamberYSize;
|
|
|
|
G4double defaultInternalChamberZSize = externalChamberZSize - 2*VaccumChamberWallThickness;
|
|
internalChamberZSize = defaultInternalChamberZSize;
|
|
/////////////////////// Exit hole in vessel ///////////////////////////////////////////////
|
|
G4double defaultInnerRadiusExithole=0.*mm;
|
|
InnerRadiusExithole=defaultInnerRadiusExithole;
|
|
|
|
G4double defaultExternalRadiusExithole=50.*mm;
|
|
ExternalRadiusExithole=defaultExternalRadiusExithole;
|
|
|
|
G4double defaultExitholeThickness=VaccumChamberWallThickness;
|
|
ExitholeThickness=defaultExitholeThickness;
|
|
|
|
G4double defaultExitholeXPosition=(externalChamberXSize/2.-ExitholeThickness/2.);
|
|
ExitholeXPosition=defaultExitholeXPosition;
|
|
|
|
G4double defaultExitholeYPosition=0.;
|
|
ExitholeYPosition=defaultExitholeYPosition;
|
|
|
|
G4double defaultExitholeZPosition=0.*mm;
|
|
ExitholeZPosition=defaultExitholeZPosition;
|
|
|
|
G4double defaultStartAngleExithole = 0.0 *deg;
|
|
startAngleExithole= defaultStartAngleExithole;
|
|
|
|
G4double defaultSpanningAngleExithole = 360.*deg;
|
|
spanningAngleExithole = defaultSpanningAngleExithole;
|
|
/////////////////////////////////Final collimator //////////////////////////////
|
|
// The Final Collimator is located after the 4th magnet
|
|
G4double defaultExitholeToFinalCollimator=70 *mm;
|
|
ExitholeToFinalCollimator=defaultExitholeToFinalCollimator;
|
|
|
|
defaultInnerRadiusFinalCollimator = 0.0 *mm;
|
|
innerRadiusFinalCollimator = defaultInnerRadiusFinalCollimator;
|
|
|
|
defaultOuterRadiusFinalCollimator = 2.50 *mm;
|
|
outerRadiusFinalCollimator = defaultOuterRadiusFinalCollimator;
|
|
|
|
defaultFinalCollimatorThickness = 3.0 *mm;
|
|
FinalCollimatorThickness = defaultFinalCollimatorThickness;
|
|
|
|
defaultStartAngleFinalCollimator = 0.0 *deg;
|
|
startAngleFinalCollimator = defaultStartAngleFinalCollimator;
|
|
|
|
defaultSpanningAngleFinalCollimator = 360.*deg;
|
|
spanningAngleFinalCollimator = defaultSpanningAngleFinalCollimator;
|
|
|
|
defaultFinalCollimatorXPosition = internalChamberXSize/2.-ExitholeToFinalCollimator-FinalCollimatorThickness/2.;
|
|
collimatorFinalBox_XPosition=defaultFinalCollimatorXPosition;
|
|
FinalcollimatorXPosition = 0.0*mm; //HOLE IN THE FINAL COLLIMATOR
|
|
|
|
defaultFinalCollimatorYPosition = 0.0*mm;
|
|
collimatorFinalBox_YPosition=defaultFinalCollimatorYPosition;
|
|
FinalcollimatorYPosition = defaultFinalCollimatorYPosition;
|
|
|
|
defaultFinalCollimatorZPosition = 0.0*mm;
|
|
collimatorFinalBox_ZPosition=0.0*mm;
|
|
FinalcollimatorZPosition =defaultFinalCollimatorZPosition;
|
|
|
|
defaultThicknessCollimator =3.0 *mm;
|
|
collimatorFinalBoxXSize=defaultFinalCollimatorThickness;
|
|
collimatorFinalBoxYSize=82.0*mm;
|
|
collimatorFinalBoxZSize=210.0*mm;
|
|
//////////////////ooooooooooOOOOOOOO000000000000OOOOOOOOOOOOooooooooooo/////////////////
|
|
|
|
//Magnet characteristics
|
|
G4double defaultExternalMagnet_XSize = 88.0*mm;
|
|
G4double defaultExternalMagnet_YSizeTotal=87.*mm;
|
|
G4double defaultInternalMagnet_YSize = 10. *mm;
|
|
G4double defaultExternalMagnet_YSize =(defaultExternalMagnet_YSizeTotal-defaultInternalMagnet_YSize)/2.;
|
|
G4double defaultExternalMagnet_ZSize = 104 *mm;
|
|
|
|
G4double defaultExternalMagnet_YPosition =defaultInternalMagnet_YSize/2.+defaultExternalMagnet_YSize/2.;
|
|
G4double defaultExternalMagnet_ZPosition = 0.0 *mm;
|
|
|
|
G4double defaultMagnet_XSize=defaultExternalMagnet_XSize;
|
|
G4double defaultMagnet_YSize=defaultExternalMagnet_YSizeTotal;
|
|
G4double defaultMagnet_ZSize=19*mm;
|
|
|
|
// Defaults of the external part of the magnet 4:
|
|
G4double defaultFinalCollimatorToMagnet4=25.*mm;
|
|
FinalCollimatorToMagnet4=defaultFinalCollimatorToMagnet4;
|
|
|
|
externalMagnet_4XSize = defaultExternalMagnet_XSize;
|
|
externalMagnet_4YSize = defaultExternalMagnet_YSize;
|
|
externalMagnet_4ZSize = defaultExternalMagnet_ZSize;
|
|
|
|
Magnet_4XSize=defaultMagnet_XSize;
|
|
Magnet_4YSize=defaultMagnet_YSize;
|
|
Magnet_4ZSize=defaultMagnet_ZSize;
|
|
|
|
G4double defaultExternalMagnet_4XPosition = -(FinalCollimatorThickness/2.+FinalCollimatorToMagnet4+defaultExternalMagnet_XSize/2.)+ collimatorFinalBox_XPosition;
|
|
externalMagnet_4XPosition = defaultExternalMagnet_4XPosition;
|
|
|
|
externalMagnet_4YPosition = defaultExternalMagnet_YPosition;
|
|
externalMagnet_4ZPosition = defaultExternalMagnet_ZPosition;
|
|
|
|
Magnet_4XPosition=externalMagnet_4XPosition;
|
|
Magnet_4YPosition=0.0*mm;
|
|
Magnet_4ZPosition=(defaultExternalMagnet_ZSize+defaultMagnet_ZSize)/2.;
|
|
//////////////////ooooooooooOOOOOOOO000000000000OOOOOOOOOOOOooooooooooo/////////////////
|
|
// Defaults of the external part of the magnet 3:
|
|
externalMagnet_3XSize = defaultExternalMagnet_XSize;
|
|
externalMagnet_3YSize = defaultExternalMagnet_YSize;
|
|
externalMagnet_3ZSize = defaultExternalMagnet_ZSize;
|
|
|
|
Magnet_3XSize=defaultMagnet_XSize;
|
|
Magnet_3YSize=defaultMagnet_YSize;
|
|
Magnet_3ZSize=defaultMagnet_ZSize;
|
|
|
|
G4double defaultMagnet4ToMagnet3=65.*mm; //85.*mm ANTONELLA
|
|
Magnet4ToMagnet3=defaultMagnet4ToMagnet3;
|
|
|
|
G4double defaultExternalMagnet_3XPosition =-(Magnet4ToMagnet3+defaultExternalMagnet_XSize/2.+defaultExternalMagnet_XSize/2.)+externalMagnet_4XPosition;
|
|
externalMagnet_3XPosition = defaultExternalMagnet_3XPosition;
|
|
|
|
externalMagnet_3YPosition =defaultExternalMagnet_YPosition;
|
|
externalMagnet_3ZPosition = defaultExternalMagnet_ZPosition;
|
|
|
|
|
|
Magnet_3XPosition=externalMagnet_3XPosition;
|
|
Magnet_3YPosition=0.0*mm;
|
|
Magnet_3ZPosition=(defaultExternalMagnet_ZSize+defaultMagnet_ZSize)/2.;
|
|
//////////////////ooooooooooOOOOOOOO000000000000OOOOOOOOOOOOooooooooooo/////////////////
|
|
// Defaults of the external part of the magnet 2:
|
|
externalMagnet_2XSize = defaultExternalMagnet_XSize;
|
|
externalMagnet_2YSize = defaultExternalMagnet_YSize;
|
|
externalMagnet_2ZSize = defaultExternalMagnet_ZSize;
|
|
|
|
Magnet_2XSize=defaultMagnet_XSize;
|
|
Magnet_2YSize=defaultMagnet_YSize;
|
|
Magnet_2ZSize=defaultMagnet_ZSize;
|
|
|
|
G4double defaultMagnet3ToMagnet2=10 *mm;
|
|
Magnet3ToMagnet2=defaultMagnet3ToMagnet2;
|
|
|
|
G4double defaultExternalMagnet_2XPosition =-(Magnet3ToMagnet2+defaultExternalMagnet_XSize/2.+defaultExternalMagnet_XSize/2.)+externalMagnet_3XPosition;
|
|
externalMagnet_2XPosition = defaultExternalMagnet_2XPosition;
|
|
|
|
externalMagnet_2YPosition = defaultExternalMagnet_YPosition;
|
|
externalMagnet_2ZPosition = defaultExternalMagnet_ZPosition;
|
|
|
|
Magnet_2XPosition=externalMagnet_2XPosition;
|
|
Magnet_2YPosition=0.0*mm;
|
|
Magnet_2ZPosition=(defaultExternalMagnet_ZSize+defaultMagnet_ZSize)/2.;
|
|
//////////////////ooooooooooOOOOOOOO000000000000OOOOOOOOOOOOooooooooooo/////////////////
|
|
// Defaults of the external part of the magnet 1:
|
|
externalMagnet_1XSize=defaultExternalMagnet_XSize;
|
|
externalMagnet_1YSize = defaultExternalMagnet_YSize;
|
|
externalMagnet_1ZSize = defaultExternalMagnet_ZSize;
|
|
|
|
Magnet_1XSize=defaultMagnet_XSize;
|
|
Magnet_1YSize=defaultMagnet_YSize;
|
|
Magnet_1ZSize=defaultMagnet_ZSize;
|
|
|
|
G4double defaultMagnet2ToMagnet1=85 *mm;
|
|
Magnet2ToMagnet1=defaultMagnet2ToMagnet1;
|
|
|
|
G4double defaultExternalMagnet_1XPosition = -(Magnet2ToMagnet1+defaultExternalMagnet_XSize/2.+defaultExternalMagnet_XSize/2.)+externalMagnet_2XPosition;
|
|
externalMagnet_1XPosition = defaultExternalMagnet_1XPosition;
|
|
|
|
externalMagnet_1YPosition = defaultExternalMagnet_YPosition;
|
|
externalMagnet_1ZPosition = defaultExternalMagnet_ZPosition;
|
|
|
|
Magnet_1XPosition=defaultExternalMagnet_1XPosition;
|
|
Magnet_1YPosition=0.0*mm;
|
|
Magnet_1ZPosition=(defaultExternalMagnet_ZSize+defaultMagnet_ZSize)/2.;
|
|
|
|
// Defaults of the external part of the Slit
|
|
G4double defaultExternalSlitXSize = 8.0 *mm;
|
|
externalSlitXSize = defaultExternalSlitXSize;
|
|
|
|
G4double defaultExternalSlitYSize = 82. *mm;
|
|
externalSlitYSize = defaultExternalSlitYSize;
|
|
|
|
G4double defaultExternalSlitZSize = 210. *mm;
|
|
externalSlitZSize = defaultExternalSlitZSize;
|
|
|
|
G4double defaultExternalSlitXPosition = -(Magnet3ToMagnet2/2.+defaultExternalMagnet_XSize/2.)+externalMagnet_3XPosition;
|
|
externalSlitXPosition = defaultExternalSlitXPosition;
|
|
|
|
G4double defaultExternalSlitYPosition = 0.0 *mm;
|
|
externalSlitYPosition = defaultExternalSlitYPosition;
|
|
|
|
G4double defaultExternalSlitZPosition = 0.0 *mm;
|
|
externalSlitZPosition = defaultExternalSlitZPosition;
|
|
|
|
// Defaults of the internal part of the Slit:
|
|
internalSlitXSize = defaultExternalSlitXSize;
|
|
|
|
G4double defaultInternalSlitYSize = 3 *mm;
|
|
internalSlitYSize = defaultInternalSlitYSize;
|
|
|
|
G4double defaultInternalSlitZSize = 3 *mm;
|
|
internalSlitZSize = defaultInternalSlitZSize;
|
|
|
|
G4double defaultInternalSlitXPosition = 0.0 *mm;
|
|
internalSlitXPosition = defaultInternalSlitXPosition;
|
|
|
|
G4double defaultInternalSlitYPosition = 0.0 *mm;
|
|
internalSlitYPosition = defaultInternalSlitYPosition;
|
|
|
|
G4double defaultInternalSlitZPosition = 40.0 *mm;
|
|
internalSlitZPosition = defaultInternalSlitZPosition;
|
|
|
|
// Defaults of the particle collimator (First collimator).
|
|
// The Collimator should be located before the 1st magnet
|
|
//
|
|
defaultInnerRadiusCollimator = 0.0 *mm;
|
|
innerRadiusCollimator = defaultInnerRadiusCollimator;
|
|
|
|
defaultOuterRadiusCollimator = 2.5 *mm;
|
|
outerRadiusCollimator = defaultOuterRadiusCollimator;
|
|
|
|
thicknessCollimator = defaultThicknessCollimator;
|
|
|
|
defaultStartAngleCollimator = 0.0 *deg;
|
|
startAngleCollimator = defaultStartAngleCollimator;
|
|
|
|
defaultSpanningAngleCollimator = 360.*deg;
|
|
spanningAngleCollimator = defaultSpanningAngleCollimator;
|
|
|
|
G4double defultMagnet1ToFirstCollimator=25.*mm;
|
|
Magnet1ToFirstCollimator=defultMagnet1ToFirstCollimator;
|
|
|
|
defaultCollimatorXPosition = -(thicknessCollimator/2.+Magnet1ToFirstCollimator+defaultExternalMagnet_XSize/2.)+externalMagnet_1XPosition;
|
|
collimatorBox_XPosition=defaultCollimatorXPosition;
|
|
collimatorXPosition = 0.0*mm;
|
|
|
|
defaultCollimatorYPosition = 0.0*mm;
|
|
collimatorBox_YPosition=defaultCollimatorYPosition;
|
|
collimatorYPosition = 0.0*mm;
|
|
|
|
defaultCollimatorZPosition = 0.0*mm;
|
|
collimatorBox_ZPosition=defaultCollimatorZPosition;
|
|
collimatorZPosition = 0.*mm;
|
|
|
|
collimatorBoxYSize=82.0* mm;
|
|
collimatorBoxZSize=210.0* mm;
|
|
|
|
//////////////////// Entrance Hole //////////////////////////////////
|
|
G4double defaultInnerRadiusEntrancehole=0. *mm;
|
|
InnerRadiusEntrancehole=defaultInnerRadiusEntrancehole;
|
|
|
|
G4double defaultExternalRadiusEntrancehole=50.*mm;
|
|
ExternalRadiusEntrancehole=defaultExternalRadiusEntrancehole;
|
|
|
|
G4double defaultEntranceholeThickness=VaccumChamberWallThickness;
|
|
EntranceholeThickness=defaultEntranceholeThickness;
|
|
|
|
G4double defaultEntranceholeXPosition=-(externalChamberXSize/2.-EntranceholeThickness/2.);
|
|
EntranceholeXPosition=defaultEntranceholeXPosition;
|
|
|
|
G4double defaultEntranceholeQuadXPosition=+(externalChamberXSize/2.-EntranceholeThickness/2.);
|
|
EntranceholeQuadXPosition=defaultEntranceholeQuadXPosition;
|
|
|
|
G4double defaultEntranceholeYPosition=0.;
|
|
EntranceholeYPosition=defaultEntranceholeYPosition;
|
|
|
|
G4double defaultEntranceholeZPosition=0.0*mm;
|
|
EntranceholeZPosition=defaultEntranceholeZPosition;
|
|
|
|
G4double defaultStartAngleEntrancehole= 0.0 *deg;
|
|
startAngleEntrancehole= defaultStartAngleEntrancehole;
|
|
|
|
G4double defaultSpanningAngleEntrancehole= 360.*deg;
|
|
spanningAngleEntrancehole=defaultSpanningAngleEntrancehole;
|
|
|
|
///////////////// Entrance Pipe/////////////////////////////////////////////
|
|
|
|
G4double defaultEntrancePipeheight=105. *mm;
|
|
EntrancePipeheight=defaultEntrancePipeheight;
|
|
|
|
G4double defaultInnerRadiusEntrancePipe=50. *mm;
|
|
InnerRadiusEntrancePipe=defaultInnerRadiusEntrancePipe;
|
|
|
|
G4double defaultExternalRadiusEntrancePipe=55 *mm;
|
|
ExternalRadiusEntrancePipe=defaultExternalRadiusEntrancePipe;
|
|
|
|
G4double defaultEntrancePipeXPosition=-EntrancePipeheight/2-externalChamberXSize/2+externalChamberXPosition;
|
|
EntrancePipeXPosition=defaultEntrancePipeXPosition;
|
|
|
|
G4double defaultEntrancePipeYPosition=0;
|
|
EntrancePipeYPosition=defaultEntrancePipeYPosition;
|
|
|
|
G4double defaultEntrancePipeZPosition=0.0*mm;
|
|
EntrancePipeZPosition=defaultEntrancePipeZPosition;
|
|
|
|
G4double defaultStartAngleEntrancePipe= 0.0 *deg;
|
|
startAngleEntrancePipe= defaultStartAngleEntrancePipe;
|
|
|
|
G4double defaultSpanningAngleEntrancePipe= 360.*deg;
|
|
spanningAngleEntrancePipe=defaultSpanningAngleEntrancePipe;
|
|
|
|
/////////////////////////////////////Quadrupole//////////////////////////////////
|
|
G4double defaultQuadChamberWallPosX=-(externalChamberXSize/2.)-EntrancePipeheight/2.+EntrancePipeXPosition;
|
|
QuadChamberWallPosX=defaultQuadChamberWallPosX;
|
|
G4double defaultQuadChamberWallPosY=0.0*cm;
|
|
QuadChamberWallPosY=defaultQuadChamberWallPosY;
|
|
G4double defaultQuadChamberWallPosZ=0.0*cm;
|
|
QuadChamberWallPosZ=defaultQuadChamberWallPosZ;
|
|
|
|
G4double defaultInnerRadiusQuad=10.0*mm;
|
|
InnerRadiusQuad=defaultInnerRadiusQuad;
|
|
|
|
G4double defaultInnerRadiusTriplet=0.0*mm;
|
|
InnerRadiusTriplet=defaultInnerRadiusTriplet;
|
|
|
|
G4double defaultExternalRadiusQuad=30.0*mm;
|
|
ExternalRadiusQuad=defaultExternalRadiusQuad;
|
|
|
|
G4double defaultFirstQuadThickness=80.0*mm;
|
|
FirstQuadThickness=defaultFirstQuadThickness;
|
|
G4double defaultSecondQuadThickness=40.0*mm;
|
|
SecondQuadThickness=defaultSecondQuadThickness;
|
|
G4double defaultThirdQuadThickness=40.0*mm;
|
|
ThirdQuadThickness=defaultThirdQuadThickness;
|
|
G4double defaultFourthQuadThickness=80.0*mm;
|
|
FourthQuadThickness=defaultFourthQuadThickness;
|
|
|
|
G4double defaultStartAngleQuad = 0.0 *deg;
|
|
startAngleQuad = defaultStartAngleQuad;
|
|
|
|
G4double defaultSpanningAngleQuad = 360.*deg;
|
|
spanningAngleQuad = defaultSpanningAngleQuad;
|
|
|
|
G4double distancefromQuadChamber=100.0*mm;
|
|
G4double defaultFourthQuadXPosition= internalChamberXSize/2.-distancefromQuadChamber-FourthQuadThickness/2.;
|
|
FourthQuadXPosition=defaultFourthQuadXPosition;
|
|
FourthQXPosition=0.0*mm;
|
|
|
|
G4double distanceFQuadTQuad=100.0*mm;
|
|
G4double defaultThirdQuadXPosition=-ThirdQuadThickness/2.-distanceFQuadTQuad-FourthQuadThickness/2.+FourthQuadXPosition;
|
|
ThirdQuadXPosition=defaultThirdQuadXPosition;
|
|
ThirdQXPosition=0.0*mm;
|
|
|
|
G4double distanceTQuadSQuad=100.0*mm;
|
|
G4double defaultSecondQuadXPosition=-SecondQuadThickness/2.-distanceTQuadSQuad-ThirdQuadThickness/2.+ThirdQuadXPosition;
|
|
SecondQuadXPosition=defaultSecondQuadXPosition;
|
|
SecondQXPosition=0.0*mm;
|
|
|
|
G4double distanceSQuadFQuad=100.0*mm;
|
|
G4double defaultFirstQuadXPosition=-FirstQuadThickness/2.-distanceSQuadFQuad-SecondQuadThickness/2.+SecondQuadXPosition;
|
|
FirstQuadXPosition=defaultFirstQuadXPosition;
|
|
FirstQXPosition=0.0*mm;
|
|
|
|
G4double defaultQuadYPosition=0.0*mm;
|
|
QuadYPosition=defaultQuadYPosition;
|
|
QYPosition=defaultQuadYPosition;
|
|
|
|
G4double defaultQuadTZPosition= 0.*mm;
|
|
QuadZPosition=defaultQuadTZPosition;
|
|
G4double defaultQuadZPosition=0.0*mm;
|
|
QZPosition=defaultQuadZPosition;
|
|
|
|
// DEFAULT DEFINITION OF THE MATERIALS
|
|
// All elements and compound definition follows the NIST database
|
|
|
|
//ELEMENTS
|
|
G4bool isotopes = false;
|
|
G4Element* zincNist = G4NistManager::Instance()->FindOrBuildElement("Zn");
|
|
G4Element* copperNist = G4NistManager::Instance()->FindOrBuildElement("Cu");
|
|
|
|
//COMPOUNDS
|
|
G4Material* ironNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Fe", isotopes);
|
|
G4Material* aluminiumNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_Al");
|
|
G4Material* kaptonNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_KAPTON", isotopes);
|
|
//G4Material* waterNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_WATER", isotopes);
|
|
G4Material* stainless_steelNist = G4NistManager::Instance()->FindOrBuildMaterial("G4_STAINLESS-STEEL", isotopes);
|
|
|
|
// Elements and compunds not pre-defined in Geant4
|
|
G4double d; // Density
|
|
G4int nComponents;// Number of components
|
|
G4double fractionmass; // Fraction in mass of an element in a material
|
|
d = 8.40*g/cm3;
|
|
nComponents = 2;
|
|
G4Material* brass = new G4Material("Brass", d, nComponents);
|
|
brass -> AddElement(zincNist, fractionmass = 30 *perCent);
|
|
brass -> AddElement(copperNist, fractionmass = 70 *perCent);
|
|
|
|
G4double atomicNumber = 1.;
|
|
G4double massOfMole = 1.008*g/mole;
|
|
d = 1.e-25*g/cm3;
|
|
G4double temperature = 2.73*kelvin;
|
|
G4double pressure = 3.e-18*pascal;
|
|
G4Material* vacuum = new G4Material("interGalactic", atomicNumber,massOfMole, d, kStateGas,temperature, pressure);
|
|
|
|
//***************************** PW ***************************************
|
|
|
|
// DetectorROGeometry Material
|
|
new G4Material("dummyMat", 1., 1.*g/mole, 1.*g/cm3);
|
|
|
|
//***************************** PW ***************************************
|
|
|
|
// MATERIAL ASSIGNMENT
|
|
MotherMaterial=vacuum;
|
|
QuadMaterial=ironNist;
|
|
externalChamberMaterial = stainless_steelNist;
|
|
internalChamberMaterial = vacuum;
|
|
collimatorMaterial = aluminiumNist;
|
|
collimatorHoleMaterial=vacuum;
|
|
FinalcollimatorMaterial=aluminiumNist;
|
|
FinalcollimatorHoleMaterial=vacuum;
|
|
WindowMaterial=kaptonNist;
|
|
PipeMaterial=stainless_steelNist;
|
|
|
|
externalMagnet_1Material = ironNist;
|
|
externalMagnet_2Material = ironNist;
|
|
externalMagnet_3Material = ironNist;
|
|
externalMagnet_4Material = ironNist;
|
|
|
|
externalSlitMaterial = brass;
|
|
internalSlitMaterial =vacuum;
|
|
|
|
//FC Material
|
|
|
|
KaptonEntranceWindowMaterial=kaptonNist;
|
|
GuardRingMaterial=stainless_steelNist;
|
|
FaradayCupBottomMaterial=aluminiumNist;
|
|
CupMaterial=FaradayCupBottomMaterial;
|
|
MassRingMaterial=GuardRingMaterial;
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void LaserDrivenBeamLine::ConstructLaserDrivenBeamLine()
|
|
{
|
|
// -----------------------------
|
|
// Treatment room - World volume
|
|
//------------------------------
|
|
|
|
const G4double worldX = 800.0 *cm;
|
|
const G4double worldY = 400.0 *cm;
|
|
const G4double worldZ = 400.0 *cm;
|
|
|
|
solidTreatmentRoom = new G4Box("TreatmentRoom",
|
|
worldX,
|
|
worldY,
|
|
worldZ);
|
|
|
|
logicTreatmentRoom = new G4LogicalVolume(solidTreatmentRoom,
|
|
MotherMaterial,
|
|
"logicTreatmentRoom",
|
|
0,
|
|
0,
|
|
0);
|
|
|
|
physicTreatmentRoom = new G4PVPlacement(0,
|
|
G4ThreeVector(),
|
|
"physicalTreatmentRoom",
|
|
logicTreatmentRoom,
|
|
0,
|
|
false,
|
|
0);
|
|
|
|
|
|
// The treatment room is invisible in the Visualisation
|
|
logicTreatmentRoom -> SetVisAttributes (G4VisAttributes::Invisible);
|
|
|
|
// The various components of the energyselector are constructed calling
|
|
// the following methods
|
|
|
|
// This method constructs the chamber where the energyselector is located
|
|
EnergySelectorChamber();
|
|
// This method construct the exit window
|
|
ExitWindow();
|
|
// This method construct the exit pipe
|
|
ExitPipe();
|
|
// This method construct the exit hole
|
|
Exithole();
|
|
|
|
// This method constructs a circular collimator of variable thickness and
|
|
// aperture. It is placed befor the magnet to collimate particles caming from the
|
|
// plasma;
|
|
Collimator();
|
|
|
|
// This method constructs the magnet 1 and its associated magnetic field
|
|
Magnet_1();
|
|
|
|
// This method constructs the magnet 2 and its associated magnetic field
|
|
Magnet_2();
|
|
|
|
// This method constructs the magnet 3 and its associated magnetic field
|
|
Magnet_3();
|
|
|
|
// This method constructs the magnet 4 and its associated magnetic field
|
|
Magnet_4();
|
|
|
|
// The selection slit is a square hole moveable inside a metallic plate
|
|
Slit();
|
|
|
|
FinalCollimator();
|
|
|
|
// This method construct the quadrupoles
|
|
Quadrupole();
|
|
// This method construct the entrance hole
|
|
Entrancehole();
|
|
// This method construct the entrance pipe
|
|
EntrancePipe();
|
|
|
|
FaradayCup();
|
|
|
|
}
|
|
|
|
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
|
|
|
void LaserDrivenBeamLine::ConstructSDandField()
|
|
{
|
|
G4double minEps=1.0e-5; // Minimum & value for smallest steps
|
|
G4double maxEps=1.0e-4;
|
|
G4bool allLocal = true;
|
|
// G4int nvar = 8; For pure magnetic field, the number of integration variables is the default!
|
|
|
|
//....oooOO0OOooo..........ENERGY SELECTOR SYSTEM FIELD..........oooOO0OOooo....
|
|
if(logicInternalChamber){G4double xOffset =(internalChamberXSize/2.0)+externalSlitXPosition;
|
|
PurgMagField = new HadrontherapyMagneticField3D("field/ESSMagneticField.TABLE", xOffset);
|
|
pFieldMgr =new G4FieldManager();
|
|
pFieldMgr -> SetDetectorField(PurgMagField);
|
|
G4cout << "DeltaStep "<< pFieldMgr -> GetDeltaOneStep()/mm <<"mm" <<endl;
|
|
pFieldMgr -> CreateChordFinder(PurgMagField);
|
|
fEquation = new G4Mag_UsualEqRhs(PurgMagField);
|
|
fstepper = new G4ClassicalRK4(fEquation);
|
|
//////fstepper = new G4HelixImplicitEuler(fEquation);
|
|
pIntgrDriver = new G4MagInt_Driver(1*mm,fstepper,fstepper-> GetNumberOfVariables());
|
|
//the first parameter is the minimum step
|
|
pChordFinder = new G4ChordFinder(pIntgrDriver);
|
|
pFieldMgr->SetChordFinder(pChordFinder);
|
|
pFieldMgr->SetMinimumEpsilonStep(minEps);
|
|
pFieldMgr->SetMaximumEpsilonStep(maxEps);
|
|
pFieldMgr->SetDeltaOneStep(0.5e-3*mm);//default value of DeltaChord is 0.25 mm
|
|
logicInternalChamber -> SetFieldManager(pFieldMgr, allLocal);}
|
|
//....oooOO0OOooo..........QUADS FIELDS..........oooOO0OOooo....
|
|
//....oooOO0OOooo..........FOURTH QUAD FIELD..........oooOO0OOooo....
|
|
if(LFourthTriplet){G4double xOffsetFQ =-(QuadChamberWallPosX+FourthQuadXPosition);
|
|
PurgMagFieldQuadFourth = new HadrontherapyMagneticField3D("field/Quad80MagneticField.TABLE", xOffsetFQ);
|
|
pFieldMgrQuadFourth = new G4FieldManager();
|
|
pFieldMgrQuadFourth -> SetDetectorField(PurgMagFieldQuadFourth);
|
|
|
|
pFieldMgrQuadFourth -> CreateChordFinder(PurgMagFieldQuadFourth);
|
|
fEquationQuadFourth = new G4Mag_UsualEqRhs(PurgMagFieldQuadFourth);
|
|
fstepperQuadFourth = new G4ClassicalRK4(fEquationQuadFourth);
|
|
pIntgrDriverQuadFourth = new G4MagInt_Driver(1*mm,fstepperQuadFourth,fstepperQuadFourth-> GetNumberOfVariables());
|
|
//the first parameter is the minimum step
|
|
pChordFinderQuadFourth = new G4ChordFinder(pIntgrDriverQuadFourth);
|
|
pFieldMgrQuadFourth->SetChordFinder(pChordFinderQuadFourth);
|
|
pFieldMgrQuadFourth->SetMinimumEpsilonStep(minEps);
|
|
pFieldMgrQuadFourth->SetMaximumEpsilonStep(maxEps);
|
|
pFieldMgrQuadFourth->SetDeltaOneStep(0.5e-3*mm);//default value of DeltaChord is 0.25 mm
|
|
LFourthTriplet -> SetFieldManager(pFieldMgrQuadFourth, allLocal);}
|
|
//....oooOO0OOooo..........THIRD QUAD FIELD..........oooOO0OOooo....
|
|
if(LThirdTriplet){ G4double xOffsetTQ =-(QuadChamberWallPosX+ThirdQuadXPosition);
|
|
PurgMagFieldQuadThird = new HadrontherapyMagneticField3D("field/Quad40MagneticField.TABLE", xOffsetTQ);
|
|
pFieldMgrQuadThird = new G4FieldManager();
|
|
pFieldMgrQuadThird -> SetDetectorField(PurgMagFieldQuadThird);
|
|
pFieldMgrQuadThird -> CreateChordFinder(PurgMagFieldQuadThird);
|
|
fEquationQuadThird = new G4Mag_UsualEqRhs(PurgMagFieldQuadThird);
|
|
fstepperQuadThird = new G4ClassicalRK4(fEquationQuadThird);
|
|
pIntgrDriverQuadThird = new G4MagInt_Driver(1*mm,fstepperQuadThird,fstepperQuadThird-> GetNumberOfVariables());
|
|
//the first parameter is the minimum step
|
|
pChordFinderQuadThird = new G4ChordFinder(pIntgrDriverQuadThird);
|
|
pFieldMgrQuadThird->SetChordFinder(pChordFinderQuadThird);
|
|
pFieldMgrQuadThird->SetMinimumEpsilonStep(minEps);
|
|
pFieldMgrQuadThird->SetMaximumEpsilonStep(maxEps);
|
|
pFieldMgrQuadThird->SetDeltaOneStep(0.5e-3*mm);//default value of DeltaChord is 0.25 mm
|
|
LThirdTriplet -> SetFieldManager(pFieldMgrQuadThird, allLocal);}
|
|
//....oooOO0OOooo..........SECOND QUAD FIELD..........oooOO0OOooo....
|
|
if(LSecondTriplet){G4double xOffsetSQ =-(QuadChamberWallPosX+SecondQuadXPosition);
|
|
PurgMagFieldQuadSecond = new HadrontherapyMagneticField3D("field/Quad40MagneticField.TABLE", xOffsetSQ);
|
|
pFieldMgrQuadSecond = new G4FieldManager();
|
|
pFieldMgrQuadSecond -> SetDetectorField(PurgMagFieldQuadSecond);
|
|
pFieldMgrQuadSecond -> CreateChordFinder(PurgMagFieldQuadSecond);
|
|
fEquationQuadSecond = new G4Mag_UsualEqRhs(PurgMagFieldQuadSecond);
|
|
fstepperQuadSecond = new G4ClassicalRK4(fEquationQuadSecond);
|
|
pIntgrDriverQuadSecond = new G4MagInt_Driver(1*mm,fstepperQuadSecond,fstepperQuadSecond-> GetNumberOfVariables());
|
|
//the first parameter is the minimum step
|
|
pChordFinderQuadSecond = new G4ChordFinder(pIntgrDriverQuadSecond);
|
|
pFieldMgrQuadSecond->SetChordFinder(pChordFinderQuadSecond);
|
|
pFieldMgrQuadSecond->SetMinimumEpsilonStep(minEps);
|
|
pFieldMgrQuadSecond->SetMaximumEpsilonStep(maxEps);
|
|
pFieldMgrQuadSecond->SetDeltaOneStep(0.5e-3*mm);//default value of DeltaChord is 0.25 mm
|
|
LSecondTriplet -> SetFieldManager(pFieldMgrQuadSecond, allLocal);}
|
|
//....oooOO0OOooo..........FIRST QUAD FIELD..........oooOO0OOooo....
|
|
if(LFirstTriplet) {G4double xOffsetFirstQ =-(QuadChamberWallPosX+FirstQuadXPosition);
|
|
PurgMagFieldQuadFirst = new HadrontherapyMagneticField3D("field/Quad80MagneticField.TABLE", xOffsetFirstQ);
|
|
pFieldMgrQuadFirst = new G4FieldManager();
|
|
pFieldMgrQuadFirst -> SetDetectorField(PurgMagFieldQuadFirst);
|
|
pFieldMgrQuadFirst -> CreateChordFinder(PurgMagFieldQuadFirst);
|
|
fEquationQuadFirst = new G4Mag_UsualEqRhs(PurgMagFieldQuadFirst);
|
|
fstepperQuadFirst = new G4ClassicalRK4(fEquationQuadFirst);
|
|
pIntgrDriverQuadFirst = new G4MagInt_Driver(1*mm,fstepperQuadFirst,fstepperQuadFirst-> GetNumberOfVariables());
|
|
//the first parameter is the minimum step
|
|
pChordFinderQuadFirst = new G4ChordFinder(pIntgrDriverQuadFirst);
|
|
pFieldMgrQuadFirst->SetChordFinder(pChordFinderQuadFirst);
|
|
pFieldMgrQuadFirst->SetMinimumEpsilonStep(minEps);
|
|
pFieldMgrQuadFirst->SetMaximumEpsilonStep(maxEps);
|
|
pFieldMgrQuadFirst->SetDeltaOneStep(0.5e-3*mm);//default value of DeltaChord is 0.25 mm
|
|
LFirstTriplet -> SetFieldManager(pFieldMgrQuadFirst, allLocal);}
|
|
//....oooOO0OOooo..........FARADAY CUP FIELD..........oooOO0OOooo....
|
|
if(logicVirtualMag) {G4double exOffset= -20*cm;
|
|
G4double eyOffset= 0*cm;
|
|
G4double ezOffset= 0*cm;
|
|
G4FieldManager *pEFieldmanager = new G4FieldManager();
|
|
G4ElectricField *ElectricField = new HadrontherapyElectricTabulatedField3D("field/ElectricFieldFC-600V.TABLE", exOffset, eyOffset, ezOffset);
|
|
// UNIFORM FIELD
|
|
// G4ElectroMagneticField* ElectricField = new G4UniformElectricField(G4ThreeVector(0.0, 10.0*volt/m, 0.0)); //G4UniformElectricField
|
|
// The following is only for global field in the whole geometry
|
|
//pEFieldmanager = G4TransportationManager::GetTransportationManager() -> GetFieldManager();
|
|
|
|
const G4int nvarElectric=8; // The Equation of motion for Electric (or combined Electric/Magnetic)
|
|
// field requires 8 integration variables
|
|
|
|
G4EqMagElectricField *fLocalEquation = new G4EqMagElectricField(ElectricField);
|
|
G4MagIntegratorStepper* fLocalStepper = new G4ClassicalRK4(fLocalEquation, nvarElectric);
|
|
G4MagInt_Driver *pIntgrDriver_E = new G4MagInt_Driver(0.02*mm, fLocalStepper, fLocalStepper -> GetNumberOfVariables() );
|
|
G4ChordFinder *fLocalChordFinder = new G4ChordFinder(pIntgrDriver_E);
|
|
pEFieldmanager -> SetDetectorField(ElectricField);
|
|
pEFieldmanager -> SetChordFinder(fLocalChordFinder);
|
|
//G4double deltainter=0.0001*mm;
|
|
//G4double missdist=0.1*mm;
|
|
//pEFieldmanager->SetDeltaIntersection(deltainter);
|
|
//fLocalChordFinder->SetDeltaChord(missdist);
|
|
pEFieldmanager->SetMinimumEpsilonStep(minEps);
|
|
pEFieldmanager->SetMaximumEpsilonStep(maxEps);
|
|
pEFieldmanager->SetDeltaOneStep( 0.5e-3 * mm );
|
|
//pEFieldmanager -> SetFieldChangesEnergy(true);
|
|
logicVirtualMag -> SetFieldManager(pEFieldmanager, allLocal);}
|
|
//....oooOO0OOooo....................oooOO0OOooo....
|
|
G4cout<<" //....oooOO0OOooo.......... FIELDS HAVE BEEN IMPLEMENTED..........oooOO0OOooo...."<<G4endl;
|
|
return;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void LaserDrivenBeamLine::FaradayCup()
|
|
{
|
|
/// FC sizes ///
|
|
|
|
G4double InnerRadiusFC=25*mm;
|
|
G4double OuterRadiusFC=45*mm;
|
|
G4double MassRingThickness=5*mm;
|
|
G4double GuardRingThickness=180*mm;
|
|
G4double FaradayCupBottomThickness=120*mm;
|
|
G4double CupThickness=10*cm;
|
|
G4double KaptonEntranceWindowThickness=25*um;
|
|
|
|
/// Virtual Volumes ///
|
|
|
|
G4double VirtualWindowThickness=1.*um ;
|
|
G4double VirtualMiddleThickness= 1.*um ;
|
|
G4double VirtualBottomThickness= 1. *um ;
|
|
G4double VirtualOverBottomThickness=1. *um ;
|
|
G4double VirtualLateralLength=FaradayCupBottomThickness+CupThickness+VirtualBottomThickness;
|
|
|
|
|
|
//// Position ////
|
|
|
|
G4double virtualMagPosX=31*cm;
|
|
G4double FC_XOffset=20*cm;
|
|
G4double KaptonEntranceWindowPosX=-virtualMagPosX+KaptonEntranceWindowThickness/2+FC_XOffset;
|
|
G4double MassRingPosX=KaptonEntranceWindowPosX+KaptonEntranceWindowThickness/2+MassRingThickness/2;
|
|
G4double VirtualWindowPosX=MassRingPosX+MassRingThickness/2+VirtualWindowThickness/2;
|
|
G4double GuardRingPosX=MassRingPosX+MassRingThickness/2+GuardRingThickness/2+2*mm;
|
|
G4double VirtualMiddlePosX=GuardRingPosX+GuardRingThickness/2+VirtualMiddleThickness/2;
|
|
G4double FaradayCupBottomPosX=GuardRingPosX+GuardRingThickness/2+FaradayCupBottomThickness/2+1*cm;
|
|
G4double VirtualBottomPosX=FaradayCupBottomPosX+FaradayCupBottomThickness/2+VirtualBottomThickness/2;
|
|
G4double CupPosX=VirtualBottomPosX+VirtualBottomThickness/2+CupThickness/2;
|
|
G4double VirtualOverBottomPosX=CupPosX+CupThickness/2+VirtualOverBottomThickness/2;
|
|
G4double VirtualLateralPosX=GuardRingPosX+GuardRingThickness/2+1*cm+(FaradayCupBottomThickness+CupThickness+VirtualBottomThickness)/2;
|
|
G4double phi = 90. *deg;
|
|
G4RotationMatrix rm;
|
|
rm.rotateY(phi);
|
|
|
|
virtualMag= new G4Box("virtualMag", 31.*cm, 6*cm, 6*cm );
|
|
|
|
logicVirtualMag= new G4LogicalVolume( virtualMag,
|
|
internalChamberMaterial,
|
|
"LVirtualMag",
|
|
0,0,0);
|
|
physicVirtualMag = new G4PVPlacement(0,
|
|
G4ThreeVector(virtualMagPosX, 0.*cm, 0*mm),
|
|
"PVirtualMag",
|
|
logicVirtualMag,
|
|
physicTreatmentRoom,
|
|
true, 0);
|
|
|
|
|
|
logicVirtualMag -> SetVisAttributes(blue);
|
|
|
|
//// BeveledCylinder ////
|
|
|
|
G4RotationMatrix *Rot= new G4RotationMatrix;
|
|
Rot->rotateX(14*deg);
|
|
G4ThreeVector trans(0.,22.5*mm,-15*mm);
|
|
Cylinder= new G4Tubs("cylinder",20*mm,22.5*mm,90*mm,0.,2*pi);
|
|
Box= new G4Box("Box",22.5*mm,22.5*mm,90*mm);
|
|
|
|
G4SubtractionSolid* BeveledCylinder=new G4SubtractionSolid("Cylinder-Box",
|
|
Cylinder,
|
|
Box,
|
|
Rot,
|
|
trans);
|
|
|
|
logicBeveledCylinder= new G4LogicalVolume (BeveledCylinder,
|
|
GuardRingMaterial,
|
|
"LBeveledCylinder",
|
|
0,0,0);
|
|
|
|
physicBeveledCylinder =new G4PVPlacement(G4Transform3D(rm,G4ThreeVector(GuardRingPosX,0,0)),
|
|
"physicBeveledCylinder",
|
|
logicBeveledCylinder,
|
|
physicVirtualMag,
|
|
true,0);
|
|
|
|
logicBeveledCylinder->SetVisAttributes(green);
|
|
|
|
|
|
///// KaptonEntranceWindow /////
|
|
|
|
KaptonEntranceWindow= new G4Tubs("KaptonEntranceWindow",
|
|
0,
|
|
OuterRadiusFC,
|
|
KaptonEntranceWindowThickness/2,
|
|
0*deg,360*deg);
|
|
|
|
logicKaptonEntranceWindow=new G4LogicalVolume( KaptonEntranceWindow,
|
|
// internalChamberMaterial, for track control
|
|
KaptonEntranceWindowMaterial,
|
|
"LKaptonEntranceWindow",
|
|
0,0,0);
|
|
|
|
physicKaptonEntranceWindow=new G4PVPlacement(G4Transform3D(rm,G4ThreeVector(KaptonEntranceWindowPosX,0,0)),
|
|
"PhysicEntranceWindow",
|
|
logicKaptonEntranceWindow,
|
|
physicVirtualMag,true,0);
|
|
logicKaptonEntranceWindow -> SetVisAttributes(gray);
|
|
|
|
////// MassRing /////
|
|
|
|
MassRing=new G4Tubs ("MassRing",
|
|
InnerRadiusFC,
|
|
OuterRadiusFC,
|
|
MassRingThickness/2,
|
|
0*deg,360*deg);
|
|
|
|
logicMassRing=new G4LogicalVolume( MassRing,
|
|
MassRingMaterial,
|
|
"logicMassRing",
|
|
0,0,0);
|
|
|
|
physicMassRing=new G4PVPlacement( G4Transform3D(rm,G4ThreeVector(MassRingPosX,0,0)),
|
|
|
|
"PhysicMassRing",logicMassRing,
|
|
|
|
physicVirtualMag,
|
|
true,0);
|
|
logicMassRing -> SetVisAttributes(green);
|
|
|
|
|
|
|
|
|
|
///// VirtualWindow /////
|
|
|
|
|
|
VirtualWindow=new G4Tubs("VirtualWindow",
|
|
0,
|
|
OuterRadiusFC,
|
|
VirtualWindowThickness/2,
|
|
0*deg,360*deg);
|
|
|
|
logicVirtualWindow=new G4LogicalVolume( VirtualWindow,
|
|
internalChamberMaterial,
|
|
"logicVirtualWindow",
|
|
0,0,0);
|
|
|
|
physicVirtualWindow=new G4PVPlacement( G4Transform3D(rm,G4ThreeVector(VirtualWindowPosX,0,0)),
|
|
|
|
"PhysicVirtualWindow",
|
|
logicVirtualWindow,
|
|
physicVirtualMag,
|
|
true,0);
|
|
logicVirtualWindow->SetVisAttributes (G4VisAttributes::Invisible);
|
|
|
|
///// GuardRing /////
|
|
|
|
GuardRing=new G4Tubs ("GuardRing",
|
|
InnerRadiusFC,
|
|
OuterRadiusFC,
|
|
GuardRingThickness/2,
|
|
0*deg,360*deg);
|
|
|
|
logicGuardRing=new G4LogicalVolume( GuardRing,
|
|
GuardRingMaterial,
|
|
"logicGuardRing",
|
|
0,0,0);
|
|
|
|
physicGuardRing=new G4PVPlacement(G4Transform3D(rm,G4ThreeVector(GuardRingPosX,0,0)),
|
|
|
|
"PhysicGuardRing", logicGuardRing,
|
|
|
|
physicVirtualMag,
|
|
true,0);
|
|
logicGuardRing -> SetVisAttributes(red);
|
|
|
|
|
|
/////VirtualMiddle /////
|
|
|
|
|
|
VirtualMiddle=new G4Tubs ("VirtualMiddle",
|
|
0,
|
|
OuterRadiusFC,
|
|
VirtualMiddleThickness/2,
|
|
0*deg,360*deg);
|
|
|
|
logicVirtualMiddle=new G4LogicalVolume( VirtualMiddle,
|
|
internalChamberMaterial,
|
|
"logicVirtualMiddle",
|
|
0,0,0);
|
|
|
|
physicVirtualMiddle=new G4PVPlacement(G4Transform3D(rm,G4ThreeVector(VirtualMiddlePosX,0,0)),
|
|
|
|
"PhysicVirtualMiddle", logicVirtualMiddle,
|
|
|
|
physicVirtualMag,
|
|
true,0);
|
|
|
|
logicVirtualMiddle->SetVisAttributes (G4VisAttributes::Invisible);
|
|
|
|
///// FaradayCupBottom /////
|
|
|
|
FaradayCupBottom=new G4Tubs ("FaradayCupBottom",
|
|
InnerRadiusFC,
|
|
OuterRadiusFC,
|
|
FaradayCupBottomThickness/2,
|
|
0*deg,360*deg);
|
|
|
|
logicFaradayCupBottom=new G4LogicalVolume( FaradayCupBottom,
|
|
FaradayCupBottomMaterial,
|
|
"logicFaradayCupBottom",
|
|
0,0,0);
|
|
|
|
physicFaradayCupBottom=new G4PVPlacement(G4Transform3D(rm,G4ThreeVector(FaradayCupBottomPosX,0,0)),
|
|
"PhysicFaradayCupBottom",logicFaradayCupBottom,
|
|
physicVirtualMag,
|
|
true,0);
|
|
logicFaradayCupBottom -> SetVisAttributes(yellow);
|
|
|
|
|
|
///// Virtual Bottom //////
|
|
|
|
VirtualBottom=new G4Tubs ("VirtualBottom",
|
|
0,
|
|
OuterRadiusFC,
|
|
VirtualBottomThickness/2,
|
|
0*deg,360*deg);
|
|
|
|
logicVirtualBottom=new G4LogicalVolume( VirtualBottom,
|
|
internalChamberMaterial,
|
|
"logicVirtualBottom",
|
|
0,0,0);
|
|
|
|
physicVirtualBottom=new G4PVPlacement(G4Transform3D(rm,G4ThreeVector(VirtualBottomPosX,0,0)),
|
|
"PhysicVirtualBottom",
|
|
logicVirtualBottom,
|
|
physicVirtualMag,
|
|
true,0);
|
|
|
|
logicVirtualBottom->SetVisAttributes (G4VisAttributes::Invisible);
|
|
|
|
///// Cup /////
|
|
|
|
Cup=new G4Tubs ("Cup",
|
|
0,
|
|
OuterRadiusFC,
|
|
CupThickness/2,
|
|
0*deg,360*deg);
|
|
|
|
logicCup=new G4LogicalVolume( Cup,
|
|
CupMaterial,
|
|
"logicCup",
|
|
0,0,0);
|
|
|
|
physicCup=new G4PVPlacement(G4Transform3D(rm,G4ThreeVector(CupPosX,0,0)),
|
|
"PhysicCup", logicCup,
|
|
|
|
physicVirtualMag,
|
|
true,0);
|
|
|
|
logicCup -> SetVisAttributes(darkGreen);
|
|
|
|
|
|
///// Virtual OverBottom /////
|
|
|
|
VirtualOverBottom=new G4Tubs ("VirtualOverBottom",
|
|
0,
|
|
OuterRadiusFC,
|
|
VirtualOverBottomThickness/2,
|
|
0*deg,360*deg);
|
|
|
|
logicVirtualOverBottom=new G4LogicalVolume( VirtualOverBottom,
|
|
internalChamberMaterial,
|
|
"logicVirtualOverBottom",
|
|
0,0,0);
|
|
|
|
physicVirtualOverBottom=new G4PVPlacement(G4Transform3D(rm,G4ThreeVector(VirtualOverBottomPosX,0,0)),
|
|
"PhysicVirtualOverBottom",logicVirtualOverBottom,
|
|
|
|
physicVirtualMag,
|
|
true,0);
|
|
logicVirtualOverBottom->SetVisAttributes (G4VisAttributes::Invisible);
|
|
|
|
|
|
///// Virtual Lateral /////
|
|
|
|
|
|
VirtualLateral=new G4Tubs ("VirtualLateral",
|
|
OuterRadiusFC,
|
|
OuterRadiusFC+1*um,// the VirtualLateralThickness is 1*um
|
|
VirtualLateralLength/2,
|
|
0*deg,360*deg);
|
|
|
|
logicVirtualLateral=new G4LogicalVolume( VirtualLateral,
|
|
internalChamberMaterial,
|
|
"logicVirtualLateral",
|
|
0,0,0);
|
|
|
|
physicVirtualLateral=new G4PVPlacement(G4Transform3D(rm,G4ThreeVector(VirtualLateralPosX,0,0)),
|
|
"VirtualLateral",logicVirtualLateral,
|
|
|
|
physicVirtualMag,
|
|
true,0);
|
|
|
|
|
|
|
|
logicVirtualLateral->SetVisAttributes (G4VisAttributes::Invisible);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void LaserDrivenBeamLine::Quadrupole()
|
|
{
|
|
// To rotate the quadrupoles putting their axis (along X direction) parallel to the beam axis
|
|
G4double phi = 90. *deg;
|
|
G4RotationMatrix rm;
|
|
rm.rotateY(phi);
|
|
|
|
SQuadChamberWall = new G4Box("solidQuadChamberWall",externalChamberXSize/2., externalChamberYSize/2.,externalChamberZSize/2.);
|
|
|
|
LQuadChamberWall = new G4LogicalVolume(SQuadChamberWall, externalChamberMaterial,"logicQuadChamberWall");
|
|
|
|
PQuadChamberWall = new G4PVPlacement(0, G4ThreeVector(QuadChamberWallPosX, QuadChamberWallPosY, QuadChamberWallPosZ),
|
|
"physQuadChamberWall", LQuadChamberWall,physicTreatmentRoom, false, 0);
|
|
|
|
|
|
SQuadChamber = new G4Box("solidQuadChamber", internalChamberXSize/2., internalChamberYSize/2.,internalChamberZSize/2.);
|
|
|
|
LQuadChamber = new G4LogicalVolume(SQuadChamber, internalChamberMaterial,"logicQuadChamber");
|
|
|
|
PQuadChamber = new G4PVPlacement(0, G4ThreeVector(0.0, 0.0, 0.0),
|
|
"physQuadChamber", LQuadChamber,PQuadChamberWall, false, 0);
|
|
|
|
LQuadChamberWall -> SetVisAttributes(red);
|
|
LQuadChamber -> SetVisAttributes(white);
|
|
///////////----------------------------Fourth Quadrupole----------------------------/////////
|
|
SFourthTriplet = new G4Tubs("SolidTQuad", InnerRadiusTriplet, ExternalRadiusQuad,((FourthQuadThickness/2.)+1*mm),
|
|
startAngleQuad, spanningAngleQuad);
|
|
|
|
LFourthTriplet = new G4LogicalVolume(SFourthTriplet, internalChamberMaterial,"LogicTQuad", 0, 0, 0);
|
|
|
|
PFourthTriplet = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector(FourthQuadXPosition, QuadYPosition, QuadZPosition)),
|
|
"PhysFourthTQuad", LFourthTriplet, PQuadChamber, false, 0);
|
|
|
|
solidFourthQuad = new G4Tubs("SolidQuad", InnerRadiusQuad, ExternalRadiusQuad, FourthQuadThickness/2.,
|
|
startAngleQuad, spanningAngleQuad);
|
|
|
|
logicFourthQuad = new G4LogicalVolume(solidFourthQuad, QuadMaterial, "LogicQuad", 0, 0, 0);
|
|
|
|
physicFourthQuad = new G4PVPlacement(0, G4ThreeVector(FourthQXPosition, QYPosition, QZPosition),
|
|
"PhysFourthQuad",logicFourthQuad, PFourthTriplet, false, 0);
|
|
|
|
LFourthTriplet -> SetVisAttributes(yellow);
|
|
logicFourthQuad -> SetVisAttributes(green);
|
|
///////////----------------------------Third Quadrupole----------------------------/////////
|
|
SThirdTriplet = new G4Tubs("SolidTTQuad", InnerRadiusTriplet, ExternalRadiusQuad, (ThirdQuadThickness/2.)+1*mm,
|
|
startAngleQuad, spanningAngleQuad);
|
|
|
|
LThirdTriplet = new G4LogicalVolume(SThirdTriplet, internalChamberMaterial,"LogicTTQuad", 0, 0, 0);
|
|
|
|
PThirdTriplet = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector(ThirdQuadXPosition, QuadYPosition, QuadZPosition)),
|
|
"PhysThirdTQuad",LThirdTriplet,PQuadChamber, false, 0);
|
|
|
|
solidThirdQuad = new G4Tubs("SolidTQuad", InnerRadiusQuad, ExternalRadiusQuad, ThirdQuadThickness/2.,
|
|
startAngleQuad, spanningAngleQuad);
|
|
|
|
logicThirdQuad = new G4LogicalVolume(solidThirdQuad, QuadMaterial, "LogicTQuad", 0, 0, 0);
|
|
|
|
physicThirdQuad = new G4PVPlacement(0, G4ThreeVector(ThirdQXPosition, QYPosition, QZPosition),
|
|
"PhysThirdQuad",logicThirdQuad, PThirdTriplet, false, 0);
|
|
|
|
LThirdTriplet -> SetVisAttributes(yellow);
|
|
logicThirdQuad -> SetVisAttributes(green);
|
|
///////////----------------------------Second Quadrupole----------------------------/////////
|
|
SSecondTriplet = new G4Tubs("SolidTSQuad", InnerRadiusTriplet, ExternalRadiusQuad, (SecondQuadThickness/2.)+1*mm,
|
|
startAngleQuad, spanningAngleQuad);
|
|
|
|
LSecondTriplet = new G4LogicalVolume(SSecondTriplet, internalChamberMaterial,"LogicTSQuad", 0, 0, 0);
|
|
|
|
PSecondTriplet = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector(SecondQuadXPosition, QuadYPosition, QuadZPosition)),
|
|
"PhysSecondTQuad", LSecondTriplet, PQuadChamber, false, 0);
|
|
|
|
solidSecondQuad = new G4Tubs("SolidSQuad", InnerRadiusQuad, ExternalRadiusQuad, SecondQuadThickness/2.,
|
|
startAngleQuad, spanningAngleQuad);
|
|
|
|
logicSecondQuad = new G4LogicalVolume(solidSecondQuad, QuadMaterial, "LogicSQuad", 0, 0, 0);
|
|
|
|
physicSecondQuad = new G4PVPlacement(0, G4ThreeVector(SecondQXPosition, QYPosition, QZPosition),
|
|
"PhysSecondQuad", logicSecondQuad, PSecondTriplet, false, 0);
|
|
|
|
LSecondTriplet -> SetVisAttributes(yellow);
|
|
logicSecondQuad -> SetVisAttributes(green);
|
|
///////////----------------------------First Quadrupole----------------------------/////////
|
|
SFirstTriplet = new G4Tubs("SolidTQuad", InnerRadiusTriplet, ExternalRadiusQuad, (FirstQuadThickness/2.)+1*mm,
|
|
startAngleQuad, spanningAngleQuad);
|
|
|
|
LFirstTriplet = new G4LogicalVolume(SFirstTriplet, internalChamberMaterial,"LogicTQuad", 0, 0, 0);
|
|
|
|
PFirstTriplet = new G4PVPlacement(G4Transform3D(rm, G4ThreeVector(FirstQuadXPosition, QuadYPosition, QuadZPosition)),
|
|
"PhysFirstTQuad", LFirstTriplet, PQuadChamber, false, 0);
|
|
|
|
solidFirstQuad = new G4Tubs("SolidQuad", InnerRadiusQuad, ExternalRadiusQuad, FirstQuadThickness/2.,
|
|
startAngleQuad, spanningAngleQuad);
|
|
|
|
logicFirstQuad = new G4LogicalVolume(solidFirstQuad, QuadMaterial, "LogicQuad", 0, 0, 0);
|
|
|
|
physicFirstQuad = new G4PVPlacement(0, G4ThreeVector(FirstQXPosition, QYPosition, QZPosition),
|
|
"PhysFirstQuad",logicFirstQuad, PFirstTriplet, false, 0);
|
|
|
|
LFirstTriplet -> SetVisAttributes(yellow);
|
|
logicFirstQuad -> SetVisAttributes(green);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void LaserDrivenBeamLine::EnergySelectorChamber()
|
|
{
|
|
// The whole energyselector is mounted inside a
|
|
// a vacuum chamber (called 'ExternalChamber')
|
|
// inside which a vacuum box is inserted.
|
|
|
|
solidExternalChamber = new G4Box("ExternalChamber",
|
|
externalChamberXSize/2.0,
|
|
externalChamberYSize/2.0,
|
|
externalChamberZSize/2.0);
|
|
|
|
logicExternalChamber = new G4LogicalVolume(solidExternalChamber,
|
|
externalChamberMaterial,
|
|
"ExternalChamber");
|
|
|
|
physicExternalChamber = new G4PVPlacement(0,
|
|
G4ThreeVector(externalChamberXPosition,
|
|
externalChamberYPosition,
|
|
externalChamberZPosition),
|
|
"ExternalChamber",
|
|
logicExternalChamber,
|
|
physicTreatmentRoom,
|
|
false,
|
|
0);
|
|
|
|
// Visualisation of the External part
|
|
logicExternalChamber -> SetVisAttributes(red);
|
|
|
|
// This is a vacuum box inside the steel box
|
|
solidInternalChamber = new G4Box("SInternalChamber",
|
|
internalChamberXSize/2.0,
|
|
internalChamberYSize/2.0,
|
|
internalChamberZSize/2.0);
|
|
|
|
logicInternalChamber = new G4LogicalVolume(solidInternalChamber,
|
|
internalChamberMaterial,
|
|
"LInternalChamber");
|
|
|
|
physicInternalChamber = new G4PVPlacement(0,
|
|
G4ThreeVector(0,0,0),
|
|
"InternalChamber",
|
|
logicInternalChamber,
|
|
physicExternalChamber,
|
|
false,
|
|
0);
|
|
logicInternalChamber -> SetVisAttributes(white);
|
|
}
|
|
|
|
//////////////////////////////////////////////////// Entrance pipe ///////////////////////
|
|
void LaserDrivenBeamLine::EntrancePipe()
|
|
{
|
|
// To rotate the EntrancePipe putting its axis (along X direction) parallel to the beam axis
|
|
G4double phi = 90. *deg;
|
|
G4RotationMatrix rm;
|
|
rm.rotateY(phi);
|
|
|
|
solidEntrancePipe = new G4Tubs("EntrancePipe",
|
|
InnerRadiusEntrancePipe,
|
|
ExternalRadiusEntrancePipe,
|
|
EntrancePipeheight/2.,
|
|
startAngleEntrancePipe,
|
|
spanningAngleEntrancePipe);
|
|
|
|
logicEntrancePipe = new G4LogicalVolume(solidEntrancePipe,
|
|
PipeMaterial,
|
|
"EntrancePipe",
|
|
0,
|
|
0,
|
|
0);
|
|
|
|
physicEntrancePipe = new G4PVPlacement(G4Transform3D(rm,
|
|
G4ThreeVector(EntrancePipeXPosition,
|
|
EntrancePipeYPosition,
|
|
EntrancePipeZPosition)),
|
|
"EntrancePipe",
|
|
logicEntrancePipe,
|
|
physicTreatmentRoom,
|
|
false,
|
|
0);
|
|
|
|
logicEntrancePipe -> SetVisAttributes(red);
|
|
|
|
}
|
|
|
|
//////////////////////////////////////////////////// Entrance hole ///////////////////////
|
|
void LaserDrivenBeamLine::Entrancehole()
|
|
{
|
|
// To rotate the ExitPipe putting its axis (along X direction) parallel to the beam axis
|
|
G4double phi = 90. *deg;
|
|
G4RotationMatrix rm;
|
|
rm.rotateY(phi);
|
|
|
|
solidEntrancehole = new G4Tubs("Entrancehole",
|
|
InnerRadiusEntrancehole,
|
|
ExternalRadiusEntrancehole,
|
|
EntranceholeThickness/2.,
|
|
startAngleEntrancehole,
|
|
spanningAngleEntrancehole);
|
|
|
|
logicEntrancehole = new G4LogicalVolume(solidEntrancehole,
|
|
internalChamberMaterial,
|
|
"Entrancehole",
|
|
0,
|
|
0,
|
|
0);
|
|
//the hole in the energy selector chamber
|
|
physicEntranceholeESSChamber = new G4PVPlacement(G4Transform3D(rm,
|
|
G4ThreeVector(EntranceholeXPosition,
|
|
EntranceholeYPosition,
|
|
EntranceholeZPosition)),
|
|
"Entrancehole",
|
|
logicEntrancehole,
|
|
physicExternalChamber,
|
|
false,
|
|
0);
|
|
//the hole in the quadrupoles chamber
|
|
physicEntrancehole = new G4PVPlacement(G4Transform3D(rm,
|
|
G4ThreeVector(EntranceholeQuadXPosition,
|
|
EntranceholeYPosition,
|
|
EntranceholeZPosition)),
|
|
"EntranceholeQuad",
|
|
logicEntrancehole,
|
|
PQuadChamberWall,
|
|
false,
|
|
0);
|
|
|
|
logicEntrancehole -> SetVisAttributes(skyBlue);
|
|
|
|
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void LaserDrivenBeamLine::Collimator()
|
|
{
|
|
// To rotate the collimator putting its axis (along X direction) parallel to the beam axis
|
|
G4double phi = 90. *deg;
|
|
G4RotationMatrix rm;
|
|
rm.rotateY(phi);
|
|
//8x82x210 mm are the collimator default dimensions
|
|
solidCollimator = new G4Box("collimator",
|
|
thicknessCollimator/2.0,
|
|
collimatorBoxYSize/2.0,
|
|
collimatorBoxZSize/2.0);
|
|
|
|
logicCollimator = new G4LogicalVolume(solidCollimator,
|
|
collimatorMaterial,
|
|
"collimator");
|
|
|
|
physicCollimator = new G4PVPlacement(0,
|
|
G4ThreeVector(collimatorBox_XPosition,
|
|
collimatorBox_YPosition,
|
|
collimatorBox_ZPosition),
|
|
"collimator",
|
|
logicCollimator,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
|
|
logicCollimator -> SetVisAttributes(darkOrange3);
|
|
|
|
solidCollimatorHole = new G4Tubs("CollimatorHole",
|
|
innerRadiusCollimator,
|
|
outerRadiusCollimator,
|
|
thicknessCollimator/2.,
|
|
startAngleCollimator,
|
|
spanningAngleCollimator);
|
|
|
|
logicCollimatorHole = new G4LogicalVolume(solidCollimatorHole,
|
|
collimatorHoleMaterial,
|
|
"CollimatorHole",
|
|
0,
|
|
0,
|
|
0);
|
|
|
|
physicCollimatorHole = new G4PVPlacement(G4Transform3D(rm,
|
|
G4ThreeVector(collimatorXPosition,
|
|
collimatorYPosition,
|
|
collimatorZPosition)),
|
|
"CollimatorHole",
|
|
logicCollimatorHole,
|
|
physicCollimator,
|
|
false,
|
|
0);
|
|
|
|
logicCollimatorHole -> SetVisAttributes(skyBlue);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Magnet number 1
|
|
void LaserDrivenBeamLine::Magnet_1()
|
|
{ // The positions of the external and internal partes are given as respect the external chamber.
|
|
solidExternalMagnet_1 = new G4Box("SolidExternalMagnet_1",
|
|
externalMagnet_1XSize/2.0,
|
|
externalMagnet_1YSize/2.0,
|
|
externalMagnet_1ZSize/2.0);
|
|
|
|
logicExternalMagnet_1 = new G4LogicalVolume(solidExternalMagnet_1,
|
|
externalMagnet_1Material,
|
|
"LogicExternalMagnet_1");
|
|
|
|
physicExternalMagnet_1 = new G4PVPlacement(0,
|
|
G4ThreeVector(externalMagnet_1XPosition,
|
|
externalMagnet_2YPosition,
|
|
externalMagnet_2ZPosition),
|
|
"PhysicExternalMagnet_1",
|
|
logicExternalMagnet_1,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
physicExternalMagnet_1Down = new G4PVPlacement(0,
|
|
G4ThreeVector(externalMagnet_1XPosition,
|
|
-externalMagnet_2YPosition,
|
|
externalMagnet_2ZPosition),
|
|
"PhysicExternalMagnet_1Down",
|
|
logicExternalMagnet_1,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
|
|
|
|
logicExternalMagnet_1 -> SetVisAttributes(gray);
|
|
|
|
// The right and left part of the magnet
|
|
solidMagnet_1 = new G4Box("SolidMagnet_1",
|
|
Magnet_1XSize/2.0,
|
|
Magnet_1YSize/2.0,
|
|
Magnet_1ZSize/2.0);
|
|
|
|
logicMagnet_1 = new G4LogicalVolume(solidMagnet_1,
|
|
externalMagnet_1Material,
|
|
"LogicMagnet_1");
|
|
|
|
physicMagnet_1Right = new G4PVPlacement(0,
|
|
G4ThreeVector(Magnet_1XPosition,Magnet_1YPosition,
|
|
Magnet_1ZPosition),
|
|
"PhysicMagnet_1Right",
|
|
logicMagnet_1,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
physicMagnet_1Left = new G4PVPlacement(0,
|
|
G4ThreeVector(Magnet_1XPosition,Magnet_1YPosition,
|
|
-Magnet_1ZPosition),
|
|
"PhysicMagnet_1Left",
|
|
logicMagnet_1,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
|
|
logicMagnet_1 -> SetVisAttributes(gray);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Magnet number 2
|
|
void LaserDrivenBeamLine::Magnet_2()
|
|
{ // The position of the external part are given as respect the external chamber.
|
|
|
|
solidExternalMagnet_2 = new G4Box("SolidExternalMagnet_2",
|
|
externalMagnet_2XSize/2.0,
|
|
externalMagnet_2YSize/2.0,
|
|
externalMagnet_2ZSize/2.0);
|
|
|
|
logicExternalMagnet_2 = new G4LogicalVolume(solidExternalMagnet_2,
|
|
externalMagnet_2Material,
|
|
"LogicExternalMagnet_2");
|
|
|
|
physicExternalMagnet_2 = new G4PVPlacement(0,
|
|
G4ThreeVector(externalMagnet_2XPosition,
|
|
externalMagnet_2YPosition,
|
|
(externalMagnet_2ZPosition+32*mm)),
|
|
"PhysicExternalMagnet_2",
|
|
logicExternalMagnet_2,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
|
|
physicExternalMagnet_2Down = new G4PVPlacement(0,
|
|
G4ThreeVector(externalMagnet_2XPosition,
|
|
-externalMagnet_2YPosition,
|
|
(externalMagnet_2ZPosition+32*mm)),
|
|
"PhysicExternalMagnet_2Down",
|
|
logicExternalMagnet_2,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
|
|
|
|
logicExternalMagnet_2 -> SetVisAttributes(gray);
|
|
|
|
// The right and left part of the magnet
|
|
solidMagnet_2 = new G4Box("SolidMagnet_2",
|
|
Magnet_2XSize/2.0,
|
|
Magnet_2YSize/2.0,
|
|
Magnet_2ZSize/2.0);
|
|
|
|
logicMagnet_2 = new G4LogicalVolume(solidMagnet_2,
|
|
externalMagnet_2Material,
|
|
"LogicMagnet_2");
|
|
|
|
physicMagnet_2Right = new G4PVPlacement(0,
|
|
G4ThreeVector(Magnet_2XPosition,Magnet_2YPosition,
|
|
(Magnet_2ZPosition)+32*mm),
|
|
"PhysicMagnet_2Right",
|
|
logicMagnet_2,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
physicMagnet_2Left = new G4PVPlacement(0,
|
|
G4ThreeVector(Magnet_2XPosition,Magnet_2YPosition,
|
|
(-(Magnet_2ZPosition)+32*mm)),
|
|
"PhysicMagnet_2Left",
|
|
logicMagnet_2,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
logicMagnet_2 -> SetVisAttributes(gray);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Magnet number 3
|
|
void LaserDrivenBeamLine::Magnet_3()
|
|
{ // The position of the external part are given as respect the external chamber.
|
|
|
|
solidExternalMagnet_3 = new G4Box("SolidExternalMagnet_3",
|
|
externalMagnet_3XSize/2.0,
|
|
externalMagnet_3YSize/2.0,
|
|
externalMagnet_3ZSize/2.0);
|
|
|
|
logicExternalMagnet_3 = new G4LogicalVolume(solidExternalMagnet_3,
|
|
externalMagnet_3Material,
|
|
"LogicExternalMagnet_3");
|
|
|
|
physicExternalMagnet_3 = new G4PVPlacement(0,
|
|
G4ThreeVector((externalMagnet_3XPosition),
|
|
externalMagnet_3YPosition,
|
|
(externalMagnet_3ZPosition+32*mm)),
|
|
"PhysicExternalMagnet_3",
|
|
logicExternalMagnet_3,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
|
|
physicExternalMagnet_3Down = new G4PVPlacement(0,
|
|
G4ThreeVector((externalMagnet_3XPosition),
|
|
-externalMagnet_3YPosition,
|
|
(externalMagnet_3ZPosition+32*mm)),
|
|
"PhysicExternalMagnet_3Down",
|
|
logicExternalMagnet_3,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
|
|
logicExternalMagnet_3 -> SetVisAttributes(gray);
|
|
|
|
// The right and left part of the magnet
|
|
solidMagnet_3 = new G4Box("SolidMagnet_3",
|
|
Magnet_3XSize/2.0,
|
|
Magnet_3YSize/2.0,
|
|
Magnet_3ZSize/2.0);
|
|
|
|
logicMagnet_3 = new G4LogicalVolume(solidMagnet_3,
|
|
externalMagnet_3Material,
|
|
"LogicMagnet_3");
|
|
|
|
physicMagnet_3Right = new G4PVPlacement(0,
|
|
G4ThreeVector(Magnet_3XPosition,Magnet_3YPosition,
|
|
(Magnet_3ZPosition+32*mm)),
|
|
"PhysicMagnet_3Right",
|
|
logicMagnet_3,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
physicMagnet_3Left = new G4PVPlacement(0,
|
|
G4ThreeVector(Magnet_3XPosition,Magnet_3YPosition,
|
|
(-(Magnet_3ZPosition)+32*mm)),
|
|
"PhysicMagnet_3Left",
|
|
logicMagnet_3,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
logicMagnet_3 -> SetVisAttributes(gray);
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Magnet number 4
|
|
void LaserDrivenBeamLine::Magnet_4()
|
|
{ // The position of the external part are given as respect the external chamber.
|
|
|
|
solidExternalMagnet_4 = new G4Box("SolidExternalMagnet_4",
|
|
externalMagnet_4XSize/2.0,
|
|
externalMagnet_4YSize/2.0,
|
|
externalMagnet_4ZSize/2.0);
|
|
|
|
logicExternalMagnet_4 = new G4LogicalVolume(solidExternalMagnet_4,
|
|
externalMagnet_4Material,
|
|
"LogicExternalMagnet_4");
|
|
|
|
physicExternalMagnet_4 = new G4PVPlacement(0,
|
|
G4ThreeVector(externalMagnet_4XPosition,
|
|
externalMagnet_4YPosition,
|
|
externalMagnet_4ZPosition),
|
|
"PhysicExternalMagnet_4",
|
|
logicExternalMagnet_4,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
|
|
physicExternalMagnet_4Down = new G4PVPlacement(0,
|
|
G4ThreeVector(externalMagnet_4XPosition,
|
|
-externalMagnet_4YPosition,
|
|
externalMagnet_4ZPosition),
|
|
"PhysicExternalMagnet_4Down",
|
|
logicExternalMagnet_4,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
|
|
logicExternalMagnet_4 -> SetVisAttributes(gray);
|
|
|
|
// The right and left part of the magnet
|
|
solidMagnet_4 = new G4Box("SolidMagnet_4",
|
|
Magnet_4XSize/2.0,
|
|
Magnet_4YSize/2.0,
|
|
Magnet_4ZSize/2.0);
|
|
|
|
logicMagnet_4 = new G4LogicalVolume(solidMagnet_4,
|
|
externalMagnet_4Material,
|
|
"LogicMagnet_4");
|
|
|
|
physicMagnet_4Right = new G4PVPlacement(0,
|
|
G4ThreeVector(Magnet_4XPosition,Magnet_4YPosition,
|
|
Magnet_4ZPosition),
|
|
"PhysicMagnet_4Right",
|
|
logicMagnet_4,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
physicMagnet_4Left = new G4PVPlacement(0,
|
|
G4ThreeVector(Magnet_4XPosition,Magnet_4YPosition,
|
|
-Magnet_4ZPosition),
|
|
"PhysicMagnet_4Left",
|
|
logicMagnet_4,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
logicMagnet_4 -> SetVisAttributes(gray);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Slit
|
|
void LaserDrivenBeamLine::Slit()
|
|
{
|
|
solidExternalSlit = new G4Box("ExternalSlit",
|
|
externalSlitXSize/2.0,
|
|
externalSlitYSize/2.0,
|
|
externalSlitZSize/2.0);
|
|
|
|
logicExternalSlit = new G4LogicalVolume(solidExternalSlit,
|
|
externalSlitMaterial,
|
|
"ExternalSlit");
|
|
|
|
physicExternalSlit = new G4PVPlacement(0,
|
|
G4ThreeVector(externalSlitXPosition,
|
|
externalSlitYPosition,
|
|
externalSlitZPosition),
|
|
"ExternalSlit",
|
|
logicExternalSlit,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
|
|
logicExternalSlit -> SetVisAttributes(green);
|
|
// The hole
|
|
solidInternalSlit = new G4Box("InternalSlit",
|
|
internalSlitXSize/2.0,
|
|
internalSlitYSize/2.0,
|
|
internalSlitZSize/2.0);
|
|
|
|
logicInternalSlit = new G4LogicalVolume(solidInternalSlit,
|
|
internalSlitMaterial,
|
|
"InternalSlit");
|
|
|
|
physicInternalSlit = new G4PVPlacement(0,
|
|
G4ThreeVector(internalSlitXPosition,
|
|
internalSlitYPosition,
|
|
internalSlitZPosition),
|
|
"InternalSlit",
|
|
logicInternalSlit,
|
|
physicExternalSlit,
|
|
false,
|
|
0);
|
|
|
|
logicInternalSlit -> SetVisAttributes(skyBlue);
|
|
|
|
}
|
|
////////////////////////////////////// Final collimator ////////////////////////////////////////////
|
|
void LaserDrivenBeamLine::FinalCollimator()
|
|
{
|
|
// To rotate the collimator putting its axis (along X direction) parallel to the beam axis
|
|
G4double phi = 90. *deg;
|
|
G4RotationMatrix rm;
|
|
rm.rotateY(phi);
|
|
|
|
solidFinalCollimator = new G4Box("collimatorFinal",
|
|
collimatorFinalBoxXSize/2.0,
|
|
collimatorFinalBoxYSize/2.0,
|
|
collimatorFinalBoxZSize/2.0);
|
|
|
|
logicFinalCollimator = new G4LogicalVolume(solidFinalCollimator,
|
|
FinalcollimatorMaterial,
|
|
"collimatorFinal");
|
|
|
|
physicFinalCollimator = new G4PVPlacement(0,
|
|
G4ThreeVector(collimatorFinalBox_XPosition,
|
|
collimatorFinalBox_YPosition,
|
|
collimatorFinalBox_ZPosition),
|
|
"collimatorFinal",
|
|
logicFinalCollimator,
|
|
physicInternalChamber,
|
|
false,
|
|
0);
|
|
logicFinalCollimator -> SetVisAttributes(darkOrange3);
|
|
|
|
solidFinalCollimatorHole= new G4Tubs("FinalCollimatorHole",
|
|
innerRadiusFinalCollimator,
|
|
outerRadiusFinalCollimator,
|
|
FinalCollimatorThickness/2.,
|
|
startAngleFinalCollimator,
|
|
spanningAngleFinalCollimator);
|
|
|
|
logicFinalCollimatorHole = new G4LogicalVolume(solidFinalCollimatorHole,
|
|
FinalcollimatorHoleMaterial,
|
|
"FinalCollimatorHole",
|
|
0,
|
|
0,
|
|
0);
|
|
|
|
physicFinalCollimatorHole = new G4PVPlacement(G4Transform3D(rm,
|
|
G4ThreeVector(FinalcollimatorXPosition,
|
|
FinalcollimatorYPosition,
|
|
FinalcollimatorZPosition)),
|
|
"FinalCollimatorHole",
|
|
logicFinalCollimatorHole,
|
|
physicFinalCollimator,
|
|
false,
|
|
0);
|
|
logicFinalCollimatorHole -> SetVisAttributes(skyBlue);
|
|
}
|
|
//////////////////////////// Exit Window ////////////////////////////////////////////
|
|
void LaserDrivenBeamLine::ExitWindow()
|
|
{
|
|
// To rotate the ExitWindow putting its axis (along X direction) parallel to the beam axis
|
|
G4double phi = 90. *deg;
|
|
G4RotationMatrix rm;
|
|
rm.rotateY(phi);
|
|
|
|
solidExitWindow = new G4Tubs("ExitWindow",
|
|
InnerRadiusExitWindow,
|
|
ExternalRadiusExitWindow,
|
|
ExitWindowThickness/2.,
|
|
startAngleExitWindow,
|
|
spanningAngleExitWindow);
|
|
|
|
logicExitWindow = new G4LogicalVolume(solidExitWindow,
|
|
WindowMaterial,
|
|
"ExitWindow",
|
|
0,
|
|
0,
|
|
0);
|
|
|
|
physicExitWindow = new G4PVPlacement(G4Transform3D(rm,
|
|
G4ThreeVector(ExitWindowXPosition,
|
|
ExitWindowYPosition,
|
|
ExitWindowZPosition)),
|
|
"ExitWindow",
|
|
logicExitWindow,
|
|
physicTreatmentRoom,
|
|
false,
|
|
0);
|
|
|
|
logicExitWindow -> SetVisAttributes(skyBlue);
|
|
|
|
}
|
|
|
|
//////////////////////////////////////////////////// Exit pipe ///////////////////////
|
|
void LaserDrivenBeamLine::ExitPipe()
|
|
{
|
|
// To rotate the ExitPipe putting its axis (along X direction) parallel to the beam axis
|
|
G4double phi = 90. *deg;
|
|
G4RotationMatrix rm;
|
|
rm.rotateY(phi);
|
|
|
|
solidExitPipe = new G4Tubs("ExitPipe",
|
|
InnerRadiusExitPipe,
|
|
ExternalRadiusExitPipe,
|
|
ExitPipeheight/2.,
|
|
startAngleExitPipe,
|
|
spanningAngleExitPipe);
|
|
|
|
logicExitPipe = new G4LogicalVolume(solidExitPipe,
|
|
PipeMaterial,
|
|
"ExitPipe",
|
|
0,
|
|
0,
|
|
0);
|
|
|
|
physicExitPipe = new G4PVPlacement(G4Transform3D(rm,
|
|
G4ThreeVector(ExitPipeXPosition,
|
|
ExitPipeYPosition,
|
|
ExitPipeZPosition)),
|
|
"ExitPipe",
|
|
logicExitPipe,
|
|
physicTreatmentRoom,
|
|
false,
|
|
0);
|
|
|
|
logicExitPipe -> SetVisAttributes(red);
|
|
|
|
}
|
|
|
|
///////////////////////////////////// Exit hole ///////////////////////
|
|
void LaserDrivenBeamLine::Exithole()
|
|
{
|
|
// To rotate the ExitPipe putting its axis (along X direction) parallel to the beam axis
|
|
G4double phi = 90. *deg;
|
|
G4RotationMatrix rm;
|
|
rm.rotateY(phi);
|
|
|
|
solidExithole = new G4Tubs("Exithole",
|
|
InnerRadiusExithole,
|
|
ExternalRadiusExithole,
|
|
ExitholeThickness/2.,
|
|
startAngleExithole,
|
|
spanningAngleExithole);
|
|
|
|
logicExithole = new G4LogicalVolume(solidExithole,
|
|
internalChamberMaterial,
|
|
"Exithole",
|
|
0,
|
|
0,
|
|
0);
|
|
|
|
physicExithole = new G4PVPlacement(G4Transform3D(rm,
|
|
G4ThreeVector(ExitholeXPosition,
|
|
ExitholeYPosition,
|
|
ExitholeZPosition)),
|
|
"Exithole",
|
|
logicExithole,
|
|
physicExternalChamber,
|
|
false,
|
|
0);
|
|
|
|
logicExithole -> SetVisAttributes(skyBlue);
|
|
|
|
}
|
|
/////////////////////////// MESSENGER ///////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Disable via external macro command the Energy Selector System
|
|
void LaserDrivenBeamLine::RemoveESS()
|
|
{
|
|
if(physicMagnet_1Left) {delete physicMagnet_1Left; delete physicMagnet_1Right; delete logicMagnet_1; delete solidMagnet_1;}
|
|
if(physicExternalMagnet_1Down){delete physicExternalMagnet_1Down; delete physicExternalMagnet_1; delete logicExternalMagnet_1; delete solidExternalMagnet_1;}
|
|
if(physicMagnet_2Left){delete physicMagnet_2Left; delete physicMagnet_2Right; delete logicMagnet_2; delete solidMagnet_2;}
|
|
if(physicExternalMagnet_2Down){ delete physicExternalMagnet_2Down; delete physicExternalMagnet_2; delete logicExternalMagnet_2; delete solidExternalMagnet_2; }
|
|
if(physicMagnet_3Left){delete physicMagnet_3Left; delete physicMagnet_3Right; delete logicMagnet_3; delete solidMagnet_3; }
|
|
if(physicExternalMagnet_3Down){delete physicExternalMagnet_3Down; delete physicExternalMagnet_3; delete logicExternalMagnet_3; delete solidExternalMagnet_3; }
|
|
if(physicMagnet_4Left) {delete physicMagnet_4Left; delete physicMagnet_4Right; delete logicMagnet_4; delete solidMagnet_4; }
|
|
if(physicExternalMagnet_4Down){delete physicExternalMagnet_4Down; delete physicExternalMagnet_4; delete logicExternalMagnet_4; delete solidExternalMagnet_4; }
|
|
if(physicCollimatorHole){delete physicCollimatorHole; delete logicCollimatorHole; delete solidCollimatorHole; }
|
|
if(physicCollimator) {delete physicCollimator; delete logicCollimator; delete solidCollimator; }
|
|
if(physicFinalCollimatorHole) {delete physicFinalCollimatorHole; delete logicFinalCollimatorHole; delete solidFinalCollimatorHole; }
|
|
if(physicFinalCollimator){delete physicFinalCollimator; delete logicFinalCollimator; delete solidFinalCollimator; }
|
|
if(physicInternalSlit){ delete physicInternalSlit; delete logicInternalSlit; delete solidInternalSlit; }
|
|
if(physicExternalSlit){delete physicExternalSlit; delete logicExternalSlit; delete solidExternalSlit; }
|
|
if(physicExithole){delete physicExithole; delete logicExithole; delete solidExithole;}
|
|
if(physicExitWindow){delete physicExitWindow; delete logicExitWindow; delete solidExitWindow;}
|
|
if(physicExitPipe){delete physicExitPipe; delete logicExitPipe; delete solidExitPipe;}
|
|
if(physicEntranceholeESSChamber){delete physicEntranceholeESSChamber;}
|
|
if(physicInternalChamber){delete physicInternalChamber; delete logicInternalChamber; delete solidInternalChamber;}
|
|
if(physicExternalChamber) {delete physicExternalChamber; delete logicExternalChamber; delete solidExternalChamber;}
|
|
if(pFieldMgr) {delete pFieldMgr;}
|
|
|
|
|
|
|
|
G4cout << "****************************************************" << G4endl;
|
|
G4cout << "************ The ESS has been disabled *************" << G4endl;
|
|
G4cout << "****************************************************" << G4endl;
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
}
|
|
// Change via external macro command the diameter of the first collimator
|
|
void LaserDrivenBeamLine::SetFirstCollimatorRadius(G4double valueR)
|
|
{
|
|
G4double radius = valueR;
|
|
solidCollimatorHole -> SetOuterRadius(radius);
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
G4cout << "The first collimator aperture has been modified to "<< valueR/mm <<"mm in diameter" << G4endl;
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Change via external macro command the thickness of the first collimator
|
|
void LaserDrivenBeamLine::SetFirstCollimatorThickness(G4double valueC)
|
|
{
|
|
G4double thickness = valueC/2;
|
|
solidCollimator -> SetXHalfLength(thickness);
|
|
solidCollimatorHole -> SetZHalfLength(thickness);
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
G4cout << "The first collimator thickness has been modified to "<< valueC/mm <<" mm in thickness" << G4endl;
|
|
}
|
|
|
|
// Change via external macro command the Z position of the first collimator hole
|
|
void LaserDrivenBeamLine::SetFirstCollimatorPositionZ(G4double valueQ)
|
|
{
|
|
physicCollimatorHole -> SetTranslation(G4ThreeVector(0., 0., valueQ));
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
G4cout << "The first collimator has been translated to "<< valueQ/mm <<"mm (along the z axis)" << G4endl;
|
|
}
|
|
|
|
// Change via external macro command the diameter of the second collimator
|
|
void LaserDrivenBeamLine::SetSecondCollimatorRadius(G4double value)
|
|
{
|
|
G4double radius = value;
|
|
solidFinalCollimatorHole -> SetOuterRadius(radius);
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
G4cout << "The second collimator aperture has been modified to "<< value/mm <<"mm in diameter" << G4endl;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Change via external macro command the thickness of the second collimator
|
|
void LaserDrivenBeamLine::SetSecondCollimatorThickness(G4double value)
|
|
{
|
|
G4double thickness = value/2;
|
|
solidFinalCollimator -> SetXHalfLength(thickness);
|
|
solidFinalCollimatorHole -> SetZHalfLength(thickness);
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
G4cout << "The second collimator thickness has been modified to "<< value/mm <<" mm in thickness" << G4endl;
|
|
}
|
|
|
|
// Change via external macro command the Z position of the second collimator hole
|
|
void LaserDrivenBeamLine::SetSecondCollimatorPositionZ(G4double value)
|
|
{
|
|
physicFinalCollimatorHole -> SetTranslation(G4ThreeVector(0., 0., value));
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
G4cout << "The second collimator has been translated to "<< value/mm <<"mm (along the z axis)" << G4endl;
|
|
}
|
|
// THE SLIT MESSENGERS
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Change the thickness of the Slit
|
|
void LaserDrivenBeamLine::SetThicknessSlit(G4double value)
|
|
{
|
|
if (value >(10.0*mm)) {
|
|
G4cout <<"***************************************"<< G4endl;
|
|
G4cout <<"******This is a warning messenger******"<< G4endl;
|
|
G4cout <<"***************************************"<< G4endl;
|
|
G4cout <<"The maximum value of the thickness of the slit is 10 mm, your value is >10 mm." << G4endl;
|
|
G4cout <<"The default thickness value is used, it is: " << ((solidExternalSlit -> GetXHalfLength())*2.)/mm
|
|
<< G4endl;
|
|
G4cout <<"***************************************"<< G4endl;
|
|
|
|
}
|
|
else {
|
|
G4double dimension = value/2;
|
|
solidExternalSlit -> SetXHalfLength(dimension);
|
|
solidInternalSlit -> SetXHalfLength(dimension);
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
G4cout <<"The thickness of the slit is:" << ((solidExternalSlit -> GetXHalfLength())*2.)/mm
|
|
<< G4endl;
|
|
}
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Change the hole size (in Y direction) of the Slit
|
|
void LaserDrivenBeamLine::SetSlitHoleDimensionY(G4double value)
|
|
{
|
|
G4double hole = value/2;
|
|
solidInternalSlit -> SetYHalfLength(hole);
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
G4cout << "The hole of the Slit has been changed in the Y direction to "<< value/mm <<" mm" <<G4endl;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Change the hole size (in Z direction) of the Slit
|
|
void LaserDrivenBeamLine::SetSlitHoleDimensionZ(G4double value)
|
|
{
|
|
G4double hole = value/2;
|
|
solidInternalSlit -> SetZHalfLength(hole);
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
G4cout << "The hole of the Slit has been changed in the Z direction to "<< value/mm <<" mm" <<G4endl;
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Change the Z position of the hole of the Slit
|
|
void LaserDrivenBeamLine::SetSlitHolePositionZ(G4double value)
|
|
{
|
|
physicInternalSlit -> SetTranslation(G4ThreeVector(0., 0., value));
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
G4cout << "The hole of the slit has been translated to "<< value/mm <<" mm (along the Z axis)" <<G4endl;
|
|
}
|
|
|
|
// QUADRUPOLES
|
|
|
|
// Disable via external macro command all quadrupoles
|
|
void LaserDrivenBeamLine::RemoveQuads()
|
|
{
|
|
if(physicFirstQuad)
|
|
{delete solidFirstQuad; delete logicFirstQuad; delete physicFirstQuad;delete SFirstTriplet; delete LFirstTriplet; delete PFirstTriplet;}
|
|
if(physicSecondQuad)
|
|
{delete solidSecondQuad; delete logicSecondQuad; delete physicSecondQuad;delete SSecondTriplet; delete LSecondTriplet; delete PSecondTriplet;}
|
|
if(physicThirdQuad)
|
|
{delete solidThirdQuad; delete logicThirdQuad; delete physicThirdQuad;delete SThirdTriplet; delete LThirdTriplet; delete PThirdTriplet;}
|
|
if(physicFourthQuad)
|
|
{delete solidFourthQuad; delete logicFourthQuad; delete physicFourthQuad;delete SFourthTriplet; delete LFourthTriplet; delete PFourthTriplet;}
|
|
if(pFieldMgrQuadFourth) {delete pFieldMgrQuadFourth;}
|
|
if(pFieldMgrQuadThird) {delete pFieldMgrQuadThird;}
|
|
if(pFieldMgrQuadSecond) {delete pFieldMgrQuadSecond;}
|
|
if(pFieldMgrQuadFirst) {delete pFieldMgrQuadFirst;}
|
|
|
|
|
|
G4cout << "******************************************************************" << G4endl;
|
|
G4cout << "************ The Quadrupoles system has been disabled *************" << G4endl;
|
|
G4cout << "******************************************************************" << G4endl;
|
|
G4RunManager::GetRunManager() -> GeometryHasBeenModified();
|
|
#ifdef G4VIS_USE
|
|
G4UImanager::GetUIpointer() -> ApplyCommand("/vis/viewer/flush");
|
|
#endif
|
|
}
|
|
|