// // ******************************************************************** // * 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. * // ******************************************************************** // // The code was written by : // ^Claudio Andenna claudio.andenna@ispesl.it, claudio.andenna@iss.infn.it // *Barbara Caccia barbara.caccia@iss.it // with the support of Pablo Cirrone (LNS, INFN Catania Italy) // with the contribute of Alessandro Occhigrossi* // // ^INAIL DIPIA - ex ISPESL and INFN Roma, gruppo collegato Sanità, Italy // *Istituto Superiore di Sanità and INFN Roma, gruppo collegato Sanità, Italy // Viale Regina Elena 299, 00161 Roma (Italy) // tel (39) 06 49902246 // fax (39) 06 49387075 // // more information: // http://g4advancedexamples.lngs.infn.it/Examples/medical-linac // //*******************************************************// #include "ML2Acc2.hh" #include "ML2Acc2Messenger.hh" #include "ML2Accelerator.hh" #include "G4SystemOfUnits.hh" #include "G4ios.hh" using namespace std; CML2Acc2::CML2Acc2() { PVWorld = 0; acc2Messenger = new CML2Acc2Messenger(this); } CML2Acc2::~CML2Acc2(void) { } CML2Acc2* CML2Acc2::instance = 0; CML2Acc2* CML2Acc2::GetInstance(void) { if (instance == 0) { instance = new CML2Acc2(); } return instance; } void CML2Acc2::writeInfo() { G4cout << "----------------------------------------------------------------" << G4endl;; G4cout << "Accelerator VARIAN LINAC 2100 " << G4endl; G4cout <<"\n\n\tnominal beam energy: "<0) { G4cout << "\tvec_leaves A aperture [mm]" << G4endl;; for (int i=0; i< (int)vec_leavesA.size(); i++) { G4cout<<"\t" <0) { G4cout << "\tvec_leaves B aperture [mm]" << G4endl; for (int i=0; i< (int)vec_leavesB.size(); i++) { G4cout<<"\t" <rotateY(-theta); break; case 2: //idJaw2XV2100: theta=fabs(atan(jaw2XAperture/isoCentre)); centre.set(-(z*sin(theta)+dx*cos(theta)), y, z*cos(theta)-dx*sin(theta)); cRotation->rotateY(theta); break; case 3: //idJaw1YV2100: theta=fabs(atan(jaw1YAperture/isoCentre)); centre.set(x, z*sin(theta)+dy*cos(theta), z*cos(theta)-dy*sin(theta)); cRotation->rotateX(theta); break; case 4: //idJaw2YV2100: theta=fabs(atan(jaw2YAperture/isoCentre)); centre.set(x, -(z*sin(theta)+dy*cos(theta)), z*cos(theta)-dy*sin(theta)); cRotation->rotateX(-theta); break; } } bool CML2Acc2::target() { bool bCreated = false; switch (idEnergy) { case 6: { // Physical and logical volumes G4Material *W = G4NistManager::Instance()->FindOrBuildMaterial("G4_W"); G4Box *targetABox = new G4Box("targetABox", 5.*mm, 5.*mm, (.035*25.4/2.)*mm); G4LogicalVolume *targetALV = new G4LogicalVolume(targetABox, W, "targetALV", 0, 0, 0); G4Material *Cu = G4NistManager::Instance()->FindOrBuildMaterial("G4_Cu"); G4Box *targetBBox = new G4Box("targetABox", 5.*mm, 5.*mm, (0.062*25.4/2.)*mm); G4LogicalVolume *targetBLV = new G4LogicalVolume(targetBBox, Cu, "targetBLV", 0, 0, 0); // specific translations for the various parts of the component new G4PVPlacement( 0, G4ThreeVector(0.,0.,targetABox->GetZHalfLength()), "targetAPV", targetALV, PVWorld, false, 0); new G4PVPlacement( 0, G4ThreeVector(0.,0.,targetABox->GetZHalfLength()*2.+targetBBox->GetZHalfLength()), "targetBPV", targetBLV, PVWorld, false, 0); // Region for cuts G4Region *regVol= new G4Region("targetR"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts->SetProductionCut(0.2*cm); regVol->SetProductionCuts(cuts); targetALV->SetRegion(regVol); regVol->AddRootLogicalVolume(targetALV); targetBLV->SetRegion(regVol); regVol->AddRootLogicalVolume(targetBLV); // Visibility G4VisAttributes* simpleAlSVisAtt= new G4VisAttributes(G4Colour::Red()); simpleAlSVisAtt->SetVisibility(true); targetALV->SetVisAttributes(simpleAlSVisAtt); G4VisAttributes* simpleBlSVisAtt= new G4VisAttributes(G4Colour::Yellow()); simpleBlSVisAtt->SetVisibility(true); targetBLV->SetVisAttributes(simpleBlSVisAtt); bCreated = true; break; } case 15: { // Physical and logical volumes G4Material *W = G4NistManager::Instance()->FindOrBuildMaterial("G4_W"); G4Box *targetABox = new G4Box("targetABox", 5.*mm, 5.*mm, (.025*25.4/2.)*mm); G4LogicalVolume *targetALV = new G4LogicalVolume(targetABox, W, "targetALV", 0, 0, 0); G4Material *Cu = G4NistManager::Instance()->FindOrBuildMaterial("G4_Cu"); G4Box *targetBBox = new G4Box("targetABox", 5.*mm, 5.*mm, (0.312*25.4/2.)*mm); G4LogicalVolume *targetBLV = new G4LogicalVolume(targetBBox, Cu, "targetBLV", 0, 0, 0); // specific translations for the various parts of the component new G4PVPlacement( 0, G4ThreeVector(0.,0.,targetABox->GetZHalfLength()), "targetAPV", targetALV, PVWorld, false, 0); new G4PVPlacement( 0, G4ThreeVector(0.,0.,targetABox->GetZHalfLength()*2.+targetBBox->GetZHalfLength()), "targetBPV", targetBLV, PVWorld, false, 0); // Region for cuts G4Region *regVol= new G4Region("targetR"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts->SetProductionCut(0.2*cm); regVol->SetProductionCuts(cuts); targetALV->SetRegion(regVol); regVol->AddRootLogicalVolume(targetALV); targetBLV->SetRegion(regVol); regVol->AddRootLogicalVolume(targetBLV); // Visibility G4VisAttributes* simpleAlSVisAtt= new G4VisAttributes(G4Colour::Red()); simpleAlSVisAtt->SetVisibility(true); targetALV->SetVisAttributes(simpleAlSVisAtt); G4VisAttributes* simpleBlSVisAtt= new G4VisAttributes(G4Colour::Yellow()); simpleBlSVisAtt->SetVisibility(true); targetBLV->SetVisAttributes(simpleBlSVisAtt); bCreated=true; break; } } return bCreated; } bool CML2Acc2::primaryCollimator() { bool bCreated = false; // the component as a whole G4double totalHeight = 80.0*mm; G4Material *Pb = G4NistManager::Instance()->FindOrBuildMaterial("G4_Pb"); G4Material *Vacuum = G4NistManager::Instance()->FindOrBuildMaterial("G4_Galactic"); // Region for cuts G4Region *regVol = new G4Region("primaryCollimator"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts->SetProductionCut(1.*cm); regVol->SetProductionCuts(cuts); // //-------------------- upper part---------------- G4ThreeVector centre=G4ThreeVector(0.,0.,16.)-G4ThreeVector(0.,0.,(16. + totalHeight-76.)/2.); G4Tubs *PCUTube = new G4Tubs("PrimaryCollimatorUTube", 10.*mm, 40.0*mm, 10.*mm, 0.*deg, 360.*deg); G4LogicalVolume *PCUTubeLV = new G4LogicalVolume(PCUTube, Pb, "PrimaryCollimatorUTubeLV", 0, 0, 0); new G4PVPlacement(0, centre, "PrimaryCollimatorUTubePV", PCUTubeLV, PVWorld, false, 0); G4VisAttributes* simpleAlSVisAtt= new G4VisAttributes(G4Colour::White()); simpleAlSVisAtt->SetVisibility(true); PCUTubeLV->SetVisAttributes(simpleAlSVisAtt); PCUTubeLV->SetRegion(regVol); regVol->AddRootLogicalVolume(PCUTubeLV); // //-------------------- lower part---------------- // Tube G4Tubs* PCLTube = new G4Tubs("PrimaryCollimatorLTube", 0., 40.*mm, 60./2.*mm, 0.*deg, 360.*deg); // Cone G4double coneAperture = 14.*deg; G4Cons* collimCone = new G4Cons("PrimaryCollimatorLCone", 0., (16.*std::tan(coneAperture))*mm, 0., (76.*std::tan(coneAperture))*mm, 30.*mm, 0.*deg, 360.*deg); G4LogicalVolume* PCLTubeLV = new G4LogicalVolume(PCLTube, Pb, "PCLTubeLV",0,0,0); G4LogicalVolume* collimConeLV = new G4LogicalVolume(collimCone, Vacuum, "collimConeLV",0,0,0); centre = G4ThreeVector(0.,0.,16.+60./2.); G4VPhysicalVolume *PCLTubePV = new G4PVPlacement(0, centre, "PCLTubePV", PCLTubeLV, PVWorld, false, 0); centre = G4ThreeVector(0.,0.,0.); new G4PVPlacement(0, centre, "TubeMinusConeLPV", collimConeLV, PCLTubePV, false, 0); // Visualization simpleAlSVisAtt = new G4VisAttributes(G4Colour::Green()); simpleAlSVisAtt->SetVisibility(true); simpleAlSVisAtt->SetForceSolid(true); PCLTubeLV->SetVisAttributes(simpleAlSVisAtt); // Region for cuts PCLTubeLV->SetRegion(regVol); regVol->AddRootLogicalVolume(PCLTubeLV); bCreated = true; return bCreated; } bool CML2Acc2::vacuumWindow() { bool bCreated = false; G4Material *Be=G4NistManager::Instance()->FindOrBuildMaterial("G4_Be"); // Region for cuts G4Region *regVol = new G4Region("BeWindow"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts->SetProductionCut(0.1*cm); regVol->SetProductionCuts(cuts); G4Tubs* BeWTube = new G4Tubs("BeWindowTube", 0., 50.*mm, 0.12*mm, 0.*deg, 360.*deg); G4LogicalVolume *BeWTubeLV = new G4LogicalVolume(BeWTube, Be, "BeWTubeLV", 0, 0, 0); new G4PVPlacement(0, G4ThreeVector(0.,0.,90.*mm), "BeWTubePV", BeWTubeLV, PVWorld, false, 0); G4VisAttributes* simpleAlSVisAtt= new G4VisAttributes(G4Colour::Yellow()); simpleAlSVisAtt->SetVisibility(true); BeWTubeLV->SetVisAttributes(simpleAlSVisAtt); BeWTubeLV->SetRegion(regVol); regVol->AddRootLogicalVolume(BeWTubeLV); bCreated = true; return bCreated; } bool CML2Acc2::flatteningFilter() { G4String iName; char a[10]; bool bCreated = false; switch (idEnergy) { case 6: { G4double distanceLast = 116.3386 - 0.932*25.4/2.*mm; G4Material *Cu = G4NistManager::Instance()->FindOrBuildMaterial("G4_Cu"); const int PointsNumber=22; // Coordinates of flattening filter in inches G4double xRadius[PointsNumber]={0.0000000001, .025, .050, .075, .1, .15, .2, .25, .3, .35, .4, .5, .6, .7, .8, .9, 1., 1.1, 1.205, 1.3, 1.325, 1.5}; G4double yHeight[PointsNumber]={.932, .92, .907, .892, .874, .83, .782, .736, .69, .645, .601, .516, .437, .361, .294, .22, .173, .118, .08, .08, .125, .125}; int i; // From inches to millimeters for (i = 0; iSetProductionCut(0.2*cm); regVol->SetProductionCuts(cuts); for (i = 0 ; i < 19; i++) { sprintf(a,"%d", i); iName = (G4String)a; halfHeigth = (yHeight[i]-yHeight[i+1])/2. ; if (i == 18) { halfHeigth = yHeight[i]/2.; } rMaxInf = xRadius[i]; rMaxSup = xRadius[i+1]; rMinInf = 0.; rMinSup = 0.; centre.set(0.,0.,distanceLast+halfHeigth); distanceLast+=halfHeigth*2.; name = "ffConeG"+iName; cone = new G4Cons(name, rMinInf, rMaxInf, rMinSup, rMaxSup, halfHeigth, angleStart, angleStop); name = "ffConeLV"+iName; logVol = new G4LogicalVolume(cone, Cu, name, 0, 0, 0); name = "ffConePV"+iName; new G4PVPlacement(0, centre, name, logVol, PVWorld, false, 0); // Region for cuts logVol->SetRegion(regVol); regVol->AddRootLogicalVolume(logVol); // Visualization simpleAlSVisAtt= new G4VisAttributes(G4Colour::Cyan()); simpleAlSVisAtt->SetVisibility(true); logVol->SetVisAttributes(simpleAlSVisAtt); } halfHeigth = yHeight[19]/2. ; rMaxInf = xRadius[21]; rMaxSup = xRadius[21]; rMinInf = 0.; rMinSup = 0.; centre.set(0.,0., distanceLast+halfHeigth); sprintf(a,"%d", i); iName = (G4String)a; name = "ffConeG"+iName; cone = new G4Cons(name, rMinInf, rMaxInf, rMinSup, rMaxSup, halfHeigth, angleStart, angleStop); name = "ffConeLV"+iName; logVol = new G4LogicalVolume(cone, Cu, name, 0, 0, 0); name = "ffConePV"+iName; new G4PVPlacement(0, centre, name, logVol, PVWorld, false, 0); // Region for cuts logVol->SetRegion(regVol); regVol->AddRootLogicalVolume(logVol); // Visualization simpleAlSVisAtt = new G4VisAttributes(G4Colour::Cyan()); simpleAlSVisAtt -> SetVisibility(true); logVol -> SetVisAttributes(simpleAlSVisAtt); halfHeigth = (yHeight[20]-yHeight[19])/2. ; rMaxInf = xRadius[21]; rMaxSup = xRadius[21]; rMinInf = xRadius[20]; rMinSup = xRadius[19]; centre.set(0.,0., distanceLast-halfHeigth); sprintf(a,"%d", ++i); iName = (G4String)a; name = "ffConeG"+iName; cone = new G4Cons(name, rMinInf, rMaxInf, rMinSup, rMaxSup, halfHeigth, angleStart, angleStop); name = "ffConeLV"+iName; logVol = new G4LogicalVolume(cone, Cu, name, 0, 0, 0); name = "ffConePV"+iName; new G4PVPlacement(0, centre, name, logVol,PVWorld, false, 0); // Region for cuts logVol->SetRegion(regVol); regVol->AddRootLogicalVolume(logVol); // Visualization simpleAlSVisAtt= new G4VisAttributes(G4Colour::Cyan()); simpleAlSVisAtt->SetVisibility(true); logVol->SetVisAttributes(simpleAlSVisAtt); bCreated = true; break; } case 15: { G4double distanceLast = 125.+.125*25.4 - 0.744*25.4/2.- 0.744*25.4/2.*mm; G4Material *Cu = G4NistManager::Instance()->FindOrBuildMaterial("G4_Cu"); const int PointsNumber = 21; // Coordinate in pollici del flattening filter come da disegno G4double xRadius[PointsNumber] = {0.0000000001, 0.040, 0.078, 0.105, 0.131, 0.160, 0.205, 0.248, 0.343, 0.436, 0.531, 0.628, 0.727, 0.829, 0.880, 0.932, 0.983, 1.037, 1.250, 1.350, 1.5}; G4double yHeight[PointsNumber] = {0.744, 0.718, 0.682, 0.653, 0.622, 0.593, 0.547, 0.506, 0.427, 0.354, 0.287, 0.225, 0.168, 0.119, 0.090, 0.067, 0.047, 0.030, 0.030, 0.125, 0.125}; // From inches to millimeters int i; for (i = 0; i < PointsNumber; i++) { xRadius[i]*=25.4*mm; yHeight[i]*=25.4*mm; } G4double angleStart = 0.; G4double angleStop = 360.0; G4double halfHeigth, rMaxInf, rMaxSup, rMinInf, rMinSup; G4String name; G4ThreeVector centre; G4Cons *cone; G4LogicalVolume *logVol; // G4VPhysicalVolume *phVol; G4VisAttributes* simpleAlSVisAtt; G4Region *regVol= new G4Region("flatfilterR"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts->SetProductionCut(0.2*cm); regVol->SetProductionCuts(cuts); for (i=0;i<18;i++) { sprintf(a,"%d", i); iName = (G4String)a; halfHeigth = (yHeight[i]-yHeight[i+1])/2. ; if (i == 17) { halfHeigth = yHeight[i]/2.; } rMaxInf = xRadius[i]; rMaxSup = xRadius[i+1]; rMinInf = 0.; rMinSup = 0.; centre.set(0.,0.,distanceLast+halfHeigth); distanceLast+=halfHeigth*2.; name = "ffConeG"+iName; cone = new G4Cons(name, rMinInf, rMaxInf, rMinSup, rMaxSup, halfHeigth, angleStart, angleStop); name = "ffConeLV"+iName; logVol = new G4LogicalVolume(cone, Cu, name, 0, 0, 0); name = "ffConePV"+iName; new G4PVPlacement(0, centre, name, logVol, PVWorld, false, 0); // Region for cuts logVol -> SetRegion(regVol); regVol -> AddRootLogicalVolume(logVol); // Visualization simpleAlSVisAtt = new G4VisAttributes(G4Colour::Cyan()); simpleAlSVisAtt -> SetVisibility(true); logVol -> SetVisAttributes(simpleAlSVisAtt); } halfHeigth = yHeight[18]/2. ; rMaxInf = xRadius[20]; rMaxSup = xRadius[20]; rMinInf = 0.; rMinSup = 0.; centre.set(0.,0., distanceLast+halfHeigth); sprintf(a,"%d", i); iName = (G4String)a; name = "ffConeG"+iName; cone = new G4Cons(name, rMinInf, rMaxInf, rMinSup, rMaxSup, halfHeigth, angleStart, angleStop); name = "ffConeLV"+iName; logVol = new G4LogicalVolume(cone, Cu, name, 0, 0, 0); name = "ffConePV"+iName; new G4PVPlacement(0, centre, name, logVol, PVWorld, false, 0); // Region for cuts logVol -> SetRegion(regVol); regVol -> AddRootLogicalVolume(logVol); // Visualization simpleAlSVisAtt = new G4VisAttributes(G4Colour::Cyan()); simpleAlSVisAtt -> SetVisibility(true); logVol -> SetVisAttributes(simpleAlSVisAtt); halfHeigth = (yHeight[19]-yHeight[18])/2. ; rMaxInf = xRadius[20]; rMaxSup = xRadius[20]; rMinInf = xRadius[19]; rMinSup = xRadius[18]; centre.set(0.,0., distanceLast-halfHeigth); sprintf(a,"%d", ++i); iName = (G4String)a; name = "ffConeG"+iName; cone = new G4Cons(name, rMinInf, rMaxInf, rMinSup, rMaxSup, halfHeigth, angleStart, angleStop); name = "ffConeLV"+iName; logVol = new G4LogicalVolume(cone, Cu, name, 0, 0, 0); name = "ffConePV"+iName; new G4PVPlacement(0, centre, name, logVol,PVWorld, false, 0); // Region for cuts logVol -> SetRegion(regVol); regVol -> AddRootLogicalVolume(logVol); // Visualization simpleAlSVisAtt = new G4VisAttributes(G4Colour::Cyan()); simpleAlSVisAtt -> SetVisibility(true); logVol -> SetVisAttributes(simpleAlSVisAtt); bCreated = true; break; } } return bCreated; } bool CML2Acc2::ionizationChamber() { bool bCreated = false; G4Material *KAPTON = G4NistManager::Instance()->FindOrBuildMaterial("G4_KAPTON"); G4Region *regVol = new G4Region("ionizationChamber"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts -> SetProductionCut(0.1*cm); regVol -> SetProductionCuts(cuts); G4VisAttributes* simpleAlSVisAtt; // Region for cuts G4Tubs* ICTubeW = new G4Tubs("ionizationChamberTube", 0., 3.75*2.54*10.*mm, 0.005*25.4*mm, 0.*deg, 360.*deg); G4Tubs* ICTubeP = new G4Tubs("ionizationChamberTube", 0., 3.75*2.54*10.*mm, 0.002*25.4*mm, 0.*deg, 360.*deg); G4ThreeVector centre; // W1 centre.set(0.,0.,148.35*mm); G4LogicalVolume *PCUTubeW1LV = new G4LogicalVolume(ICTubeW, KAPTON, "ionizationChamberTubeW1LV", 0, 0, 0); new G4PVPlacement(0, centre, "ionizationChamberTubeW1PV", PCUTubeW1LV, PVWorld, false, 0); simpleAlSVisAtt = new G4VisAttributes(G4Colour::Blue()); simpleAlSVisAtt -> SetVisibility(true); PCUTubeW1LV -> SetVisAttributes(simpleAlSVisAtt); PCUTubeW1LV -> SetRegion(regVol); regVol -> AddRootLogicalVolume(PCUTubeW1LV); // P1 centre.set(0.,0.,150.73*mm); G4LogicalVolume *PCUTubeP1LV = new G4LogicalVolume(ICTubeP, KAPTON, "ionizationChamberTubeP1LV", 0, 0, 0); new G4PVPlacement(0, centre, "ionizationChamberTubeP1PV", PCUTubeP1LV, PVWorld, false, 0); simpleAlSVisAtt = new G4VisAttributes(G4Colour::Yellow()); simpleAlSVisAtt -> SetVisibility(true); PCUTubeP1LV -> SetVisAttributes(simpleAlSVisAtt); PCUTubeP1LV -> SetRegion(regVol); regVol -> AddRootLogicalVolume(PCUTubeP1LV); // W2 centre.set(0.,0.,155.5*mm); G4LogicalVolume *PCUTubeW2LV = new G4LogicalVolume(ICTubeW, KAPTON, "ionizationChamberTubeW2LV", 0, 0, 0); new G4PVPlacement(0, centre, "ionizationChamberTubeW2PV", PCUTubeW2LV, PVWorld, false, 0); simpleAlSVisAtt = new G4VisAttributes(G4Colour::Blue()); simpleAlSVisAtt -> SetVisibility(true); PCUTubeW2LV -> SetVisAttributes(simpleAlSVisAtt); PCUTubeW2LV -> SetRegion(regVol); regVol -> AddRootLogicalVolume(PCUTubeW2LV); // P2 centre.set(0.,0.,153.12*mm); G4LogicalVolume *PCUTubeP2LV = new G4LogicalVolume(ICTubeP, KAPTON, "ionizationChamberTubeP2LV", 0, 0, 0); new G4PVPlacement(0, centre, "ionizationChamberTubeP2PV", PCUTubeP2LV, PVWorld, false, 0); simpleAlSVisAtt = new G4VisAttributes(G4Colour::Yellow()); simpleAlSVisAtt->SetVisibility(true); PCUTubeP2LV->SetVisAttributes(simpleAlSVisAtt); PCUTubeP2LV->SetRegion(regVol); regVol->AddRootLogicalVolume(PCUTubeP2LV); // W3 centre.set(0.,0.,162.65*mm); G4LogicalVolume *PCUTubeW3LV = new G4LogicalVolume(ICTubeW, KAPTON, "ionizationChamberTubeW3LV", 0, 0, 0); new G4PVPlacement(0, centre, "ionizationChamberTubeW3PV", PCUTubeW3LV, PVWorld, false, 0); simpleAlSVisAtt = new G4VisAttributes(G4Colour::Blue()); simpleAlSVisAtt -> SetVisibility(true); PCUTubeW3LV -> SetVisAttributes(simpleAlSVisAtt); PCUTubeW3LV -> SetRegion(regVol); regVol -> AddRootLogicalVolume(PCUTubeW3LV); // P3 centre.set(0.,0.,157.88*mm); G4LogicalVolume *PCUTubeP3LV = new G4LogicalVolume(ICTubeP, KAPTON, "ionizationChamberTubeP3LV", 0, 0, 0); new G4PVPlacement(0, centre, "ionizationChamberTubeP3PV", PCUTubeP3LV, PVWorld, false, 0); simpleAlSVisAtt = new G4VisAttributes(G4Colour::Yellow()); simpleAlSVisAtt -> SetVisibility(true); PCUTubeP3LV -> SetVisAttributes(simpleAlSVisAtt); PCUTubeP3LV -> SetRegion(regVol); regVol -> AddRootLogicalVolume(PCUTubeP3LV); // P4 centre.set(0.,0.,160.27*mm); G4LogicalVolume *PCUTubeP4LV = new G4LogicalVolume(ICTubeP, KAPTON, "ionizationChamberTubeP4LV", 0, 0, 0); new G4PVPlacement(0, centre, "ionizationChamberTubeP4PV", PCUTubeP4LV, PVWorld, false, 0); simpleAlSVisAtt = new G4VisAttributes(G4Colour::Yellow()); simpleAlSVisAtt->SetVisibility(true); PCUTubeP4LV->SetVisAttributes(simpleAlSVisAtt); PCUTubeP4LV->SetRegion(regVol); regVol->AddRootLogicalVolume(PCUTubeP4LV); bCreated = true; return bCreated; } bool CML2Acc2::mirror() { bool bCreated = false; G4Material *MYLAR = G4NistManager::Instance()->FindOrBuildMaterial("G4_MYLAR"); // Region for cuts G4Region *regVol = new G4Region("Mirror"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts -> SetProductionCut(0.1*cm); regVol -> SetProductionCuts(cuts); G4Tubs* MirrorTube = new G4Tubs("MirrorTube", 0., 86.*mm, 1.*mm, 0.*deg, 360.*deg); G4LogicalVolume *MirrorTubeLV = new G4LogicalVolume(MirrorTube, MYLAR, "MirrorTubeLV", 0, 0, 0); G4RotationMatrix *cRotation = new G4RotationMatrix(); cRotation -> rotateY(35.0*deg); new G4PVPlacement(cRotation, G4ThreeVector(0., 0., 220.*mm), "MirrorTubePV", MirrorTubeLV,PVWorld, false, 0); G4VisAttributes* simpleAlSVisAtt = new G4VisAttributes(G4Colour::Green()); simpleAlSVisAtt -> SetVisibility(true); MirrorTubeLV -> SetVisAttributes(simpleAlSVisAtt); MirrorTubeLV -> SetRegion(regVol); regVol -> AddRootLogicalVolume(MirrorTubeLV); bCreated = true; return bCreated; } bool CML2Acc2::Jaw1X() { bool bCreated = false; G4Material *W = G4NistManager::Instance()->FindOrBuildMaterial("G4_W"); G4String name = "Jaws1X"; G4Region *regVol= new G4Region(name+"R"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts->SetProductionCut(1.*cm); regVol->SetProductionCuts(cuts); G4VisAttributes* simpleAlSVisAtt; G4ThreeVector centre, halfSize; G4RotationMatrix *cRotation = new G4RotationMatrix(); centre.set(0.,0.,(367.+78./2.)*mm); halfSize.set(50.*mm, 90.*mm, 78./2.*mm); G4Box *box = new G4Box(name+"Box", halfSize.getX(), halfSize.getY(), halfSize.getZ()); G4LogicalVolume *logVol = new G4LogicalVolume(box, W, name+"LV", 0, 0, 0); SetJawAperture(1, centre, halfSize,cRotation); new G4PVPlacement(cRotation, centre, name+"PV", logVol, PVWorld, false, 0); // Region for cuts logVol->SetRegion(regVol); regVol->AddRootLogicalVolume(logVol); // Visibility simpleAlSVisAtt= new G4VisAttributes(G4Colour::Blue()); simpleAlSVisAtt->SetVisibility(true); logVol->SetVisAttributes(simpleAlSVisAtt); bCreated = true; return bCreated; } bool CML2Acc2::Jaw2X() { bool bCreated=false; G4Material *W=G4NistManager::Instance()->FindOrBuildMaterial("G4_W"); G4String name="Jaws2X"; G4Region *regVol= new G4Region(name+"R"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts->SetProductionCut(1.*cm); regVol->SetProductionCuts(cuts); G4VisAttributes* simpleAlSVisAtt; G4ThreeVector centre, halfSize; G4RotationMatrix *cRotation = new G4RotationMatrix(); centre.set(0.,0.,(367.+78./2.)*mm); halfSize.set(50.*mm, 90.*mm, 78./2.*mm); G4Box *box = new G4Box(name+"Box", halfSize.getX(), halfSize.getY(), halfSize.getZ()); G4LogicalVolume *logVol = new G4LogicalVolume(box, W, name+"LV", 0, 0, 0); SetJawAperture(2, centre, halfSize, cRotation); new G4PVPlacement(cRotation, centre, name+"PV", logVol, PVWorld, false, 0); // Region for cuts logVol->SetRegion(regVol); regVol->AddRootLogicalVolume(logVol); // Visibility simpleAlSVisAtt= new G4VisAttributes(G4Colour::Blue()); simpleAlSVisAtt->SetVisibility(true); logVol->SetVisAttributes(simpleAlSVisAtt); bCreated = true; return bCreated; } bool CML2Acc2::Jaw1Y() { bool bCreated = false; G4Material *W = G4NistManager::Instance()->FindOrBuildMaterial("G4_W"); G4String name="Jaws1Y"; G4Region *regVol= new G4Region(name+"R"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts->SetProductionCut(1.*cm); regVol->SetProductionCuts(cuts); G4VisAttributes* simpleAlSVisAtt; G4ThreeVector centre, halfSize; G4RotationMatrix *cRotation=new G4RotationMatrix(); centre.set(0.,0.,(280.+78./2.)*mm); halfSize.set(90.*mm, 50.*mm, 78./2.*mm); G4Box *box = new G4Box(name+"Box", halfSize.getX(), halfSize.getY(), halfSize.getZ()); G4LogicalVolume *logVol = new G4LogicalVolume(box, W, name+"LV", 0, 0, 0); SetJawAperture(3, centre, halfSize, cRotation); new G4PVPlacement(cRotation, centre, name+"PV", logVol, PVWorld, false, 0); // Region for cuts logVol->SetRegion(regVol); regVol->AddRootLogicalVolume(logVol); // Visibility simpleAlSVisAtt= new G4VisAttributes(G4Colour::Red()); simpleAlSVisAtt->SetVisibility(true); logVol->SetVisAttributes(simpleAlSVisAtt); bCreated = true; return bCreated; } bool CML2Acc2::Jaw2Y() { bool bCreated = false; G4Material *W = G4NistManager::Instance()->FindOrBuildMaterial("G4_W"); G4String name = "Jaws2Y"; G4Region *regVol = new G4Region(name+"R"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts->SetProductionCut(1.*cm); regVol->SetProductionCuts(cuts); G4ThreeVector centre, halfSize; G4RotationMatrix *cRotation=new G4RotationMatrix(); centre.set(0.,0.,(280.+78./2.)*mm); halfSize.set(90.*mm, 50.*mm, 78./2.*mm); G4Box *box = new G4Box(name+"Box", halfSize.getX(), halfSize.getY(), halfSize.getZ()); G4LogicalVolume *logVol = new G4LogicalVolume(box, W, name+"LV", 0, 0, 0); SetJawAperture(4, centre, halfSize, cRotation); new G4PVPlacement(cRotation, centre, name+"PV", logVol, PVWorld, false, 0); // Region for cuts logVol->SetRegion(regVol); regVol->AddRootLogicalVolume(logVol); // Visibility G4VisAttributes* simpleAlSVisAtt = new G4VisAttributes(G4Colour::Red()); simpleAlSVisAtt -> SetVisibility(true); logVol -> SetVisAttributes(simpleAlSVisAtt); bCreated = true; return bCreated; } bool CML2Acc2::MLC() { G4String iName; char a[12]; bool bCreated = false; // material G4Material *W = G4NistManager::Instance()->FindOrBuildMaterial("G4_W"); G4VisAttributes* simpleAlSVisAtt; // Region for cuts G4Region *regVol = new G4Region("MLCR"); G4ProductionCuts* cuts = new G4ProductionCuts; cuts->SetProductionCut(0.5*cm); regVol->SetProductionCuts(cuts); G4ThreeVector box1Size, box2Size; G4ThreeVector centreStart; centreStart.set(0.,0.,(482.5+535.5)/2.*mm); box1Size.set(5.2883/2.*mm, 167.488/2.*mm, 61.2953/2.*mm); G4double circleRadiuos=80.0*mm; G4double alfa=std::asin(box1Size.getZ()/circleRadiuos); G4double externalYPartSize=circleRadiuos*(1-std::cos(alfa)); box2Size.set(box1Size.getX(), externalYPartSize/2., box1Size.getZ()); // single leaf G4Box *box1Leaf = new G4Box("LeafBox1", box1Size.getX(), box1Size.getY(), box1Size.getZ()); G4Box *box2leaf = new G4Box("LeafBox2", box2Size.getX(), box2Size.getY(), box2Size.getZ()); G4Tubs *cyLeaf = new G4Tubs("LeafCylinder", 0, circleRadiuos, box1Size.getX(),0,CLHEP::twopi); G4RotationMatrix *rm=new G4RotationMatrix(); rm->rotateY(90.*deg); G4DisplacedSolid *cyLeaf90Y=new G4DisplacedSolid("LeafCylinder90Y",cyLeaf,rm,G4ThreeVector(0,0,0)); G4DisplacedSolid *cyLeafTr=new G4DisplacedSolid("LeafCylinderTr",cyLeaf90Y,0,G4ThreeVector(0., -(circleRadiuos-box2Size.getY()), 0.)); G4IntersectionSolid* bx2CyleafTr =new G4IntersectionSolid("bx2CyleafTr", box2leaf, cyLeafTr); G4DisplacedSolid *bx2CyleafTrTr=new G4DisplacedSolid("bx2CyleafTrTr",bx2CyleafTr,0,G4ThreeVector(0., +(box1Size.getY()+box2Size.getY()-.1), 0.)); // -.1 to guarantee the volumes touch each other G4UnionSolid *leafSolidA = new G4UnionSolid("SingleLeafA", bx2CyleafTrTr, box1Leaf); rm = new G4RotationMatrix(); rm -> rotateZ(180.*deg); G4DisplacedSolid *leafSolidB = new G4DisplacedSolid("SingleLeafB", leafSolidA, rm, G4ThreeVector(0,0,0)); G4ThreeVector halfSize; halfSize.set(0., box2Size.getY()*2.-.1,0.); halfSize+=box1Size; G4LogicalVolume *leafLVA = new G4LogicalVolume(leafSolidA, W, "leafSolidALV", 0, 0, 0); G4LogicalVolume *leafLVB = new G4LogicalVolume(leafSolidB, W, "leafSolidBLV", 0, 0, 0); simpleAlSVisAtt = new G4VisAttributes(G4Colour::Green()); simpleAlSVisAtt->SetVisibility(true); leafLVA->SetVisAttributes(simpleAlSVisAtt); leafLVA->SetRegion(regVol); regVol->AddRootLogicalVolume(leafLVA); simpleAlSVisAtt= new G4VisAttributes(G4Colour::Green()); simpleAlSVisAtt->SetVisibility(true); leafLVB->SetVisAttributes(simpleAlSVisAtt); leafLVB->SetRegion(regVol); regVol->AddRootLogicalVolume(leafLVB); G4String PVname; // G4VPhysicalVolume *leafPhys; int i; int j = 0; G4ThreeVector centre; centre= centreStart + G4ThreeVector(-38.*halfSize.getX(), 0.,0.); for (i = 1; i < (int)vec_leavesA.size(); i++) { sprintf(a,"%d", i); iName = (G4String)a; PVname = "leafA"+iName; centre.setX(centre.getX()+halfSize.getX()*2.); centre.setY(-halfSize.getY()-vec_leavesA[i]); new G4PVPlacement(0, centre, PVname, leafLVA, PVWorld, false, i); j++; } centre=centreStart+G4ThreeVector(-38.*halfSize.getX(), 0.,0.); for (i = 1; i < (int)vec_leavesB.size(); i++) { sprintf(a,"%d", i); iName = (G4String)a; PVname = "leafB"+iName; centre.setX(centre.getX()+halfSize.getX()*2.); centre.setY(+halfSize.getY()+vec_leavesB[i]); new G4PVPlacement(0, centre, PVname, leafLVB, PVWorld, false, i); j++; } bCreated = true; return bCreated; }