80 fWorldLogic(0),fXtalLogic(0){
146 fWorldSolid =
new G4Box(
"World",
166 for(
unsigned int i1=0;i1<3;i1++){
172 fSSDXtalDistance[i1]);
189 fSSDXtalDistance[0] + std::fabs(fSSDXtalDistance[1] -
190 fSSDXtalDistance[0])/2.);
193 std::fabs(fSSDXtalDistance[1] - fSSDXtalDistance[0]) -
194 2. * (fSSDSize.
z()/2.) - 2. * fBeamPipeFromSiSDDistance;
197 ConstructBeamPipe(fBeamPipeA0Length);
210 std::fabs(fSSDXtalDistance[2]) - 2. * (fSSDSize.
z()/2.) -
211 2. * fBeamPipeFromSiSDDistance;
214 ConstructBeamPipe(fBeamPipeA1Length);
224 #ifndef G4MULTITHREADED
229 for(
unsigned int i1=0;i1<3;i1++){
235 ConstructXtalTarget();
238 return fWorldPhysical;
243 #ifdef G4MULTITHREADED
244 void ExExChDetectorConstruction::ConstructSDandField(){
249 for(
unsigned int i1=0;i1<3;i1++){
254 void ExExChDetectorConstruction::ConstructSDandField(){
268 G4Box* fSSDBoxEnvelopeSolid =
269 new G4Box(
"SiSDBoxEnvelope",
272 fSSDBoxSize.
z()/2. + fFoilThickness);
293 fSSDBoxSize.
x()/2. - fSSDBoxThickness/2.,
294 fSSDBoxSize.
y()/2. - fSSDBoxThickness/2.,
295 fSSDBoxSize.
z()/2. - fSSDBoxThickness/2.);
298 fSSDSize.
x()/2. + fSSDBoxThickness/2.,
299 fSSDSize.
y()/2. + fSSDBoxThickness/2.,
307 G4Box* fSSDBoxFoilSolid =
new G4Box(
"SSDBoxFoil",
360 fSSDLogic[copyNo],
"SiSD",
361 fSSDBoxEnvelopeLogic,
366 fSSDBoxLogic,
"SiSDBox",
367 fSSDBoxEnvelopeLogic,
373 fSSDBoxInternalLogic,
"SiSDBox",
374 fSSDBoxEnvelopeLogic,
381 (fSSDBoxSize.
z()/2. - fFoilThickness/2.)),
382 fSSDBoxFoilLogic,
"SiSDBoxFoil",
383 fSSDBoxEnvelopeLogic,
390 -(fSSDBoxSize.
z()/2. - fFoilThickness/2.)),
391 fSSDBoxFoilLogic,
"SiSDBoxFoil",
392 fSSDBoxEnvelopeLogic,
396 return fSSDBoxEnvelopeLogic;
430 G4int ncomponents_SS =6;
434 new G4Material(
"StainlessSteel", density_SS, ncomponents_SS);
435 StainlessSteel->
AddElement(elC, fractionmass=0.001);
436 StainlessSteel->
AddElement(elSi, fractionmass=0.007);
437 StainlessSteel->
AddElement(elCr, fractionmass=0.18);
438 StainlessSteel->
AddElement(elMn, fractionmass=0.01);
439 StainlessSteel->
AddElement(elFe, fractionmass=0.712);
440 StainlessSteel->
AddElement(elNi, fractionmass=0.09);
455 G4Tubs* fBeamPipeEnvelopeSolid =
456 new G4Tubs(
"BeamPipeEnvelope",
458 fBeamPipeRadius + fBeamPipeThickness,
459 length * 0.5 + fMylarThickness * 0.5 * 4.,
471 fBeamPipeRadius + fBeamPipeThickness,
483 fBeamPipeEnvelopeLogic,
488 G4Tubs* fBeamPipeInsideSolid =
new G4Tubs(
"BeamPipeInside",
501 fBeamPipeInsideLogic,
503 fBeamPipeEnvelopeLogic,
508 G4Tubs* fBeamPipeMylarSolid =
509 new G4Tubs(
"BeamPipeMylar",
511 fBeamPipeRadius + fBeamPipeThickness,
512 fMylarThickness * 0.5,
524 +(length + fMylarThickness * 2.) / 2.),
527 fBeamPipeEnvelopeLogic,
534 -(length + fMylarThickness * 2.) / 2.),
537 fBeamPipeEnvelopeLogic,
541 return fBeamPipeEnvelopeLogic;
546 void ExExChDetectorConstruction::ConstructXtalTarget(){
547 if(fXtalCurvatureRadius.
x() != 0.){
548 double fXtalAngleOut =
549 fXtalAngle.
y() + fXtalSize.
z()/fXtalCurvatureRadius.
x();
550 fXtalSolid =
new G4Tubs(
"Target",
551 fXtalCurvatureRadius.
x() - fXtalSize.
x()/2,
552 fXtalCurvatureRadius.
x() + fXtalSize.
x()/2,
558 fXtalSolid =
new G4Box(
"Target",
569 if(fXtalCurvatureRadius.
x() != 0.){
571 vRotationMatrix->
rotateY(fXtalAngle.
y());
572 vRotationMatrix->
rotateZ(fXtalAngle.
z());
582 vRotationMatrix->
rotateX(fXtalAngle.
x());
583 vRotationMatrix->
rotateY(fXtalAngle.
y());
584 vRotationMatrix->
rotateZ(fXtalAngle.
z());
598 double vScatteringConstant =
615 myCell->
SetSize(fXtalCellSize);
637 GetXLatticeManager()->GetXPhysicalLattice(fXtalPhysical)
654 if (vMaterial && vMaterial != fXtalMaterial) {
655 G4cout <<
"DetectorConstructor::SetXtalMaterial() - New Xtal Material: "
657 fXtalMaterial = vMaterial;
669 return fXtalMaterial->
GetName();
677 if(fXtalCurvatureRadius != cr) {
679 fXtalCurvatureRadius = cr;
686 if(fXtalSize != size) {
695 if(fXtalAngle != angle) {
704 if(fXtalCellSize != cellsize) {
706 fXtalCellSize = cellsize;
713 if(fXtalMiller != miller) {
715 fXtalMiller = miller;
723 if(fXtalCellAngle != cellangle) {
725 fXtalCellAngle = cellangle;
733 if(fXtalTVA != thermvibr) {
735 fXtalTVA = thermvibr;
void GeometryHasBeenModified(G4bool prop=true)
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
Definition of the XCrystalCharacteristicArray class.
void SetThermalVibrationAmplitude(G4double)
static XLatticeManager3 * GetXLatticeManager()
CLHEP::Hep3Vector G4ThreeVector
void SetXtalMiller(G4ThreeVector)
HepRotation & rotateX(double delta)
CLHEP::HepRotation G4RotationMatrix
void SetXtalCellSize(G4ThreeVector)
Definition of the XLogicalBase class.
void SetSize(G4ThreeVector)
std::vector< ExP01TrackerHit * > a
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
Definition of the XLatticeManager3 class.
const G4String & GetName() const
static G4double angle[DIM]
void SetScatteringConstant(G4double)
HepRotation & rotateY(double delta)
~ExExChDetectorConstruction()
Definition of the XLogicalAtomicLatticeDiamond class.
const XML_Char int const XML_Char int const XML_Char * base
static G4NistManager * Instance()
void SetForceSolid(G4bool=true)
static constexpr double g
G4String GetXtalMaterial()
void SetUnitCell(XUnitCell *)
static constexpr double centimeter
G4GLOB_DLL std::ostream G4cout
static constexpr double meter
void PhysicsHasBeenModified()
Definition of the XCrystalPlanarMoliereElectronDensity class.
Definition of the XCrystalIntegratedDensityPlanar class.
void SetXtalAngle(G4ThreeVector)
static constexpr double millimeter
static constexpr double micrometer
void SetXtalSize(G4ThreeVector)
Definition of the XCrystalPlanarMoliereTempPotential class.
Definition of the XCrystalPlanarMoliereElectricField class.
void AddBase(XLogicalBase *)
void SetXtalCurvatureRadius(G4ThreeVector)
Definition of the ExExChSensitiveDetector class.
void AddNewDetector(G4VSensitiveDetector *aSD)
bool RegisterLattice(XPhysicalLattice *)
static G4RunManager * GetRunManager()
static constexpr double deg
void SetMillerOrientation(int, int, int)
void SetXtalCellAngle(G4ThreeVector)
void SetCurvatureRadius(G4ThreeVector)
void SetLatticeOrientation(G4double, G4double)
static constexpr double bar
Definition of the XCrystalPlanarNucleiDensity class.
static G4SDManager * GetSDMpointer()
void SetXtalMaterial(const G4String &name)
Definition of the XLogicalAtomicLattice class.
static constexpr double universe_mean_density
HepRotation & rotateZ(double delta)
void SetXtalThermalVibrationAmplitude(G4double)
static constexpr double second
ExExChDetectorConstruction()
void AddElement(G4Element *element, G4int nAtoms)
Definition of the XCrystalPlanarMolierePotential class.
static constexpr double mole
G4Element * FindOrBuildElement(G4int Z, G4bool isotopes=true)
void SetMaterial(G4Material *pMaterial)
Definition of the XUnitCell class.
G4VPhysicalVolume * Construct()
void SetVisAttributes(const G4VisAttributes *pVA)
void SetSensitiveDetector(G4VSensitiveDetector *pSDetector)
Definition of the XCrystalIntegratedDensityHub class.
static constexpr double kelvin
static constexpr double pi
static constexpr double angstrom
static constexpr double cm3
Definition of the ExExChDetectorConstruction class.