Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // ------------------------------------------- 27 // -------------------------------------------------------------- 28 // GEANT 4 - ULTRA experiment 28 // GEANT 4 - ULTRA experiment example 29 // ------------------------------------------- 29 // -------------------------------------------------------------- 30 // 30 // 31 // Code developed by: 31 // Code developed by: 32 // B. Tome, M.C. Espirito-Santo, A. Trindade, << 32 // B. Tome, M.C. Espirito-Santo, A. Trindade, P. Rodrigues 33 // 33 // 34 // **************************************** 34 // **************************************************** 35 // * UltraFresnelLens.cc 35 // * UltraFresnelLens.cc 36 // **************************************** 36 // **************************************************** 37 // 37 // 38 // Class for definition of the Ultra Fresne << 38 // Class for definition of the Ultra Fresnel Lens. 39 // An UltraFresnelLens object is created i 39 // An UltraFresnelLens object is created in the UltraDetectorConstruction class. 40 // This class makes use of the UltraFresnel 40 // This class makes use of the UltraFresnelLensParameterisation class. 41 // The lens profile is define through the G << 41 // The lens profile is define through the GetSagita method. 42 // 42 // 43 #include <cmath> 43 #include <cmath> 44 #include "UltraFresnelLens.hh" 44 #include "UltraFresnelLens.hh" 45 #include "UltraFresnelLensParameterisation.hh" 45 #include "UltraFresnelLensParameterisation.hh" 46 46 47 #include "G4PhysicalConstants.hh" << 48 #include "G4SystemOfUnits.hh" << 49 #include "G4Material.hh" 47 #include "G4Material.hh" 50 #include "G4MaterialTable.hh" 48 #include "G4MaterialTable.hh" 51 #include "G4Tubs.hh" 49 #include "G4Tubs.hh" 52 #include "G4Cons.hh" 50 #include "G4Cons.hh" 53 #include "G4LogicalVolume.hh" 51 #include "G4LogicalVolume.hh" 54 #include "G4PVPlacement.hh" 52 #include "G4PVPlacement.hh" 55 #include "G4PVParameterised.hh" 53 #include "G4PVParameterised.hh" 56 #include "G4ThreeVector.hh" 54 #include "G4ThreeVector.hh" 57 #include "G4VisAttributes.hh" 55 #include "G4VisAttributes.hh" 58 56 59 UltraFresnelLens::UltraFresnelLens(G4double Di << 57 UltraFresnelLens::UltraFresnelLens( G4double Diameter, G4int nGrooves, G4Material* Material, G4VPhysicalVolume * MotherPV, G4ThreeVector Pos) 60 { 58 { 61 59 62 LensMaterial = Material ; 60 LensMaterial = Material ; 63 LensDiameter = Diameter ; 61 LensDiameter = Diameter ; 64 NumberOfGrooves = nGrooves; 62 NumberOfGrooves = nGrooves; 65 GrooveWidth = (Diameter/2.0)/nGrooves ; 63 GrooveWidth = (Diameter/2.0)/nGrooves ; 66 LensPosition = Pos ; 64 LensPosition = Pos ; 67 65 68 if( GrooveWidth <= 0 ){ 66 if( GrooveWidth <= 0 ){ 69 G4Exception("UltraFresnelLens::UltraFresnel << 67 G4Exception("UltraFresnelLens constructor: GrooveWidth<=0"); 70 "UltraFresnelLens constructor: Groove << 71 } 68 } 72 69 73 70 74 auto Rmin1 = (NumberOfGrooves-1)*(GrooveWidth << 71 G4double Rmin1 = (NumberOfGrooves-1)*(GrooveWidth) ; 75 auto Rmax1 = (NumberOfGrooves-0)*(GrooveWidth << 72 G4double Rmax1 = (NumberOfGrooves-0)*(GrooveWidth) ; 76 LensThickness = GetSagita(Rmax1)-GetSagita(R << 73 LensThickness = GetSagita(Rmax1)-GetSagita(Rmin1) ; // Height of the highest groove 77 74 78 BuildLens(MotherPV) ; 75 BuildLens(MotherPV) ; 79 76 80 } 77 } 81 78 82 79 83 UltraFresnelLens::~UltraFresnelLens( ) 80 UltraFresnelLens::~UltraFresnelLens( ) 84 {;} 81 {;} 85 82 86 //....oooOO0OOooo........oooOO0OOooo........oo 83 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 87 84 88 void UltraFresnelLens::BuildLens(G4VPhysicalVo 85 void UltraFresnelLens::BuildLens(G4VPhysicalVolume *MotherPV){ 89 86 90 auto StartPhi = 0.0 ; << 87 G4double StartPhi = 0.0 ; 91 auto DeltaPhi = twopi ; << 88 G4double DeltaPhi = twopi ; 92 89 93 auto LensMotherDz = LensThickness ; << 90 G4double LensMotherDz = LensThickness ; 94 91 95 92 96 auto LensMotherCylinder << 93 G4Tubs *LensMotherCylinder 97 = new G4Tubs("LensMotherCylinder",0.0*mm,L 94 = new G4Tubs("LensMotherCylinder",0.0*mm,LensDiameter/2.0,LensMotherDz/2.0,StartPhi,DeltaPhi); 98 95 99 auto LensMotherMaterial = MotherPV->GetLogical << 96 G4Material *LensMotherMaterial = MotherPV->GetLogicalVolume()->GetMaterial() ; 100 auto LensMotherLV << 97 G4LogicalVolume *LensMotherLV 101 = new G4LogicalVolume(LensMotherCylinder,L 98 = new G4LogicalVolume(LensMotherCylinder,LensMotherMaterial,"LensMotherLV",0,0,0); 102 auto LensMotherPV << 99 G4VPhysicalVolume *LensMotherPV 103 = new G4PVPlacement(0,LensPosition,"LensMo 100 = new G4PVPlacement(0,LensPosition,"LensMotherPV",LensMotherLV,MotherPV,false,0); 104 101 105 LensMotherLV->SetVisAttributes (G4VisAttribute << 102 LensMotherLV->SetVisAttributes (G4VisAttributes::Invisible); 106 103 107 104 108 auto solidGroove << 105 G4Cons *solidGroove 109 = new G4Cons("Groove",40.0*mm,50.0*mm,40.0*m 106 = new G4Cons("Groove",40.0*mm,50.0*mm,40.0*mm,40.001*mm,1.0*mm,StartPhi,DeltaPhi); 110 107 111 auto logicalGroove << 108 G4LogicalVolume *logicalGroove 112 = new G4LogicalVolume(solidGroove,LensMate 109 = new G4LogicalVolume(solidGroove,LensMaterial,"Groove_log",0,0,0); 113 110 114 auto FresnelLensParam = new UltraFresnelLensPa << 111 G4VPVParameterisation *FresnelLensParam = new UltraFresnelLensParameterisation(this); 115 112 116 LensPhysicalVolume = << 113 LensPhysicalVolume = 117 new G4PVParameterised("LensPV",logicalGroove, 114 new G4PVParameterised("LensPV",logicalGroove,LensMotherPV,kZAxis,NumberOfGrooves,FresnelLensParam) ; 118 115 119 } 116 } 120 117 121 //....oooOO0OOooo........oooOO0OOooo........oo 118 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 122 119 123 G4double UltraFresnelLens::GetSagita(G4double << 120 G4double UltraFresnelLens::GetSagita(G4double radius) 124 { 121 { 125 auto Conic = -1.0; << 122 126 auto Curvature = 0.00437636761488/mm ; << 123 G4double Conic = -1.0; 127 G4double Aspher[8] = {4.206739256e-05/(mm), << 124 G4double Curvature = 0.00437636761488/mm ; 128 9.6440152e-10/(mm3), << 125 G4double Aspher[8] = { 4.206739256e-05/(mm), 129 -1.4884317e-15/(mm2*mm3 << 126 9.6440152e-10/(mm3), >> 127 -1.4884317e-15/(mm2*mm3), 130 0.0/(mm*mm3*mm3), 128 0.0/(mm*mm3*mm3), 131 0.0/(mm3*mm3*mm3), 129 0.0/(mm3*mm3*mm3), 132 0.0/(mm2*mm3*mm3*mm3), 130 0.0/(mm2*mm3*mm3*mm3), 133 0.0/(mm*mm3*mm3*mm3*mm 131 0.0/(mm*mm3*mm3*mm3*mm3), 134 0.0/(mm*3*mm3*mm3*mm3* 132 0.0/(mm*3*mm3*mm3*mm3*mm3) 135 }; 133 }; 136 134 137 auto TotAspher = 0.0*mm ; << 135 G4double TotAspher = 0.0*mm ; 138 136 139 for(G4int k=1;k<9;k++){ 137 for(G4int k=1;k<9;k++){ 140 TotAspher += Aspher[k-1]*std::pow(radius,2 138 TotAspher += Aspher[k-1]*std::pow(radius,2*k) ; 141 } 139 } 142 140 143 auto ArgSqrt = 1.0-(1.0+Conic)*std::pow(Curv << 141 G4double ArgSqrt = 1.0-(1.0+Conic)*std::pow(Curvature,2)*std::pow(radius,2) ; 144 142 145 if (ArgSqrt < 0.0){ 143 if (ArgSqrt < 0.0){ 146 G4Exception("UltraFresnelLens::GetSagita() << 144 G4Exception("UltraFresnelLensParameterisation::Sagita: Square Root of <0 !"); 147 FatalException, << 148 "UltraFresnelLensParameterisation::Sagita: << 149 } 145 } 150 auto Sagita_value = Curvature*std::pow(radiu << 146 G4double Sagita_value = Curvature*std::pow(radius,2)/(1.0+std::sqrt(ArgSqrt)) + TotAspher; 151 147 152 return Sagita_value ; 148 return Sagita_value ; 153 149 154 << 150 155 } 151 } >> 152 >> 153 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 154 >> 155 156 156