258 lines
8.8 KiB
C++
258 lines
8.8 KiB
C++
//
|
|
// ********************************************************************
|
|
// * 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. *
|
|
// ********************************************************************
|
|
//
|
|
// ====================================================================
|
|
// H02DetectorConstruction.cc
|
|
// $Id: H02DetectorConstruction.cc,v 1.5 2006/06/29 17:10:18 gunter Exp $
|
|
//
|
|
// ====================================================================
|
|
#include "H02DetectorConstruction.hh"
|
|
|
|
#include "G4Element.hh"
|
|
#include "G4Material.hh"
|
|
|
|
#include "G4LogicalVolume.hh"
|
|
#include "G4PVPlacement.hh"
|
|
#include "G4VisAttributes.hh"
|
|
#include "G4Tubs.hh"
|
|
#include "G4Box.hh"
|
|
|
|
#include "G4SDManager.hh"
|
|
#include "H02MuonSD.hh"
|
|
|
|
// for magnetic field
|
|
#include "G4FieldManager.hh"
|
|
#include "G4TransportationManager.hh"
|
|
#include "G4ChordFinder.hh"
|
|
#include "H02Field.hh"
|
|
|
|
// ====================================================================
|
|
//
|
|
// constants (detector parameters)
|
|
//
|
|
// ====================================================================
|
|
// [experimental hall]
|
|
static const G4double R_EXPHALL= 5.*m;
|
|
static const G4double DZ_EXPHALL= 10.*m;
|
|
|
|
// [calorimeter]
|
|
static const G4double RIN_BARREL_CAL= 2.*m;
|
|
static const G4double ROUT_BARREL_CAL= 3.*m;
|
|
static const G4double DZ_BARREL_CAL= 5.*m;
|
|
|
|
static const G4double RIN_ENDCAP_CAL= 1.*m;
|
|
static const G4double ROUT_ENDCAP_CAL= 3.*m;
|
|
static const G4double DZ_ENDCAP_CAL= 0.5*m;
|
|
|
|
// [muon system]
|
|
static const G4double RIN_BARREL_MUON= 4.3*m;
|
|
static const G4double ROUT_BARREL_MUON= 4.5*m;
|
|
static const G4double DX_BARREL_MUON= RIN_BARREL_MUON*std::cos(67.5*deg)-5.*cm;
|
|
static const G4double DY_BARREL_MUON= 10.*cm;
|
|
static const G4double DZ_BARREL_MUON= 7.*m;
|
|
|
|
static const G4double RIN_ENDCAP_MUON= 1.*m;
|
|
static const G4double ROUT_ENDCAP_MUON= 4.5*m;
|
|
static const G4double DZ_ENDCAP_MUON= 10.*cm;
|
|
|
|
// ====================================================================
|
|
//
|
|
// class description
|
|
//
|
|
// ====================================================================
|
|
|
|
////////////////////////////////////////////////
|
|
H02DetectorConstruction::H02DetectorConstruction()
|
|
////////////////////////////////////////////////
|
|
{
|
|
}
|
|
|
|
/////////////////////////////////////////////////
|
|
H02DetectorConstruction::~H02DetectorConstruction()
|
|
/////////////////////////////////////////////////
|
|
{
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////
|
|
G4VPhysicalVolume* H02DetectorConstruction::Construct()
|
|
//////////////////////////////////////////////////////
|
|
{
|
|
// ==============================================================
|
|
// Materials
|
|
// ==============================================================
|
|
|
|
G4double a, iz, z, density;
|
|
G4String name, symbol;
|
|
G4int nel;
|
|
|
|
a= 1.01*g/mole;
|
|
G4Element* elH= new G4Element(name="Hydrogen", symbol="H", iz=1., a);
|
|
|
|
a= 12.01*g/mole;
|
|
G4Element* elC= new G4Element(name="Carbon", symbol="C", iz=6., a);
|
|
|
|
a= 14.01*g/mole;
|
|
G4Element* elN= new G4Element(name="Nitrogen", symbol="N", iz=7., a);
|
|
|
|
a = 16.00*g/mole;
|
|
G4Element* elO= new G4Element(name="Oxygen", symbol="O", iz=8., a);
|
|
|
|
density= 1.29e-03*g/cm3;
|
|
G4Material* Air= new G4Material(name="Air", density, nel=2);
|
|
Air-> AddElement(elN, .7);
|
|
Air-> AddElement(elO, .3);
|
|
|
|
a= 207.19*g/mole;
|
|
density= 11.35*g/cm3;
|
|
G4Material* Lead= new G4Material(name="Lead", z=82., a, density);
|
|
|
|
a= 39.95*g/mole;
|
|
density= 1.782e-03*g/cm3;
|
|
G4Material* Ar= new G4Material(name="ArgonGas", z=18., a, density);
|
|
|
|
density= 1.032*g/cm3;
|
|
G4Material* Scinti= new G4Material(name="Scintillator", density, nel=2);
|
|
Scinti-> AddElement(elC, 9);
|
|
Scinti-> AddElement(elH, 10);
|
|
|
|
|
|
// ==============================================================
|
|
// Experimental Hall (world)
|
|
// ==============================================================
|
|
G4Tubs* expHallSolid=
|
|
new G4Tubs("EXP_HALL", 0., R_EXPHALL, DZ_EXPHALL, 0., 360.*deg);
|
|
|
|
G4LogicalVolume* expHallLV=
|
|
new G4LogicalVolume(expHallSolid, Air, "EXP_HALL_LV");
|
|
|
|
// visualization attributes
|
|
G4VisAttributes* expHallVisAtt=
|
|
new G4VisAttributes(false, G4Colour(1., 1., 1.));
|
|
//expHallVisAtt-> SetForceWireframe(TRUE);
|
|
expHallLV-> SetVisAttributes(expHallVisAtt);
|
|
|
|
G4PVPlacement* expHall= new G4PVPlacement(0, G4ThreeVector(), "EXP_HALL_PV",
|
|
expHallLV, 0, FALSE, 0);
|
|
// ... MV, MANY, copy#
|
|
|
|
// ==============================================================
|
|
// each detector component
|
|
// ==============================================================
|
|
// calorimeter system
|
|
G4Tubs* barrelCalSolid=
|
|
new G4Tubs("BARREL_CAL", RIN_BARREL_CAL, ROUT_BARREL_CAL,
|
|
DZ_BARREL_CAL, 0., 360.*deg);
|
|
|
|
G4Tubs* endcapCalSolid=
|
|
new G4Tubs("ENDCAP_CAL", RIN_ENDCAP_CAL, ROUT_ENDCAP_CAL,
|
|
DZ_ENDCAP_CAL, 0., 360.*deg);
|
|
|
|
G4LogicalVolume* barrelCalLV=
|
|
new G4LogicalVolume(barrelCalSolid, Lead, "BARREL_CAL_LV");
|
|
|
|
G4LogicalVolume* endcapCalLV=
|
|
new G4LogicalVolume(endcapCalSolid, Lead, "ENDCAP_CAL_LV");
|
|
|
|
G4VisAttributes* calVisAtt=
|
|
new G4VisAttributes(true, G4Colour(0., 1., 1.));
|
|
barrelCalLV-> SetVisAttributes(calVisAtt);
|
|
endcapCalLV-> SetVisAttributes(calVisAtt);
|
|
|
|
// G4PVPlacement* barrelCal=
|
|
new G4PVPlacement(0, G4ThreeVector(), "BARREL_CAL_PV",
|
|
barrelCalLV, expHall, FALSE, 0);
|
|
|
|
G4ThreeVector posCal(0.,0.,6.*m);
|
|
// G4PVPlacement* endcapCal1=
|
|
new G4PVPlacement(0, posCal, "ENDCAP_CAL_PV",
|
|
endcapCalLV, expHall, FALSE, 0);
|
|
|
|
//G4PVPlacement* endcapCal2=
|
|
new G4PVPlacement(0, -posCal, "ENDCAP_CAL_PV",
|
|
endcapCalLV, expHall, FALSE, 1);
|
|
|
|
// muon system
|
|
G4Box* barrelMuonSolid= new G4Box("BARREL_MUON", DX_BARREL_MUON,
|
|
DY_BARREL_MUON, DZ_BARREL_MUON);
|
|
G4Tubs* endcapMuonSolid=
|
|
new G4Tubs("ENDCAP_MUON", RIN_ENDCAP_MUON, ROUT_ENDCAP_MUON,
|
|
DZ_ENDCAP_MUON, 0., 360.*deg);
|
|
|
|
G4LogicalVolume* barrelMuonLV=
|
|
new G4LogicalVolume(barrelMuonSolid, Ar, "BARREL_MUON_LV");
|
|
|
|
G4LogicalVolume* endcapMuonLV=
|
|
new G4LogicalVolume(endcapMuonSolid, Ar, "ENDCAP_MUON_LV");
|
|
|
|
G4VisAttributes* muonVisAtt=
|
|
new G4VisAttributes(true, G4Colour(1., 1., 0.5));
|
|
//muonVisAtt-> SetForceWireframe(TRUE);
|
|
barrelMuonLV-> SetVisAttributes(muonVisAtt);
|
|
endcapMuonLV-> SetVisAttributes(muonVisAtt);
|
|
|
|
const G4double dangle= 45.*deg;
|
|
G4ThreeVector posM(RIN_BARREL_MUON+DY_BARREL_MUON/2., 0., 0.);
|
|
G4RotationMatrix* rotM= new G4RotationMatrix;
|
|
rotM->rotateZ(90.*deg);
|
|
|
|
for (G4int k=0; k<8; k++) {
|
|
G4Transform3D transformM(*rotM, posM);
|
|
new G4PVPlacement(transformM, "BARREL_MUON_PV",
|
|
barrelMuonLV, expHall, FALSE, k);
|
|
rotM->rotateZ(dangle);
|
|
posM.rotateZ(dangle);
|
|
}
|
|
|
|
G4ThreeVector posMuon(0.,0.,8.*m);
|
|
// G4PVPlacement* endcapMuon1=
|
|
new G4PVPlacement(0, posMuon, "ENDCAP_MUON_PV",
|
|
endcapMuonLV, expHall, FALSE, 0);
|
|
|
|
// G4PVPlacement* endcapMuon2=
|
|
new G4PVPlacement(0, -posMuon, "ENDCAP_MUON_PV",
|
|
endcapMuonLV, expHall, FALSE, 1);
|
|
|
|
|
|
// sensitive Detectors
|
|
G4SDManager* SDman= G4SDManager::GetSDMpointer();
|
|
|
|
G4String muonSDname= "/mydet/muon";
|
|
H02MuonSD* muonSD= new H02MuonSD(muonSDname);
|
|
SDman-> AddNewDetector(muonSD);
|
|
barrelMuonLV-> SetSensitiveDetector(muonSD);
|
|
endcapMuonLV-> SetSensitiveDetector(muonSD);
|
|
|
|
// magnetic field
|
|
H02Field* myfield = new H02Field;
|
|
G4FieldManager* fieldMgr=
|
|
G4TransportationManager::GetTransportationManager()-> GetFieldManager();
|
|
fieldMgr-> SetDetectorField(myfield);
|
|
fieldMgr-> CreateChordFinder(myfield);
|
|
|
|
return expHall;
|
|
}
|
|
|