diff --git a/NPSimulation/AnnularS1/AnnularS1.cc b/NPSimulation/AnnularS1/AnnularS1.cc index 3020106feab08dcd42cdc226d947e4ee68f46787..1bbfe1b94b07f5077fd68aeb216f75119bcae638 100644 --- a/NPSimulation/AnnularS1/AnnularS1.cc +++ b/NPSimulation/AnnularS1/AnnularS1.cc @@ -39,7 +39,8 @@ #include "G4Transform3D.hh" #include "G4PVPlacement.hh" #include "G4PVDivision.hh" - +#include "G4ExtrudedSolid.hh" +#include "G4SubtractionSolid.hh" // G4 sensitive #include "G4SDManager.hh" #include "G4MultiFunctionalDetector.hh" @@ -102,20 +103,7 @@ void AnnularS1::VolumeMaker(G4int DetecNumber, G4double density = 0. , a = 0, z = 0 ; G4int ncomponents = 0, natoms = 0 ; - G4Element* H = new G4Element("Hydrogen" , symbol = "H" , z = 1 , a = 1.01 * g / mole); - G4Element* C = new G4Element("Carbon" , symbol = "C" , z = 6 , a = 12.011 * g / mole); - G4Element* N = new G4Element("Nitrogen" , symbol = "N" , z = 7 , a = 14.01 * g / mole); - G4Element* O = new G4Element("Oxigen" , symbol = "O" , z = 8 , a = 16.00 * g / mole); - G4Element* I = new G4Element("Iode" , symbol = "I" , z = 53 , a = 126.9 * g / mole); - G4Element* Cs = new G4Element("Cesium" , symbol = "Cs" , z = 55 , a = 132.9 * g / mole); - - G4Element* Co = new G4Element("Cobalt" , symbol = "Co" , z = 27 , a = 58.933 * g / mole); - G4Element* Cr = new G4Element("Cromium" , symbol = "Cr" , z = 24 , a = 51.996 * g / mole); - G4Element* Ni = new G4Element("Nickel" , symbol = "Ni" , z = 28 , a = 58.69 * g / mole); - G4Element* Fe = new G4Element("Iron" , symbol = "Fe" , z = 26 , a = 55.847 * g / mole); - G4Element* W = new G4Element("Tungsten" , symbol = "W" , z = 74 , a = 183.5 * g / mole); - - //////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////// /////////////////Material Definition /////////////////////////// //////////////////////////////////////////////////////////////// // Si @@ -131,6 +119,8 @@ void AnnularS1::VolumeMaker(G4int DetecNumber, // Vacuum density = 0.000000001 * mg / cm3; G4Material* Vacuum = new G4Material("Vacuum", density, ncomponents = 2); + G4Element* N = new G4Element("Nitrogen" , symbol = "N" , z = 7 , a = 14.01 * g / mole); + G4Element* O = new G4Element("Oxigen" , symbol = "O" , z = 8 , a = 16.00 * g / mole); Vacuum->AddElement(N, .7); Vacuum->AddElement(O, .3); //////////////////////////////////////////////////////////////// @@ -139,14 +129,22 @@ void AnnularS1::VolumeMaker(G4int DetecNumber, // Name of the module G4String Name = "S1Annular" + DetectorNumber; - // Definition of the volume containing the sensitive detector - G4Tubs* solidAnnularS1 = new G4Tubs(Name, - Rmin, - Rmax, - Length/2, - 0*deg, - 360*deg); + // Building the PCB + // The PCB is a simple extruded volume from 8reference point + vector<G4TwoVector> polygon; + for(unsigned int i = 0 ; i < 8 ; i++){ + G4TwoVector Point(PCBPointsX[i],PCBPointsY[i]); + polygon.push_back(Point); + } + + // Mast volume containing all the detector + G4ExtrudedSolid* solidAnnularS1 = new G4ExtrudedSolid(Name, + polygon, + PCBThickness*0.5, + G4TwoVector(0,0),1, + G4TwoVector(0,0),1); + // Definition of the volume containing the sensitive detector G4LogicalVolume* logicAnnularS1 = new G4LogicalVolume(solidAnnularS1, Vacuum, Name, 0, 0, 0); new G4PVPlacement(G4Transform3D(*rotation, position), @@ -155,49 +153,128 @@ void AnnularS1::VolumeMaker(G4int DetecNumber, world, false, 0); - + logicAnnularS1->SetVisAttributes(G4VisAttributes::Invisible); + // PCB Base + G4ExtrudedSolid* solidPCBBase = new G4ExtrudedSolid("PCBBase", + polygon, + PCBThickness*0.5, + G4TwoVector(0,0),1, + G4TwoVector(0,0),1); + + // Wafer Shape to be substracted to the PCB + G4Tubs* solidWaferShapeBase = new G4Tubs("WaferShape", + WaferInnerRadius, + WaferOutterRadius, + PCBThickness, + 0*deg, + 360*deg); +G4RotationMatrix* norotation = new G4RotationMatrix(); + + G4RotationMatrix* cutrotation = new G4RotationMatrix(G4ThreeVector(0,0,1),45*deg); + G4ThreeVector cutposition1(80*mm+WaferRCut,0,0); cutposition1.setPhi(45*deg); + G4Transform3D transform1(*cutrotation,cutposition1); + + G4Box* solidCutout = new G4Box("cuttout",80*mm,80*mm,80*mm); + + G4SubtractionSolid* solidWaferShape1 = new G4SubtractionSolid("WaferShape1", + solidWaferShapeBase, + solidCutout, + transform1); + + + G4ThreeVector cutposition2(-80*mm-WaferRCut,0,0); cutposition2.setPhi(-135*deg); + G4Transform3D transform2(*cutrotation,cutposition2); + G4SubtractionSolid* solidWaferShape = new G4SubtractionSolid("WaferShape", + solidWaferShape1, + solidCutout, + transform2); + + + // PCB final + G4SubtractionSolid* solidPCB1 = new G4SubtractionSolid("AnnularS1_PCB1", + solidPCBBase, + solidWaferShape); + + G4Tubs* solidTub = + new G4Tubs("central_hole",0,PCBInnerRadius,PCBThickness,0,360*deg); + G4SubtractionSolid* solidPCB = new G4SubtractionSolid("AnnularS1_PCB", + solidPCB1, + solidTub); + + + G4LogicalVolume* logicPCB = new G4LogicalVolume(solidPCB, Vacuum, "AnnularS1_PCB", 0, 0, 0); + + new G4PVPlacement(G4Transform3D(*norotation, G4ThreeVector()), + logicPCB, + "AnnularS1_PCB", + logicAnnularS1, + false, + 0); + + G4VisAttributes* PCBVisAtt = new G4VisAttributes(G4Colour(0.2, 0.5, 0.2)) ; + logicPCB->SetVisAttributes(PCBVisAtt); + + + // Wafer itself + G4Tubs* solidWaferBase = new G4Tubs("Wafer", + WaferInnerRadius, + WaferOutterRadius, + WaferThickness, + 0*deg, + 360*deg); + + G4SubtractionSolid* solidWafer1 = new G4SubtractionSolid("Wafer1", + solidWaferBase, + solidCutout, + transform1); + + G4SubtractionSolid* solidWafer = new G4SubtractionSolid("Wafer", + solidWafer1, + solidCutout, + transform2); + + G4LogicalVolume* logicWafer = new G4LogicalVolume(solidWafer, Silicon, "AnnularS1_Wafer", 0, 0, 0); + new G4PVPlacement(G4Transform3D(*norotation, G4ThreeVector()), + logicWafer, + "AnnularS1_Wafer", + logicAnnularS1, + false, + 0); - // Aluminium dead layers - G4ThreeVector positionAluStripFront = G4ThreeVector(0, 0, AluStripFront_PosZ); - G4ThreeVector positionAluStripBack = G4ThreeVector(0, 0, AluStripBack_PosZ); - - G4Tubs* solidAluStrip = new G4Tubs("AluBox", - FirstStageRmin, - FirstStageRmax, - AluStripThickness/2, - 0*deg, - 360*deg); - - G4LogicalVolume* logicAluStrip = new G4LogicalVolume(solidAluStrip, Aluminium, "logicAluStrip", 0, 0, 0); - - new G4PVPlacement(0, positionAluStripFront, logicAluStrip, Name + "_AluStripFront", logicAnnularS1, false, 0); - new G4PVPlacement(0, positionAluStripBack, logicAluStrip, Name + "_AluStripBack", logicAnnularS1, false, 0); - - logicAluStrip->SetVisAttributes(G4VisAttributes::Invisible); - - // Silicon detector itself - G4ThreeVector positionSilicon = G4ThreeVector(0, 0, Silicon_PosZ); - - G4Tubs* solidSilicon = new G4Tubs("solidSilicon", - FirstStageRmin, - FirstStageRmax, - FirstStageThickness/2, - 0*deg, - 360*deg); - - G4LogicalVolume* logicSilicon = new G4LogicalVolume(solidSilicon, Silicon, "logicSilicon", 0, 0, 0); - - new G4PVPlacement(0, positionSilicon, logicSilicon, Name + "_Silicon", logicAnnularS1, false, 0); - - // Set Silicon strip sensible - logicSilicon->SetSensitiveDetector(m_Scorer); - - ///Visualisation of Silicon Strip -// G4VisAttributes* SiliconVisAtt = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5)); - G4VisAttributes* SiliconVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)); - logicSilicon->SetVisAttributes(SiliconVisAtt); + G4VisAttributes* SiVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)) ; + logicWafer->SetVisAttributes(SiVisAtt); + + // Active Wafer + G4Tubs* solidActiveWaferBase = new G4Tubs("ActiveWafer", + ActiveWaferInnerRadius, + ActiveWaferOutterRadius, + WaferThickness, + 0*deg, + 360*deg); + + G4SubtractionSolid* solidActiveWafer1 = new G4SubtractionSolid("ActiveWafer1", + solidActiveWaferBase, + solidCutout, + transform1); + + G4SubtractionSolid* solidActiveWafer = new G4SubtractionSolid("ActiveWafer", + solidActiveWafer1, + solidCutout, + transform2); + + G4LogicalVolume* logicActiveWafer = new G4LogicalVolume(solidActiveWafer, Silicon, "AnnularS1_ActiveWafer", 0, 0, 0); + new G4PVPlacement(G4Transform3D(*norotation, G4ThreeVector()), + logicActiveWafer, + "AnnularS1_ActiveWafer", + logicWafer, + false, + 0); + logicActiveWafer->SetVisAttributes(SiVisAtt); + + // Set Silicon strip sensible + logicActiveWafer->SetSensitiveDetector(m_Scorer); } diff --git a/NPSimulation/AnnularS1/AnnularS1.hh b/NPSimulation/AnnularS1/AnnularS1.hh index 61aa963b3187eb5dce4f52f29c9cc2076554c1f5..8a68980118669f91fb9b7c522d2c44d3d7e7003c 100644 --- a/NPSimulation/AnnularS1/AnnularS1.hh +++ b/NPSimulation/AnnularS1/AnnularS1.hh @@ -117,30 +117,35 @@ namespace ANNULARS1 const G4double ResoFirstStage = 0 ;// = 52keV of Resolution // Unit is MeV/2.35 const G4double ResoSecondStage = 0.055 ;// = 130 keV of resolution // Unit is MeV/2.35 const G4double ResoThirdStage = 0 ;// = 100 keV of resolution // Unit is MeV/2.35 - const G4double ResoTimeGpd = 0.212765957 ;// = 500ps // Unit is ns/2.35 - const G4double ResoTimePPAC = 0.106382979 ;// = 250ps // Unit is ns/2.35 - - // Geometry - const G4double Rmin = 46/2*mm; - const G4double Rmax = 100/2*mm; - - // First stage + const G4double ResoTimeGpd = 0.212765957 ;// = 500 ps // Unit is ns/2.35 + const G4double ResoTimePPAC = 0.106382979 ;// = 250 ps // Unit is ns/2.35 + + // PCB + const G4double PCBPointsX[8]={-50,50,60,60,50,-50,-60,-60}; + const G4double PCBPointsY[8]={60,60,50,-50,-60,-60,-50,50}; + const G4double PCBThickness=2*mm; + const G4double PCBInnerRadius=20*mm; + // Wafer + const G4double WaferOutterRadius = 50*mm; + const G4double WaferInnerRadius = 23*mm; + const G4double WaferThickness = 500*micrometer; + const G4double WaferRCut = 45*mm; + const G4double ActiveWaferOutterRadius = 48*mm; + const G4double ActiveWaferInnerRadius = 24*mm; const G4double AluStripThickness = 0.4*micrometer; - const G4double FirstStageThickness = 500*micrometer; - const G4double FirstStageRmin = 48/2*mm; - const G4double FirstStageRmax = 96/2*mm; // Characteristics const G4int NbPhiStrips = 16; const G4int NbThetaStrips = 16; const G4int NbThetaQuadrant = 4; - const G4double Length = AluStripThickness*2+FirstStageThickness; + // total WaferLength + const G4double Length = AluStripThickness*2+WaferThickness; // Starting at the front and going in direction of third stage const G4double AluStripFront_PosZ = Length* -0.5 + 0.5*AluStripThickness; - const G4double Silicon_PosZ = AluStripFront_PosZ + 0.5*AluStripThickness + 0.5*FirstStageThickness; - const G4double AluStripBack_PosZ = Silicon_PosZ + 0.5*FirstStageThickness + 0.5*AluStripThickness; + const G4double Silicon_PosZ = AluStripFront_PosZ + 0.5*AluStripThickness + 0.5*WaferThickness; + const G4double AluStripBack_PosZ = Silicon_PosZ + 0.5*WaferThickness + 0.5*AluStripThickness; } #endif diff --git a/NPSimulation/AnnularS1/AnnularS1Scorers.cc b/NPSimulation/AnnularS1/AnnularS1Scorers.cc index 1ca06959870e0ae86c6efdf00afb8e5ae8ef5949..35c1a72fed830c981d2e256132897778ae3086c3 100644 --- a/NPSimulation/AnnularS1/AnnularS1Scorers.cc +++ b/NPSimulation/AnnularS1/AnnularS1Scorers.cc @@ -70,8 +70,8 @@ G4bool AnnularS1ScorerThetaStripNumber::ProcessHits(G4Step* aStep, G4TouchableHi // Theta strip pitch // Interstrip should be taken into account here. To be done - G4double ThetaStripPitch = (FirstStageRmax - FirstStageRmin) / NbThetaStrips; - G4double dummy = (r - FirstStageRmin); + G4double ThetaStripPitch = (ActiveWaferOutterRadius - ActiveWaferInnerRadius) / NbThetaStrips; + G4double dummy = (r - ActiveWaferInnerRadius); if (dummy < 0 && fabs(dummy) < 1e-6) dummy *= -1; G4double ThetaStripNumber = floor(dummy / ThetaStripPitch); ThetaStripNumber += PhiQuadrantNumber*NbThetaStrips;