Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-31 09:22:17

0001 //
0002 // ********************************************************************
0003 // * License and Disclaimer                                           *
0004 // *                                                                  *
0005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
0006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
0007 // * conditions of the Geant4 Software License,  included in the file *
0008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
0009 // * include a list of copyright holders.                             *
0010 // *                                                                  *
0011 // * Neither the authors of this software system, nor their employing *
0012 // * institutes,nor the agencies providing financial support for this *
0013 // * work  make  any representation or  warranty, express or implied, *
0014 // * regarding  this  software system or assume any liability for its *
0015 // * use.  Please see the license in the file  LICENSE  and URL above *
0016 // * for the full disclaimer and the limitation of liability.         *
0017 // *                                                                  *
0018 // * This  code  implementation is the result of  the  scientific and *
0019 // * technical work of the GEANT4 collaboration.                      *
0020 // * By using,  copying,  modifying or  distributing the software (or *
0021 // * any work based  on the software)  you  agree  to acknowledge its *
0022 // * use  in  resulting  scientific  publications,  and indicate your *
0023 // * acceptance of all terms of the Geant4 Software license.          *
0024 // ********************************************************************
0025 //
0026 // Hadrontherapy advanced example for Geant4
0027 // See more at: https://twiki.cern.ch/twiki/bin/view/Geant4/AdvancedExamplesHadrontherapy
0028 
0029 #include "HadrontherapyDetectorMessenger.hh"
0030 #include "HadrontherapyDetectorConstruction.hh"
0031 #include "G4UIdirectory.hh"
0032 #include "G4UIcmdWith3VectorAndUnit.hh"
0033 #include "G4UIcmdWithoutParameter.hh"
0034 #include "G4UIcmdWithAString.hh"
0035 #include "G4SystemOfUnits.hh"
0036 #include "G4UIcmdWithABool.hh"
0037 
0038 /////////////////////////////////////////////////////////////////////////////
0039 HadrontherapyDetectorMessenger::HadrontherapyDetectorMessenger(HadrontherapyDetectorConstruction* detector)
0040 :hadrontherapyDetector(detector)
0041 {
0042     // Change Phantom size
0043     changeThePhantomDir = new G4UIdirectory("/changePhantom/");
0044     changeThePhantomDir -> SetGuidance("Command to change the Phantom Size/position");
0045     changeThePhantomSizeCmd = new G4UIcmdWith3VectorAndUnit("/changePhantom/size", this);
0046     changeThePhantomSizeCmd -> SetGuidance("Insert sizes X Y and Z"
0047                                            "\n   0 or negative values mean <<Don't change it!>>");
0048     changeThePhantomSizeCmd -> SetParameterName("PhantomSizeAlongX",
0049                                                 "PhantomSizeAlongY",
0050                                                 "PhantomSizeAlongZ", false);
0051     changeThePhantomSizeCmd -> SetDefaultUnit("mm");
0052     changeThePhantomSizeCmd -> SetUnitCandidates("nm um mm cm");
0053     changeThePhantomSizeCmd -> AvailableForStates(G4State_Idle);
0054     
0055     
0056     // Change Phantom material
0057     changeThePhantomMaterialCmd = new G4UIcmdWithAString("/changePhantom/material", this);
0058     changeThePhantomMaterialCmd -> SetGuidance("Change the Phantom and the detector material");
0059     changeThePhantomMaterialCmd -> SetParameterName("PhantomMaterial", false);
0060     changeThePhantomMaterialCmd -> SetDefaultValue("G4_WATER");
0061     changeThePhantomMaterialCmd -> AvailableForStates(G4State_Idle);
0062     
0063     // Change Phantom position
0064     changeThePhantomPositionCmd = new G4UIcmdWith3VectorAndUnit("/changePhantom/position", this);
0065     changeThePhantomPositionCmd -> SetGuidance("Insert X Y and Z dimensions for the position of the center of the Phantom"
0066                                                " respect to that of the \"World\"");
0067     changeThePhantomPositionCmd -> SetParameterName("PositionAlongX",
0068                                                     "PositionAlongY",
0069                                                     "PositionAlongZ", false);
0070     changeThePhantomPositionCmd -> SetDefaultUnit("mm");
0071     changeThePhantomPositionCmd -> SetUnitCandidates("um mm cm m");
0072     changeThePhantomPositionCmd -> AvailableForStates(G4State_Idle);
0073     
0074     
0075     updateCmd = new G4UIcmdWithoutParameter("/changePhantom/update",this);
0076     updateCmd->SetGuidance("Update Phantom/Detector geometry.");
0077     updateCmd->SetGuidance("This command MUST be applied before \"beamOn\" ");
0078     updateCmd->SetGuidance("if you changed geometrical value(s).");
0079     updateCmd->AvailableForStates(G4State_Idle);
0080     
0081     //  Change detector size
0082     changeTheDetectorDir = new G4UIdirectory("/changeDetector/");
0083     changeTheDetectorDir -> SetGuidance("Command to change the Detector's Size/position/Voxels");
0084     
0085     changeTheDetectorSizeCmd = new G4UIcmdWith3VectorAndUnit("/changeDetector/size",this);
0086     changeTheDetectorSizeCmd -> SetGuidance("Insert sizes for X Y and Z dimensions of the Detector"
0087                                             "\n   0 or negative values mean <<Don't change it>>");
0088     changeTheDetectorSizeCmd -> SetParameterName("DetectorSizeAlongX", "DetectorSizeAlongY", "DetectorSizeAlongZ", false);
0089     changeTheDetectorSizeCmd -> SetDefaultUnit("mm");
0090     changeTheDetectorSizeCmd -> SetUnitCandidates("nm um mm cm");
0091     changeTheDetectorSizeCmd -> AvailableForStates(G4State_Idle);
0092     
0093     //  Change the detector to phantom displacement
0094     changeTheDetectorToPhantomPositionCmd = new G4UIcmdWith3VectorAndUnit("/changeDetector/displacement",this);
0095     changeTheDetectorToPhantomPositionCmd -> SetGuidance("Insert X Y and Z displacements between Detector and Phantom"
0096                                                          "\nNegative values mean <<Don't change it!>>");
0097     changeTheDetectorToPhantomPositionCmd -> SetParameterName("DisplacementAlongX",
0098                                                               "DisplacementAlongY",
0099                                                               "DisplacementAlongZ", false);
0100     changeTheDetectorToPhantomPositionCmd -> SetDefaultUnit("mm");
0101     changeTheDetectorToPhantomPositionCmd -> SetUnitCandidates("nm um mm cm");
0102     changeTheDetectorToPhantomPositionCmd -> AvailableForStates(G4State_Idle);
0103     
0104     // Change voxels by its size
0105     changeTheDetectorVoxelCmd = new G4UIcmdWith3VectorAndUnit("/changeDetector/voxelSize",this);
0106     changeTheDetectorVoxelCmd -> SetGuidance("Insert Voxel sizes for X Y and Z dimensions"
0107                                              "\n   0 or negative values mean <<Don't change it!>>");
0108     changeTheDetectorVoxelCmd -> SetParameterName("VoxelSizeAlongX", "VoxelSizeAlongY", "VoxelSizeAlongZ", false);
0109     changeTheDetectorVoxelCmd -> SetDefaultUnit("mm");
0110     changeTheDetectorVoxelCmd -> SetUnitCandidates("nm um mm cm");
0111     changeTheDetectorVoxelCmd -> AvailableForStates(G4State_Idle);
0112     
0113     
0114     changeTheSource = new G4UIdirectory("/changeTheSource/");
0115     changeTheSource -> SetGuidance("Command to change the source");
0116     
0117     
0118     
0119     
0120     /////////////////////////////////////////////////////////////////////////////
0121     
0122     VirtualLayer = new G4UIcmdWithABool("/changeTheSource/VirtualLayer",this);
0123     VirtualLayer -> SetParameterName("VirtualLayer ", false);
0124     VirtualLayer -> SetDefaultValue("false");
0125     VirtualLayer -> SetGuidance("Set if you want place a VirtualLayer"
0126                                 "\n[usage]: /changeTheSource/VirtualLayer [true/false]");
0127     VirtualLayer -> AvailableForStates(G4State_Idle, G4State_PreInit);
0128     
0129     
0130     VirtualLayerPosition = new G4UIcmdWith3VectorAndUnit("/changeTheSource/VirtualLayerPosition", this);
0131     VirtualLayerPosition -> SetGuidance("Insert X Y and Z dimensions for the position of the center of the Virtual Layer"
0132                                         " respect to that of the \"World\"");
0133     VirtualLayerPosition -> SetParameterName("PositionAlongX",
0134                                              "PositionAlongY",
0135                                              "PositionAlongZ", false);
0136     
0137     VirtualLayerPosition -> SetDefaultUnit("cm");
0138     VirtualLayerPosition -> SetUnitCandidates("um mm cm m");
0139     VirtualLayerPosition -> AvailableForStates(G4State_Idle);
0140     
0141     
0142     
0143 }
0144 
0145 /////////////////////////////////////////////////////////////////////////////
0146 HadrontherapyDetectorMessenger::~HadrontherapyDetectorMessenger()
0147 {
0148     delete changeThePhantomDir;
0149     delete changeThePhantomSizeCmd;
0150     delete changeThePhantomPositionCmd;
0151     delete changeThePhantomMaterialCmd;
0152     delete updateCmd;
0153     delete changeTheDetectorDir;
0154     delete changeTheDetectorSizeCmd;
0155     delete changeTheDetectorToPhantomPositionCmd;
0156     delete changeTheDetectorVoxelCmd;
0157     delete VirtualLayer;
0158     delete VirtualLayerPosition;
0159 }
0160 
0161 /////////////////////////////////////////////////////////////////////////////
0162 void HadrontherapyDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue)
0163 {
0164     
0165     if( command == changeThePhantomSizeCmd)
0166     {
0167         G4ThreeVector size = changeThePhantomSizeCmd -> GetNew3VectorValue(newValue);
0168         hadrontherapyDetector -> SetPhantomSize(size.getX(),size.getY(),size.getZ());
0169     }
0170     else if (command == changeThePhantomPositionCmd )
0171     {
0172         
0173         G4ThreeVector size = changeThePhantomPositionCmd -> GetNew3VectorValue(newValue);
0174         hadrontherapyDetector -> SetPhantomPosition(size);
0175     }
0176     else if (command == changeThePhantomMaterialCmd)
0177     {
0178         hadrontherapyDetector -> SetPhantomMaterial(newValue);
0179     }
0180     else if (command == changeTheDetectorSizeCmd)
0181     {
0182         G4ThreeVector size = changeTheDetectorSizeCmd  -> GetNew3VectorValue(newValue);
0183         hadrontherapyDetector -> SetDetectorSize(size.getX(),size.getY(),size.getZ());
0184     }
0185     else if (command == changeTheDetectorToPhantomPositionCmd)
0186     {
0187         G4ThreeVector size = changeTheDetectorToPhantomPositionCmd-> GetNew3VectorValue(newValue);
0188         hadrontherapyDetector -> SetDetectorToPhantomPosition(size);
0189         
0190     }
0191     else if (command == changeTheDetectorVoxelCmd)
0192     {
0193         G4ThreeVector size = changeTheDetectorVoxelCmd  -> GetNew3VectorValue(newValue);
0194         hadrontherapyDetector -> SetVoxelSize(size.getX(),size.getY(),size.getZ());
0195     }
0196     else if (command == updateCmd)
0197     {
0198         hadrontherapyDetector -> UpdateGeometry();
0199     }
0200     
0201     else if(command == VirtualLayer)
0202     {
0203         hadrontherapyDetector->VirtualLayer(VirtualLayer->GetNewBoolValue(newValue));
0204     }
0205     else if(command == VirtualLayerPosition)
0206     {
0207         G4ThreeVector size = VirtualLayerPosition-> GetNew3VectorValue(newValue);
0208 
0209         hadrontherapyDetector -> SetVirtualLayerPosition(size);
0210     }
0211     
0212 }