Ejemplo n.º 1
0
    def __init__(self, parent, shift_z):
        nist = G4.G4NistManager.Instance()
        Vc = nist.FindOrBuildMaterial("G4_Galactic")
        Al = nist.FindOrBuildMaterial("G4_Al")
        Ge = nist.FindOrBuildMaterial("G4_Ge")
        Pg = nist.FindOrBuildMaterial("G4_PLEXIGLASS")
        Ml = nist.FindOrBuildMaterial("G4_MYLAR")
        Ai = nist.FindOrBuildMaterial("G4_AIR")
        A = 0.5 * 51.1 * mm  # Crystal Radius
        B = 72.9 * mm  # Crystal Length
        C = 0.5 * 8.8 * mm  # Hole Radius
        D = 64.0 * mm  # Hole Depth
        E = 0.5 * 8.8 * mm  # Nominal Hole End Radius
        F = 94. * mm  # CUP Length
        G = 3.0 * mm  # Top Gap between CUP and the Shell
        H1 = 0.03 * mm  # CUP Top Al Thickness
        H2 = 0.03 * mm  # CUP Top Maylar Thickness
        I = 1.0 * mm  # Shell Top Thickness
        J = 8.0 * mm  # Nominal Crystal End Radius
        K = 0.8 * mm  # CUP Walls Thickness
        L = 1.0 * mm  # Shell Walls Thickness
        M = 0.0003 * mm  # Outer Dead Layer Thickness
        N = 0.7 * mm  # Inner Dead Layer Thikness
        O = 3.0 * mm  # CUP Bottom Thickness
        P = 0.5 * 76.0 * mm  # Shell Radius
        Q = 120. * mm  # Shell Length
        Z = 0.0 * mm  # zero
        s, t = 0.0, 360.0 * deg  # start, turn

        # Detector Base
        base = G4.G4Tubs("base", Z, P, 0.5 * O, s, t)
        logBase = G4.G4LogicalVolume(base, Pg, "logBase")
        # Detector
        HPGe = G4.G4Tubs("HPGe", Z, P, 0.5 * Q, s, t)
        logHPGe = G4.G4LogicalVolume(HPGe, Vc, "logHPGe")
        # Making the Crystal shape
        crystal1 = G4.G4Tubs("cyl1", Z, A - J, 0.5 * B, s, t)
        crystal2 = G4.G4Tubs("cyl2", Z, A, 0.5 * (B - J), s, t)
        torroid1 = G4.G4Torus("tor1", Z, J, A - J, s, t)
        xyz = G4.G4ThreeVector(Z, Z, -0.5 * J)
        crystal3 = G4.G4UnionSolid("cry3", crystal1, crystal2, None, xyz)
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * B - J)
        crystal4 = G4.G4UnionSolid("cry4", crystal3, torroid1, None, xyz)
        # Making the Active Crystal shape
        activeCrystal1 = G4.G4Tubs("acyl1", Z, A - J, 0.5 * (B - M), s, t)
        activeCrystal2 = G4.G4Tubs("acyl2", Z, A - M, 0.5 * (B - J), s, t)
        activeTor1 = G4.G4Torus("activeTor1", Z, J - M, A - J, s, t)
        xyz = G4.G4ThreeVector(Z, Z, -0.5 * (J - M))
        activeCrystal3 = G4.G4UnionSolid("cry3", activeCrystal1,
                                         activeCrystal2, None, xyz)
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * (B - M) - J)
        activeCrystal4 = G4.G4UnionSolid("cry4", activeCrystal3, activeTor1,
                                         None, xyz)
        # Making the hole
        hole1 = G4.G4Tubs("hole1", Z, C, 0.5 * (D - C), s, t)
        hole2 = G4.G4Orb("hole2", C)
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * (D - C))
        hole = G4.G4UnionSolid("hole", hole1, hole2, None, xyz)
        # Making outer dead layer
        xyz = G4.G4ThreeVector(Z, Z, Z)
        outerDeadLayer = G4.G4SubtractionSolid("outerDeadLayer", crystal4,
                                               activeCrystal4, None, xyz)
        # Making the inner dead layer
        innerDead1 = G4.G4Tubs("innerDead1", Z, C + N, 0.5 * (D - C), s, t)
        innerDead2 = G4.G4Orb("innerDead2", C + N)
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * (D - C))
        innerDead3 = G4.G4UnionSolid("innerDead3", innerDead1, innerDead2,
                                     None, xyz)
        xyz = G4.G4ThreeVector(Z, Z, Z)
        innerDeadLayer = G4.G4SubtractionSolid("innerDeadLayer", innerDead3,
                                               hole, None, xyz)
        # Making final detector shape
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * (D - C) - 0.5 * (B - M))
        activeCrystal = G4.G4SubtractionSolid("activeCrystal", activeCrystal4,
                                              innerDead3, None, xyz)
        logOuterDead = G4.G4LogicalVolume(outerDeadLayer, Ge, "logOuterDead")
        logInnerDead = G4.G4LogicalVolume(innerDeadLayer, Ge, "logInnerDead")
        logActive = G4.G4LogicalVolume(activeCrystal, Ge, "logActive")
        # Mylar layer
        mylarLayer = G4.G4Tubs("mylarLayer", Z, K + A, 0.5 * H2, s, t)
        logMylar = G4.G4LogicalVolume(mylarLayer, Ml, "logMylar")
        # CUP
        CUP1 = G4.G4Tubs("CUP1", Z, K + A, 0.5 * F, s, t)
        CUP2 = G4.G4Tubs("CUP2", Z, A, 0.5 * (F - H1 - O), s, t)
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * (O - H1))
        CUP = G4.G4SubtractionSolid("CUP", CUP1, CUP2, None, xyz)
        logCUP = G4.G4LogicalVolume(CUP, Al, "logCUP")
        #detector shell
        shell1 = G4.G4Tubs("shell1", Z, P, 0.5 * Q, s, t)
        shell2 = G4.G4Tubs("shell2", Z, P - L, 0.5 * Q - L, s, t)
        xyz = G4.G4ThreeVector(Z, Z, Z)
        shell = G4.G4SubtractionSolid("shell", shell1, shell2, None, xyz)
        logShell = G4.G4LogicalVolume(shell, Al, "logShell")

        # Placement of all Elements
        xyz = G4.G4ThreeVector(Z, Z, -(I + G + F) - 0.5 * O + shift_z)
        G4.G4PVPlacement(None, xyz, logBase, "physBase", parent, False, 0)
        xyz = G4.G4ThreeVector(Z, Z, -0.5 * Q + shift_z)
        G4.G4PVPlacement(None, xyz, logHPGe, "physHPGe", parent, False, 0)
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * (Q - B) - I - G - H1)
        G4.G4PVPlacement(None, xyz, logOuterDead, "physOuterDead", logHPGe,
                         False, 0)
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * (Q + D - C) - I - G - H1 - B)
        G4.G4PVPlacement(None, xyz, logInnerDead, "physInnerDead", logHPGe,
                         False, 0)
        xyz = G4.G4ThreeVector(Z, Z, Z)
        G4.G4PVPlacement(None, xyz, logShell, "physShell", logHPGe, False, 0)
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * (Q + H2) - L - G)
        G4.G4PVPlacement(None, xyz, logMylar, "physMylar", logHPGe, False, 0)
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * (Q - F) - L - G)
        G4.G4PVPlacement(None, xyz, logCUP, "physCUP", logHPGe, False, 0)
        xyz = G4.G4ThreeVector(Z, Z, 0.5 * (Q - M - B) - L - G - H1)
        G4.G4PVPlacement(None, xyz, logActive, "physActive", logHPGe, False, 0)
        self.logical = logActive

        # Detector Visualization Attributes
        BaseVA = G4.G4VisAttributes(G4.G4Color(1.0, 1.0, 1.0, 1.0))
        BaseVA.SetForceSolid(True)
        logBase.SetVisAttributes(BaseVA)
        HPGeVA = G4.G4VisAttributes(G4.G4Color(1.0, 1.0, 0.0, 0.0))
        HPGeVA.SetForceSolid(True)
        logHPGe.SetVisAttributes(HPGeVA)
        ShellVA = G4.G4VisAttributes(G4.G4Color(1.0, 0.5, 0.9, 0.1))
        ShellVA.SetForceSolid(True)
        logShell.SetVisAttributes(ShellVA)
        CupVA = G4.G4VisAttributes(G4.G4Color(0.2, 1.0, 0.0, 0.1))
        CupVA.SetForceSolid(True)
        logCUP.SetVisAttributes(CupVA)
        MylarVA = G4.G4VisAttributes(G4.G4Color(0.2, 1.0, 0.0, 0.6))
        MylarVA.SetForceSolid(True)
        logMylar.SetVisAttributes(MylarVA)
        OutdlVA = G4.G4VisAttributes(G4.G4Color(0.9, 1.0, 0.0, 0.1))
        OutdlVA.SetForceSolid(True)
        logOuterDead.SetVisAttributes(OutdlVA)
        InndlVA = G4.G4VisAttributes(G4.G4Color(0.9, 1.0, 0.0, 0.1))
        InndlVA.SetForceSolid(True)
        logInnerDead.SetVisAttributes(InndlVA)
        CrystVA = G4.G4VisAttributes(G4.G4Color(0.8, 0.2, 0.8, 0.5))
        CrystVA.SetForceSolid(True)
        logActive.SetVisAttributes(CrystVA)