1416 lines
46 KiB
C++
1416 lines
46 KiB
C++
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//*
|
|
// LOW ENERGY MUON SPIN RELAXATION, ROTATION, RADIATION
|
|
//
|
|
// ID : LEMuSRDetectorConstruction.cc , v 1.0
|
|
// AUTHOR: Taofiq PARAISO
|
|
// DATE : 2004-06-24 16:33
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
//
|
|
// & &&&&&&&&&& &&&&&&& &&&&&&&&
|
|
// & & && && & &&
|
|
// & & & & & & &&
|
|
// & &&&&&&& & & &&&&&& &&&&&&&&
|
|
// & & & && & & &&
|
|
// & & && & & && && & &
|
|
// &&&&&&&&&& &&&&&&&&&& & &&&&& && &&&&&&& & &&
|
|
// &
|
|
// &
|
|
// &
|
|
// &
|
|
// DETECTOR CONSTRUCTION
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
|
|
// G4 GEOMETRIC FORMS CLASSES
|
|
|
|
#include "G4Tubs.hh"
|
|
#include "G4Box.hh"
|
|
#include "G4Trap.hh"
|
|
#include "G4Cons.hh"
|
|
#include "G4Sphere.hh"
|
|
#include "G4SubtractionSolid.hh"
|
|
#include "G4UnionSolid.hh"
|
|
#include "G4UnitsTable.hh"
|
|
|
|
// G4 VOLUME DEFINITION CLASSES
|
|
#include "G4LogicalVolume.hh"
|
|
#include "G4VPhysicalVolume.hh"
|
|
#include "G4PVReplica.hh"
|
|
#include "G4PVPlacement.hh"
|
|
#include "G4GeometryManager.hh"
|
|
#include "G4FieldManager.hh"
|
|
#include "G4PropagatorInField.hh"
|
|
#include "G4ChordFinder.hh"
|
|
#include "G4El_UsualEqRhs.hh"
|
|
#include "G4ClassicalRK4.hh"
|
|
#include "G4SimpleHeum.hh"
|
|
#include "G4SimpleRunge.hh"
|
|
#include "G4MagIntegratorStepper.hh"
|
|
#include "G4TransportationManager.hh"
|
|
#include "G4GeometryManager.hh"
|
|
#include "G4UnitsTable.hh"
|
|
//#include "G4RotationMatrix.hh"
|
|
|
|
// G4 CLASSES
|
|
#include "G4ios.hh"
|
|
#include <iomanip.h>
|
|
|
|
|
|
// HEADER
|
|
#include "LEMuSRDetectorConstruction.hh"
|
|
#include "LEMuSRDetectorMessenger.hh"
|
|
|
|
|
|
// process remove
|
|
#include "G4ParticleTable.hh"
|
|
#include "G4ParticleDefinition.hh"
|
|
#include "G4ParticleChange.hh"
|
|
#include "G4ProcessVector.hh"
|
|
#include "G4ProcessManager.hh"
|
|
#include "G4VProcess.hh"
|
|
|
|
// electric fieldmap
|
|
#include "LEMuSRElectricField.hh"
|
|
#include "LEMuSRElFieldMix.hh"
|
|
#include "LEMuSRElMagField.hh"
|
|
#include "G4ElectricField.hh"
|
|
#include "G4ElectroMagneticField.hh"
|
|
#include "G4EqMagElectricField.hh"
|
|
#include "G4El_MagEqRhs.hh"
|
|
#include "LEMuSRCryoField.hh"
|
|
#include "LEMuSRMag_SpinEqRhs.hh"
|
|
#include "LEMuSRElMag_SpinEqRhs.hh"
|
|
#include "LEMuSRMagneticField.hh"
|
|
#include "G4Mag_SpinEqRhs.hh"
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
|
|
|
|
// CONSTRUCTOR & DESTRUCTOR
|
|
LEMuSRDetectorConstruction::LEMuSRDetectorConstruction()
|
|
{
|
|
MaterialsDefinition ();
|
|
Messenger = new LEMuSRDetectorMessenger(this);
|
|
|
|
//default visualization
|
|
dSPhi = 0*deg; // starting angle
|
|
dEPhi = 360*deg; // ending angle
|
|
|
|
FieldMapsDir=getenv("LEMuSR_FIELDMAPS_DIR");
|
|
if(FieldMapsDir)
|
|
|
|
G4cout<<"Fied Maps Directory is: "<< FieldMapsDir<<endl;
|
|
else
|
|
G4cout<<"Fied Maps Directory is not defined!!!"<<endl;
|
|
|
|
|
|
#ifdef LEMU_GET_NEWMAPS
|
|
NEWMAPS();
|
|
#endif
|
|
|
|
//do not change following values!!!________________________________
|
|
AsymCheck=0; // test asymmetry
|
|
scint = 0; // initial state for the scintillator sensitive detector
|
|
mcp = 0; // initial state for the mcp sensitive detector
|
|
cryo = 0; // initial state for the cryo sensitive detector
|
|
mcdetector = 1;// default apparatus with mcp detector
|
|
L3FieldVal=6.78; // initial state for the third lönse field
|
|
FieldStepLim=10.*mm;
|
|
Grid=1;
|
|
Guards=0;
|
|
Material_SAH="copper";
|
|
//_________________________________________________________________
|
|
|
|
// can be changed
|
|
magfield = 1;// magfield enabled
|
|
elfield = 0;// 3rd lens elfield / 0 = disabled
|
|
anode_elfield =0; //anode field / 0 = disabled
|
|
trigger_field = 1;// trigger field / 1 = enabled
|
|
AnodeFieldVal=1;// scale of RA field
|
|
RALval=0.; // left anode voltage
|
|
RARval=0.; // right anode voltage
|
|
cfthk = 1.75;// carbon foil thickness in unit mug/cm2
|
|
cryoFieldLength = 3.5; // cryo field length
|
|
cryoVoltage = 12.; // cryo voltage
|
|
B=50.; // magfield value
|
|
|
|
theDetector= this;
|
|
}
|
|
|
|
LEMuSRDetectorConstruction::~LEMuSRDetectorConstruction()
|
|
{
|
|
|
|
}
|
|
|
|
LEMuSRDetectorConstruction* LEMuSRDetectorConstruction::theDetector=0;
|
|
LEMuSRDetectorConstruction* LEMuSRDetectorConstruction::GetInstance()
|
|
{
|
|
return theDetector;
|
|
}
|
|
|
|
|
|
|
|
// CONTRUCT THE DETECTOR
|
|
|
|
|
|
G4VPhysicalVolume* LEMuSRDetectorConstruction::Construct()
|
|
{
|
|
return lemuDetector();
|
|
}
|
|
|
|
|
|
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
// DEFINE THE DETECTOR
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
G4VPhysicalVolume* LEMuSRDetectorConstruction::lemuDetector() // !mind the V in G4VP...
|
|
{
|
|
|
|
//! Definition of the top mothe volume: the laboratory. Refered to as Wolrd.
|
|
// +++++++++++++++++++++++++++++++DEFINE THE MOTHER VOLUME: THE LABORATOY++++++++++++++++++++++
|
|
// solid
|
|
G4double LABO_x = 1*m;
|
|
G4double LABO_y = 1*m;
|
|
G4double LABO_z = 2*m;
|
|
|
|
LABO_box = new G4Box("World_box",LABO_x,LABO_y,LABO_z);
|
|
// logical volume
|
|
LABO_material = G4Material::GetMaterial("Air");
|
|
lv_LABO = new G4LogicalVolume(LABO_box,LABO_material,"lv_World",0,0,0);
|
|
|
|
// physical volume
|
|
pv_LABO = new G4PVPlacement(0, // no rotation matrix
|
|
G4ThreeVector(), // ()==(0,0,0)
|
|
lv_LABO, // logical volume
|
|
"pv_World", // name
|
|
0, // no mother volume
|
|
false, // always false
|
|
0); // !!! lv_LABO is the world logical, mother volume is 0 for the world!
|
|
|
|
//SET VISUAL ATTRIBUTES
|
|
//-------NONE----------
|
|
|
|
lv_LABO->SetVisAttributes(G4VisAttributes::Invisible);
|
|
G4UserLimits* LABO_lim = new G4UserLimits();
|
|
LABO_lim->SetUserMinEkine(1.*eV);
|
|
// LABO_lim->SetUserMaxTrackLength(1.2*m);
|
|
|
|
lv_LABO->SetUserLimits(LABO_lim);
|
|
|
|
//---------------------
|
|
|
|
|
|
// END OF LABORATORY DEFINITION //
|
|
|
|
|
|
|
|
// &&&&&&&&&&&&&&&& ADD THE OTHER DETECTOR VOLUMES &&&&&&&&&&&&&&&&&&&&&//
|
|
//! Definition of the other volumes:
|
|
|
|
//! * -# Definition the attributes.
|
|
// LOAD ATTRIBUTES AND USER LIMIT
|
|
LoadAttributes();
|
|
//-------------------------------
|
|
|
|
// main materials
|
|
//! * -# Definition of the materials
|
|
Vacuum = G4Material::GetMaterial("vacuum");
|
|
SSteel = G4Material::GetMaterial("stainless_steel");
|
|
//-------------------------------
|
|
|
|
//! *-# Add the MCP and Gate Valve chamber.
|
|
lemuMCP2();
|
|
|
|
//! If <tt>asymcheck==1</tt> then build a spherical detector around mcp chamber to test the asymmetry. Shall be modified in the future.
|
|
if(AsymCheck==1)
|
|
{
|
|
lemuAsym();
|
|
}
|
|
|
|
|
|
//! If <tt>asymcheck==0</tt> then build the trigger detector, the gate valve chamber, the third lens, the anode and the scintillators.
|
|
if(AsymCheck==0)
|
|
{
|
|
|
|
lemuTrigger_Detector();
|
|
lemuCGate();
|
|
lemuLinse3();
|
|
lemuANODE();
|
|
lemuSCINT();
|
|
|
|
#ifdef LEMU_TEST_FOCAL_LENGTH
|
|
//! If <tt>LEMU_TEST_FOCAL_LENGTH</tt> is defined then
|
|
lemuFieldCheck();
|
|
#endif
|
|
|
|
//! Sensitive Detection
|
|
/*!
|
|
* The sensitive detector and the hit collection it builds must be singletons, i.e. they can be instanciated only once. Hence, the variable <tt>cryo, mcp</tt> and <tt>scint</tt> are set to 1 as soon as the sensitive detector is built.
|
|
*/
|
|
|
|
if(mcdetector==0) //! If <tt>mcdetector==0</tt> then use cryostat
|
|
{
|
|
lemuCRYO();
|
|
if(cryo==0)
|
|
{
|
|
G4SDManager* SDMGR = G4SDManager::GetSDMpointer();
|
|
|
|
G4String CryoName = "/LEMuSR/Cryo_sample";
|
|
|
|
CryoSD = new LEMuSRCryoSD(CryoName);
|
|
|
|
SDMGR->AddNewDetector(CryoSD);
|
|
cryo=1;
|
|
}
|
|
|
|
lv_SAH2->SetSensitiveDetector(CryoSD);
|
|
|
|
}
|
|
|
|
|
|
else if(mcdetector==1) //! If <tt>mcdetector==1</tt>then use micro channel detector
|
|
{
|
|
lemuMCPdet();
|
|
if(mcp==0)
|
|
{
|
|
G4SDManager* SDMGR = G4SDManager::GetSDMpointer();
|
|
|
|
G4String McpName = "/LEMuSR/MCP";
|
|
|
|
McpSD = new LEMuSRMcpSD(McpName);
|
|
|
|
SDMGR->AddNewDetector(McpSD);
|
|
mcp=1;
|
|
}
|
|
|
|
lv_DMCP->SetSensitiveDetector(McpSD);
|
|
|
|
}
|
|
|
|
|
|
//SENSITIVE DETECTOR
|
|
|
|
|
|
if(scint==0)
|
|
{
|
|
G4SDManager* SDMGR = G4SDManager::GetSDMpointer();
|
|
|
|
G4String iScintName = "/LEMuSR/Scintillator/Inner";
|
|
G4String oScintName = "/LEMuSR/Scintillator/Outer";
|
|
|
|
iScintSD = new LEMuSRScintSD(iScintName);
|
|
oScintSD = new LEMuSROScintSD(oScintName);
|
|
|
|
SDMGR->AddNewDetector(iScintSD);
|
|
SDMGR->AddNewDetector(oScintSD);
|
|
scint=1;
|
|
}
|
|
|
|
lv_SCIS->SetSensitiveDetector(iScintSD);
|
|
lv_SCOS->SetSensitiveDetector(oScintSD);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// PRINT STATUS
|
|
G4cout<<"geometry defined"<<G4endl;
|
|
|
|
PrintStatus();
|
|
|
|
return pv_LABO;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
// DEFINE THE MCP2
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
|
|
void LEMuSRDetectorConstruction::lemuMCP2()
|
|
{
|
|
|
|
// Basic tube
|
|
|
|
// solid
|
|
|
|
// main volumes
|
|
MCPV_tube= new G4Tubs( "sMCPV", 0.00*cm, 7.65*cm, 25.45*cm, dSPhi, dEPhi);
|
|
G4cout<<dSPhi<<" "<<dEPhi<<G4endl;
|
|
MCPS_tube= new G4Tubs( "sMCPS", 7.65*cm, 7.95*cm, 16.2*cm, dSPhi, dEPhi);
|
|
F160_tube= new G4Tubs( "sF160", 7.95*cm, 10.125*cm,1.1*cm, dSPhi, dEPhi);
|
|
F100_tube= new G4Tubs( "sF100", 0.00*cm, 7.65*cm, .5*cm, dSPhi, dEPhi);
|
|
F200_tube= new G4Tubs( "sF200", 7.65*cm, 10.325*cm,1.2*cm, dSPhi, dEPhi);
|
|
|
|
|
|
// gate valve chamber
|
|
GATV_tube= new G4Tubs( "sGATV",7.65*cm, 10.325*cm, 9.25*cm, dSPhi, dEPhi);
|
|
GATS_tube= new G4Tubs( "sGATS", 10.325*cm, 12.65*cm, 9.25*cm, dSPhi, dEPhi);
|
|
|
|
G4Transform3D tr_gatv;
|
|
tr_gatv=G4Translate3D(0.,0.,(-25.45+9.25)*cm);
|
|
|
|
// MCPV_vtube= new G4UnionSolid("vMCPV", MCPV_tube, GATV_tube,tr_gatv);
|
|
|
|
// logical volumes : solid + material
|
|
|
|
|
|
|
|
lv_MCPS = new G4LogicalVolume( MCPS_tube , SSteel ,"lv_MCPS",0,0,0);
|
|
lv_F160 = new G4LogicalVolume( F160_tube , SSteel ,"lv_F160",0,0,0);
|
|
lv_F100 = new G4LogicalVolume( F100_tube , SSteel ,"lv_F100",0,0,0);
|
|
lv_F200 = new G4LogicalVolume( F200_tube , SSteel ,"lv_F200",0,0,0);
|
|
|
|
|
|
lv_GATV = new G4LogicalVolume( GATV_tube , Vacuum ,"lv_GATV",0,0,0);
|
|
|
|
lv_GATS = new G4LogicalVolume( GATS_tube , SSteel ,"lv_GATS",0,0,0);
|
|
|
|
// try to make boolean sum of gatv_mcpv
|
|
|
|
// logical and physical volume
|
|
|
|
//----------------------------------------------------//
|
|
// BUILD THE FIELD OF THE ANODE AND RETURN LV_MCPV
|
|
buildAnodeField();// defines lv_MCPV's field manager GFieldMgr
|
|
//----------------------------------------------------//
|
|
|
|
// set MCPV z position !!!
|
|
mcpv_z=-9.25*cm;
|
|
|
|
|
|
|
|
|
|
if(AsymCheck!=1){
|
|
pv_MCPS = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 0*cm),lv_MCPS ,"pv_MCPS",lv_LABO, false, 0 );
|
|
pv_F160 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, -15.10*cm),lv_F160 ,"pv_F160",lv_LABO, false, 0 );
|
|
pv_F100 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, +16.2*cm),lv_F100 ,"pv_F100",lv_LABO, false, 0 );
|
|
|
|
G4VPhysicalVolume* pv_F101;
|
|
pv_F101 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, -124.*cm),lv_F100 ,"pv_F101",lv_LABO, false, 0 );
|
|
|
|
GATVz= -25.45;
|
|
pv_F200 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 8.05*cm),lv_F200 ,"pv_F200",lv_GATV, false, 0 );
|
|
pv_GATS = new G4PVPlacement( 0, G4ThreeVector(0 *cm, 0*cm,GATVz*cm),lv_GATS ,"pv_GATS",lv_LABO, false, 0 );
|
|
pv_GATV = new G4PVPlacement( 0, G4ThreeVector(0 *cm, 0*cm,GATVz*cm),lv_GATV ,"pv_GATV",lv_LABO, false, 0 );
|
|
}
|
|
|
|
|
|
|
|
pv_MCPV = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, mcpv_z),lv_MCPV ,"pv_MCPV",lv_LABO, false, 0 );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Apply attributes and user limit
|
|
|
|
lv_MCPV->SetVisAttributes(G4VisAttributes::Invisible);
|
|
lv_MCPS->SetVisAttributes(Blue_style);
|
|
lv_F160->SetVisAttributes(fBlue_style);
|
|
lv_F100->SetVisAttributes(fBlue_style);
|
|
lv_F200->SetVisAttributes(fBlue_style);
|
|
lv_GATV->SetVisAttributes(G4VisAttributes::Invisible);
|
|
lv_GATS->SetVisAttributes(Blue_style);
|
|
|
|
|
|
// user limits
|
|
G4UserLimits* RAV_lim = new G4UserLimits();
|
|
RAV_lim -> SetMaxAllowedStep(FieldStepLim );
|
|
//RAV_lim->SetUserMaxTrackLength(1.2*m);
|
|
RAV_lim-> SetUserMinEkine(1.*eV);
|
|
lv_MCPV->SetUserLimits(RAV_lim);
|
|
//
|
|
|
|
}
|
|
|
|
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
// DEFINE THE ANODE
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
void LEMuSRDetectorConstruction::lemuANODE()
|
|
{
|
|
// conical anode
|
|
|
|
G4double dSPhie=-acos(1/4.51469);
|
|
G4double dEPhie=2*acos(1/4.51469);
|
|
RA_E_cone= new G4Cons( "sRA_E", 4.51469*cm,6.25*cm,3.35*cm,3.9*cm,2.25*cm, dSPhie, dEPhie);
|
|
|
|
RA_M_cone= new G4Cons( "sRA_M", 5.67937*cm,6.25*cm,4.51469*cm,6.25*cm,2.25*cm, dSPhie, dEPhie);
|
|
|
|
RA_Ebox = new G4Box("RA_Ebox", 1.*cm,12.5*cm,2.25*cm );
|
|
RA_Mbox = new G4Box("RA_Mbox", 1.*cm,12.5*cm,2.25*cm );
|
|
|
|
RA_G_tube= new G4Tubs( "sRA_G", 5.8*cm,6.25*cm,5.55*cm, dSPhi, dEPhi);
|
|
|
|
|
|
// logical volumes
|
|
lv_RA_E = new G4LogicalVolume( RA_E_cone , SSteel ,"lv_RA_E",0,0,0);
|
|
lv_RA_M = new G4LogicalVolume( RA_M_cone , SSteel ,"lv_RA_M",0,0,0);
|
|
lv_RA_G = new G4LogicalVolume( RA_G_tube , SSteel ,"lv_RA_G",0,0,0);
|
|
|
|
|
|
// physical volumes
|
|
RA_Gz= -25.45+3.75;
|
|
RA_Ez= -10.35+2.25;
|
|
RA_Mz= -10.35-2.25;
|
|
|
|
|
|
// Mother Volume is lv_MCPV!!!!
|
|
pv_RA_E = new G4PVPlacement( 0, G4ThreeVector( 0*cm, 0*cm, RA_Ez*cm-mcpv_z),lv_RA_E ,"pv_RA_E",lv_MCPV, false, 0 );
|
|
pv_RA_M = new G4PVPlacement( 0, G4ThreeVector( 0*cm, 0*cm, RA_Mz*cm-mcpv_z),lv_RA_M ,"pv_RA_M",lv_MCPV, false, 0 );
|
|
pv_RA_G = new G4PVPlacement( 0, G4ThreeVector( 0*cm, 0*cm, RA_Gz*cm-mcpv_z),lv_RA_G ,"pv_RA_G",lv_MCPV, false, 0 );
|
|
|
|
rotation1=G4RotateZ3D(180*deg) ;
|
|
|
|
G4Transform3D tr_E,tr_M, trl_E, trl_M;
|
|
trl_E=G4Translate3D(0.,0.,RA_Ez*cm-mcpv_z);
|
|
trl_M=G4Translate3D(0.,0.,RA_Mz*cm-mcpv_z);
|
|
|
|
tr_E=trl_E*rotation1;
|
|
tr_M=trl_M*rotation1;
|
|
|
|
|
|
G4VPhysicalVolume* pv_RA_E2;
|
|
pv_RA_E2 = new G4PVPlacement(tr_E,lv_RA_E ,"pv_RA_E2",lv_MCPV, false, 0 );
|
|
G4VPhysicalVolume* pv_RA_M2;
|
|
pv_RA_M2 = new G4PVPlacement(tr_M,lv_RA_M ,"pv_RA_M2",lv_MCPV, false, 0 );
|
|
|
|
|
|
// Visual attributes
|
|
lv_RA_E->SetVisAttributes(lBlue_style);
|
|
lv_RA_M->SetVisAttributes(dBlue_style);
|
|
lv_RA_G->SetVisAttributes(lBlue_style);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
// DEFINE THE CRYOSTAT
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
void LEMuSRDetectorConstruction:: lemuCRYO()
|
|
{
|
|
|
|
// cu or al plates
|
|
SAH1_tube= new G4Tubs( "sSAH1", 0.*cm,3.5*cm,0.25*cm, dSPhi, dEPhi);
|
|
SAH2_tube= new G4Tubs( "sSAH2", 0.*cm,3.5*cm,0.2*cm, dSPhi, dEPhi);
|
|
SAH3_tube= new G4Tubs( "sSAH3", 2.*cm,3.5*cm,0.05*cm, dSPhi, dEPhi);
|
|
SAPH_tube= new G4Tubs( "sSAPH", 0.*cm,3.0*cm,0.3*cm, dSPhi, dEPhi);
|
|
|
|
// cryo
|
|
COFI_tube= new G4Tubs( "sCOFI", 0.*cm,2.75*cm,0.5*cm, dSPhi, dEPhi);
|
|
CRY1_tube= new G4Tubs( "sCRY1", 0.*cm,1.5*cm,0.35*cm, dSPhi, dEPhi);
|
|
CRY2_tube= new G4Tubs( "sCRY2", 0.5*cm,1.5*cm,2.5*cm, dSPhi, dEPhi);
|
|
CRY3_tube= new G4Tubs( "sCRY3", 3.8*cm,4.7*cm,0.55*cm, dSPhi, dEPhi);
|
|
CRY4_tube= new G4Tubs( "sCRY4", 1.5*cm,3.8*cm,0.1*cm, dSPhi, dEPhi);
|
|
CRSH_tube= new G4Tubs( "sCRSH", 4.7*cm,4.8*cm,4.5*cm, dSPhi, dEPhi);//HE shield
|
|
CRSH2_tube= new G4Tubs( "sCRSH2", 3.0*cm,4.8*cm,.05*cm, dSPhi, dEPhi);//front HE shield
|
|
|
|
//materials
|
|
SAH_material = G4Material::GetMaterial(Material_SAH);//G4Material::GetMaterial("aluminium");
|
|
SAPH_material = G4Material::GetMaterial("saphire");
|
|
Copper = G4Material::GetMaterial("copper");
|
|
|
|
|
|
Guard_Rings = new G4Tubs ("sGuard",3.0*cm,3.5*cm,0.25*cm, dSPhi, dEPhi);
|
|
|
|
|
|
// logicals volumes
|
|
|
|
|
|
// sample MAGNETIC field
|
|
sampleField = new LEMuSRRNDMAGField(G4ThreeVector(0.,0.,100*gauss),1.);
|
|
|
|
G4Mag_SpinEqRhs *Mag_SpinEqRhs;
|
|
G4MagIntegratorStepper *pStepper;
|
|
Mag_SpinEqRhs = new G4Mag_SpinEqRhs(sampleField);
|
|
pStepper = new G4ClassicalRK4( Mag_SpinEqRhs,12 );
|
|
|
|
G4ChordFinder* pChordFinder = new G4ChordFinder(sampleField,1.e-5* mm, pStepper );
|
|
G4FieldManager* sampleFieldMgr = new G4FieldManager(); // 1
|
|
sampleFieldMgr->SetDetectorField(sampleField,true);
|
|
sampleFieldMgr->SetChordFinder(pChordFinder);
|
|
|
|
|
|
lv_SAH1 = new G4LogicalVolume( SAH1_tube , SAH_material ,"lv_SAH1",0,0,0);
|
|
lv_SAH2 = new G4LogicalVolume( SAH2_tube , SAH_material ,"lv_SAH2",0,0,0);
|
|
lv_SAH3 = new G4LogicalVolume( SAH3_tube , SAH_material ,"lv_SAH3",0,0,0);
|
|
lv_SAPH = new G4LogicalVolume( SAPH_tube , SAPH_material ,"lv_SAPH",0,0,0);
|
|
lv_COFI = new G4LogicalVolume( COFI_tube , Copper ,"lv_COFI",0,0,0);
|
|
lv_CRY1 = new G4LogicalVolume( CRY1_tube , Copper ,"lv_CRY1",0,0,0);
|
|
lv_CRY2 = new G4LogicalVolume( CRY2_tube , Copper ,"lv_CRY2",0,0,0);
|
|
lv_CRY3 = new G4LogicalVolume( CRY3_tube , Copper ,"lv_CRY3",0,0,0);
|
|
lv_CRY4 = new G4LogicalVolume( CRY4_tube , Copper ,"lv_CRY4",0,0,0);
|
|
lv_CRSH = new G4LogicalVolume( CRSH_tube , Copper ,"lv_CRSH",0,0,0);
|
|
lv_CRSH2 = new G4LogicalVolume( CRSH2_tube , Copper ,"lv_CRSH2",0,0,0);
|
|
|
|
lv_Guards = new G4LogicalVolume(Guard_Rings, Copper, "lv_GRING",0,0,0);
|
|
|
|
|
|
|
|
// physical volumes
|
|
offset=0.0;
|
|
pv_SAH1 = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 2.65*cm-mcpv_z), lv_SAH1 ,"pv_SAH1",lv_MCPV,false, 0 );
|
|
pv_SAH2 = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 1.6*cm-mcpv_z), lv_SAH2 ,"pv_SAH2",lv_MCPV, false, 0 );
|
|
// pv_SAH3 = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 1.35*cm-mcpv_z),lv_SAH3 ,"pv_SAH3",lv_MCPV, false, 0 );
|
|
pv_SAPH = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 2.10*cm-mcpv_z),lv_SAPH ,"pv_SAPH",lv_MCPV, false, 0 );
|
|
pv_COFI = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 3.40*cm-mcpv_z),lv_COFI ,"pv_COFI",lv_MCPV, false, 0 );
|
|
pv_CRY1 = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 4.25*cm-mcpv_z),lv_CRY1 ,"pv_CRY1",lv_MCPV, false, 0 );
|
|
pv_CRY2 = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 6.75*cm-mcpv_z),lv_CRY2 ,"pv_CRY2",lv_MCPV, false, 0 );
|
|
pv_CRY3 = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 5.10*cm-mcpv_z),lv_CRY3 ,"pv_CRY3",lv_MCPV, false, 0 );
|
|
pv_CRY4 = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 5.10*cm-mcpv_z),lv_CRY4 ,"pv_CRY4",lv_MCPV, false, 0 );
|
|
pv_CRSH = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 1.6*cm-mcpv_z),lv_CRSH ,"pv_CRSH", lv_MCPV, false, 0 );
|
|
pv_CRSH2 = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 1.6*cm-mcpv_z-4.55*cm),lv_CRSH2 ,"pv_CRSH2", lv_MCPV, false, 0 );
|
|
|
|
pv_Guard1 = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 1.6*cm- 1.43333*cm-mcpv_z), lv_Guards ,"pv_G_Ring1",lv_MCPV, false, 0);
|
|
pv_Guard2 = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 1.6*cm- 1.43333*cm- 1.43333*cm-mcpv_z), lv_Guards ,"pv_G_Ring2",lv_MCPV, false, 0);
|
|
|
|
|
|
// Visual Attributes
|
|
lv_SAH1->SetVisAttributes(Red_style);
|
|
lv_SAH2->SetVisAttributes(Red_style);
|
|
lv_SAH3->SetVisAttributes(Red_style);
|
|
lv_SAPH->SetVisAttributes(oxsteel);
|
|
lv_COFI->SetVisAttributes(dRed_style);
|
|
lv_CRY1->SetVisAttributes(dRed_style);
|
|
lv_CRY2->SetVisAttributes(dRed_style);
|
|
lv_CRY3->SetVisAttributes(dRed_style);
|
|
lv_CRY4->SetVisAttributes(dRed_style);
|
|
lv_CRSH->SetVisAttributes(dRed_style);
|
|
lv_CRSH2->SetVisAttributes(Red_style);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
// DEFINE THE MICRO CHANNEL-DETECTOR
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
void LEMuSRDetectorConstruction:: lemuMCPdet()
|
|
{
|
|
|
|
//MCP
|
|
DMCP_tube= new G4Tubs( "sDMCP",0.*cm,2.15*cm,0.15*cm , dSPhi, dEPhi);
|
|
MCPM_tube= new G4Tubs( "sMCPM", 2.40*cm, 3.25*cm, 0.075*cm, dSPhi, dEPhi);
|
|
MCPA_box = new G4Box( "sMCPA", 3.65*cm, 3.65*cm, 0.40*cm);
|
|
ANVA_tube= new G4Tubs( "sANVA", 0.00*cm, 2.75*cm, 0.15*cm, dSPhi, dEPhi);
|
|
MCSR_box = new G4Box( "sMCSR", 3.65*cm, 3.65*cm, 0.10*cm);
|
|
MCVR_tube= new G4Tubs( "sMCVR", 0.00*cm, 2.75*cm, 0.10*cm, dSPhi, dEPhi);
|
|
MCSS_tube= new G4Tubs( "sMCSS", 4.00*cm, 4.80*cm, 0.25*cm, dSPhi, dEPhi);
|
|
|
|
//materials
|
|
|
|
Macor = G4Material::GetMaterial("macor");
|
|
DMCP_material = G4Material::GetMaterial("mcpglass");
|
|
|
|
|
|
// logicals volumes
|
|
lv_DMCP = new G4LogicalVolume( DMCP_tube , DMCP_material ,"lv_DMCP",0,0,0);
|
|
lv_MCPM = new G4LogicalVolume( MCPM_tube , Macor ,"lv_MCVR",0,0,0);
|
|
lv_MCPA = new G4LogicalVolume( MCPA_box , SSteel ,"lv_MCPA",0,0,0);
|
|
lv_ANVA = new G4LogicalVolume( ANVA_tube , Vacuum ,"lv_ANVA",0,0,0);
|
|
lv_MCSR = new G4LogicalVolume( MCSR_box , SSteel ,"lv_MCSR",0,0,0);
|
|
lv_MCVR = new G4LogicalVolume( MCVR_tube , Vacuum ,"lv_MCVR",0,0,0);
|
|
lv_MCSS = new G4LogicalVolume( MCSS_tube , SSteel ,"lv_MCSS",0,0,0);
|
|
|
|
|
|
// physical volumes
|
|
pv_DMCP = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 2.15*cm-mcpv_z),lv_DMCP ,"pv_DMCP",lv_MCPV, false, 0 );
|
|
pv_MCPM = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 1.955*cm-mcpv_z),lv_MCPM ,"pv_MCPM",lv_MCPV, false, 0 );
|
|
pv_MCPM2= new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 2.405*cm-mcpv_z),lv_MCPM ,"pv_MCPM2",lv_MCPV, false, 0 );
|
|
pv_MCSR = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 2.63*cm-mcpv_z),lv_MCSR ,"pv_MCSR",lv_MCPV, false, 0 );
|
|
pv_MCVR = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 0.0*cm),lv_MCVR ,"pv_MCVR",lv_MCSR, false, 0 );//CF SUBSTRACTION
|
|
pv_MCPA = new G4PVPlacement( 0, G4ThreeVector(0 *cm,0 *cm, 3.73*cm-mcpv_z),lv_MCPA ,"pv_MCPA",lv_MCPV, false, 0 );
|
|
pv_ANVA = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, -0.25*cm),lv_ANVA ,"pv_ANVA",lv_MCPA, false, 0 );
|
|
pv_ANVA2= new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 0.25*cm),lv_ANVA ,"pv_ANVA2",lv_MCPA, false, 0 );
|
|
pv_MCSS = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 6.38*cm-mcpv_z),lv_MCSS ,"pv_MCSS",lv_MCPV, false, 0 );
|
|
|
|
// Visual Attributes
|
|
lv_DMCP->SetVisAttributes(MCP_style);
|
|
lv_MCPM->SetVisAttributes(MACOR_style);
|
|
lv_MCSR->SetVisAttributes(Green_style);
|
|
lv_MCVR->SetVisAttributes(VTBB_style);
|
|
lv_MCPA->SetVisAttributes(Green_style);
|
|
lv_ANVA->SetVisAttributes(VTBB_style);
|
|
lv_MCSS ->SetVisAttributes(Green_style);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
// DEFINE THE SCINTILLATOR
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
void LEMuSRDetectorConstruction::lemuSCINT()
|
|
{
|
|
|
|
// solids
|
|
SCIS_tube= new G4Tubs("sSCIS",9.0*cm,9.5*cm, 13.0*cm, -45*deg, +90*deg);
|
|
SCOS_tube= new G4Tubs("sSCOS",9.6*cm,10.1*cm, 13.0*cm, -45*deg, +90*deg);
|
|
|
|
// materials
|
|
SC_material= G4Material::GetMaterial("scint");
|
|
|
|
// logical
|
|
lv_SCIS= new G4LogicalVolume(SCIS_tube,SC_material,"lv_SCIS",0,0,0);
|
|
lv_SCOS= new G4LogicalVolume(SCOS_tube,SC_material,"lv_SCOS",0,0,0);
|
|
|
|
// physical
|
|
rotation1=G4RotateZ3D(90*deg) ;
|
|
rotation2=G4RotateZ3D(180*deg) ;
|
|
rotation3=G4RotateZ3D(270*deg) ;
|
|
|
|
pv_SCISr = new G4PVPlacement( rotation2,lv_SCIS ,"pv_SCISr",lv_LABO, false, 0 );
|
|
pv_SCOSr = new G4PVPlacement( rotation2,lv_SCOS ,"pv_SCOSr",lv_LABO, false, 0 );
|
|
|
|
|
|
if(halfview==0)
|
|
{
|
|
pv_SCISt = new G4PVPlacement( rotation1,lv_SCIS ,"pv_SCISt",lv_LABO, false, 0 );
|
|
pv_SCOSt = new G4PVPlacement( rotation1,lv_SCOS ,"pv_SCOSt",lv_LABO, false, 0 );
|
|
|
|
pv_SCISl = new G4PVPlacement( 0 , G4ThreeVector(0 *cm,0 *cm, 0*cm),lv_SCIS ,"pv_SCISl",lv_LABO, false, 0 );
|
|
pv_SCOSl = new G4PVPlacement( 0 , G4ThreeVector(0 *cm,0 *cm, 0*cm),lv_SCOS ,"pv_SCOSl",lv_LABO, false, 0 );
|
|
|
|
pv_SCISb = new G4PVPlacement( rotation3,lv_SCIS ,"pv_SCISb",lv_LABO, false, 0 );
|
|
pv_SCOSb = new G4PVPlacement( rotation3,lv_SCOS ,"pv_SCOSb",lv_LABO, false, 0 );
|
|
|
|
}
|
|
else if(halfview==1)
|
|
{
|
|
pv_SCISb = new G4PVPlacement( rotation3,lv_SCIS ,"pv_SCISb",lv_LABO, false, 0 );
|
|
pv_SCOSb = new G4PVPlacement( rotation3,lv_SCOS ,"pv_SCOSb",lv_LABO, false, 0 );
|
|
pv_SCISt = new G4PVPlacement( rotation1,lv_SCIS ,"pv_SCISt",lv_LABO, false, 0 );
|
|
pv_SCOSt = new G4PVPlacement( rotation1,lv_SCOS ,"pv_SCOSt",lv_LABO, false, 0 );
|
|
}
|
|
|
|
|
|
// vis attributes
|
|
lv_SCIS->SetVisAttributes(SCINT_style);
|
|
lv_SCOS->SetVisAttributes(dSCINT_style);
|
|
}
|
|
|
|
|
|
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
// DEFINE THE THIRD LENS
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
|
|
void LEMuSRDetectorConstruction::lemuLinse3()
|
|
{
|
|
|
|
// L3 tube
|
|
L3VA_tube= new G4Tubs( "sL3VA", 0.*cm,10.0*cm,22.0*cm, dSPhi, dEPhi);
|
|
L3ST_tube= new G4Tubs( "sL3ST", 10.0*cm, 10.3*cm, 22.0*cm, dSPhi, dEPhi);
|
|
|
|
L3F_tube= new G4Tubs( "sL3F", 10.3*cm, 12.65*cm, 1.2*cm, dSPhi, dEPhi);
|
|
|
|
// Ground Potential tubes
|
|
L3GP1= new G4Tubs("LGP1", 6.5*cm, 6.7*cm, 6.65*cm, dSPhi, dEPhi);
|
|
L3GP2= new G4Tubs("LGP2", 8.1*cm, 8.3*cm, 6.65*cm, dSPhi, dEPhi);
|
|
L3GP3= new G4Tubs("LGP3", 6.7*cm,8.1*cm,0.4*cm, dSPhi, dEPhi);
|
|
|
|
// High Potential tube
|
|
|
|
L3HP1= new G4Tubs("LHP1", 6.5*cm, 8.3*cm, 5.5*cm, dSPhi, dEPhi);
|
|
L3HP2= new G4Tubs("LHP2", 6.7*cm, 8.1*cm, 5.*cm, dSPhi, dEPhi);
|
|
L3HP4= new G4Tubs("LHP4", 8.1*cm, 8.3*cm, 0.6*cm, dSPhi, dEPhi);
|
|
L3HP5= new G4Tubs("LHP5", 6.7*cm, 6.85*cm, 0.75*cm, dSPhi, dEPhi);
|
|
|
|
// L3HP_tube= new G4SubtractionSolid("sL3HP", L3HP1, L3HP2);
|
|
|
|
|
|
// Logical volumes
|
|
|
|
// electric field
|
|
|
|
if(elfield==1)
|
|
{
|
|
|
|
G4ElectricField* L3Field = new LEMuSRElectricField(L3FieldVal,
|
|
FieldMapsDir+"/ThirdLens/L3b.map"
|
|
,"dm",-567,60,60,100);
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
L3FieldMgr = new G4FieldManager();//1
|
|
|
|
G4MagIntegratorStepper *pStepper;
|
|
G4El_UsualEqRhs *fEquation = new G4El_UsualEqRhs(L3Field);
|
|
|
|
pStepper = new G4ClassicalRK4( fEquation, 12 );
|
|
|
|
// equation considers spin or not
|
|
G4ChordFinder* pChordFinder = new G4ChordFinder( L3Field,
|
|
1.e-10 * mm, // Minimum step size: must be very small for a precise calculation of transport energy
|
|
pStepper);
|
|
|
|
L3FieldMgr->SetDetectorField(L3Field);
|
|
L3FieldMgr->SetChordFinder(pChordFinder);
|
|
|
|
lv_L3VA = new G4LogicalVolume( L3VA_tube , Vacuum ,"lv_L3VA",L3FieldMgr,0,0);
|
|
|
|
}
|
|
|
|
if(elfield==0)
|
|
{
|
|
lv_L3VA = new G4LogicalVolume( L3VA_tube , Vacuum ,"lv_L3VA",0,0,0);
|
|
}
|
|
|
|
lv_L3ST = new G4LogicalVolume( L3ST_tube , SSteel ,"lv_L3ST",0,0,0);
|
|
|
|
lv_L3F = new G4LogicalVolume( L3F_tube , SSteel ,"lv_L3F",0,0,0);
|
|
|
|
lv_L3GP1= new G4LogicalVolume( L3GP1 , SSteel ,"lv_L3GP1",0,0,0);
|
|
lv_L3GP2= new G4LogicalVolume( L3GP2 , SSteel ,"lv_L3GP2",0,0,0);
|
|
lv_L3GP3= new G4LogicalVolume( L3GP3 , SSteel ,"lv_L3GP3",0,0,0);
|
|
|
|
lv_L3HP= new G4LogicalVolume( L3HP1 , SSteel ,"lv_L3HP",0,0,0);
|
|
lv_L3HP4= new G4LogicalVolume( L3HP4 , SSteel ,"lv_L3HP4",0,0,0);
|
|
lv_L3HP5= new G4LogicalVolume( L3HP5 , SSteel ,"lv_L3HP5",0,0,0);
|
|
|
|
|
|
// Physical volumes
|
|
L3z= -56.7;
|
|
|
|
pv_L3VA = new G4PVPlacement( 0, G4ThreeVector( 0*cm,0 *cm, L3z*cm),lv_L3VA ,"pv_L3VA",lv_LABO, false, 0 );
|
|
pv_L3ST = new G4PVPlacement( 0, G4ThreeVector(0 *cm, 0*cm, L3z*cm),lv_L3ST ,"pv_L3ST",lv_LABO, false, 0 );
|
|
|
|
pv_L3F1 = new G4PVPlacement( 0, G4ThreeVector(0 *cm, 0*cm, (L3z+20.8)*cm),lv_L3F ,"pv_L3F1",lv_LABO, false, 0 );
|
|
pv_L3F2 = new G4PVPlacement( 0, G4ThreeVector(0 *cm, 0*cm, (L3z-20.8)*cm),lv_L3F ,"pv_L3F2",lv_LABO, false, 0 );
|
|
|
|
//ground potential
|
|
pv_L3GP1 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm,13.35*cm),lv_L3GP1 ,"pv_L3GP1",lv_L3VA, false, 0 );
|
|
pv_L3GP2 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 13.35*cm),lv_L3GP2 ,"pv_L3GP2",lv_L3VA, false, 0 );
|
|
pv_L3GP3 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 19.6*cm),lv_L3GP3 ,"pv_L3GP3",lv_L3VA, false, 0 );
|
|
pv_L3GP4 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 7.1*cm),lv_L3GP3 ,"pv_L3GP4",lv_L3VA, false, 0 );
|
|
pv_L3GP5 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm,-13.35*cm),lv_L3GP1 ,"pv_L3GP5",lv_L3VA, false, 0 );
|
|
pv_L3GP6 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, -13.35*cm),lv_L3GP2 ,"pv_L3GP6",lv_L3VA, false, 0 );
|
|
pv_L3GP7 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, -19.6*cm),lv_L3GP3 ,"pv_L3GP7",lv_L3VA, false, 0 );
|
|
pv_L3GP8 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, -7.1*cm),lv_L3GP3 ,"pv_L3GP8",lv_L3VA, false, 0 );
|
|
|
|
|
|
pv_L3HP = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm,0*cm),lv_L3HP ,"pv_L3HP",lv_L3VA, false, 0 );
|
|
pv_L3HP4 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 6.1*cm),lv_L3HP4 ,"pv_L3HP4",lv_L3VA, false, 0 );
|
|
pv_L3HP5 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, 4.425*cm),lv_L3HP5 ,"pv_L3HP5",lv_L3VA, false, 0 );
|
|
pv_L3HP7 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, -6.1*cm),lv_L3HP4,"pv_L3HP7",lv_L3VA, false, 0 );
|
|
pv_L3HP8 = new G4PVPlacement( 0, G4ThreeVector( 0.*cm, 0.*cm, -4.425*cm),lv_L3HP5 ,"pv_L3HP8",lv_L3VA, false, 0 );
|
|
|
|
|
|
|
|
|
|
|
|
//Visual Attributes:
|
|
// Load attributes and userlimits
|
|
|
|
lv_L3VA->SetVisAttributes(G4VisAttributes::Invisible);
|
|
lv_L3ST->SetVisAttributes(Blue_style);
|
|
lv_L3F->SetVisAttributes(fBlue_style);
|
|
|
|
lv_L3GP1->SetVisAttributes(lBlue_style);
|
|
lv_L3GP2->SetVisAttributes(Blue_style);
|
|
lv_L3GP3->SetVisAttributes(dBlue_style);
|
|
|
|
|
|
lv_L3HP->SetVisAttributes(lBlue_style);
|
|
lv_L3HP4->SetVisAttributes(Blue_style);
|
|
lv_L3HP5->SetVisAttributes(dBlue_style);
|
|
|
|
G4UserLimits* L3V_lim = new G4UserLimits();
|
|
L3V_lim -> SetMaxAllowedStep(FieldStepLim );
|
|
//L3V_lim->SetUserMaxTrackLength(1.2*m);
|
|
L3V_lim-> SetUserMinEkine(1.*eV);
|
|
lv_L3VA->SetUserLimits(L3V_lim);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
// DEFINE THE TRIGGER DETECTOR
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
void LEMuSRDetectorConstruction::lemuTrigger_Detector()
|
|
{
|
|
|
|
//--------------------- CYLINDER AND FLANGES--------------------
|
|
|
|
// solids
|
|
TriggerV_tube = new G4Tubs("sTriggerV",0.*cm,10.*cm,14.8*cm, dSPhi, dEPhi);
|
|
Trigger_tube = new G4Tubs("sTrigger",10.*cm,10.3*cm,14.8*cm, dSPhi, dEPhi);
|
|
TriggerF_tube = new G4Tubs( "sTF", 10.3*cm, 12.65*cm, 1.2*cm, dSPhi, dEPhi);
|
|
|
|
Trigger_box = new G4Box("TBox", 4.5*cm, 4.5*cm, 0.4*cm);
|
|
Trigger_box2 = new G4Box("TBox", 4.*sqrt(2)*cm, 4.5*cm, 0.7/sqrt(2)*cm);
|
|
|
|
G4double thk;
|
|
thk = (cfthk*1.e-6/2.)*cm;//denominator must correspnd to graphite's density in material def.
|
|
Trigger_box3 = new G4Box("TFoilBox", 6*cm, 6*cm,thk/2.);
|
|
|
|
|
|
lv_TriggerV = new G4LogicalVolume(TriggerV_tube,Vacuum,"lv_TriggerV",0,0,0);
|
|
lv_TriggerF = new G4LogicalVolume(TriggerF_tube,SSteel,"lv_TriggerF",0,0,0);
|
|
lv_Trigger = new G4LogicalVolume(Trigger_tube,SSteel,"lv_Trigger",0,0,0);
|
|
|
|
Carbon= G4Material::GetMaterial("graphite");
|
|
lv_CFOIL=new G4LogicalVolume(Trigger_box3,Carbon,"lv_CFOIL",0,0,0);
|
|
|
|
|
|
G4double Triggerz = -109.2;//L3z - 22 - 15.7 -14.8;
|
|
|
|
pv_TriggerV = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,Triggerz*cm),lv_TriggerV,"pv_TriggerV",lv_LABO, false, 0 );
|
|
pv_TriggerF1 = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,(Triggerz+13.6)*cm),lv_TriggerF,"pv_TriggerF1",lv_LABO, false, 0 );
|
|
pv_TriggerF2 = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,(Triggerz-13.6)*cm),lv_TriggerF,"pv_TriggerF2",lv_LABO, false, 0 );
|
|
pv_Trigger = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,Triggerz*cm),lv_Trigger,"pv_Trigger",lv_LABO, false, 0 );
|
|
|
|
|
|
|
|
//--------------------- CARBON FOIL-----------------------------
|
|
|
|
#ifndef NO_CFOIL
|
|
pv_CFOIL = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,-4.5*cm),lv_CFOIL,"pv_CFOIL",lv_TriggerV, false, 0 );
|
|
#endif
|
|
|
|
//--------------------- ELECTRIC FIELD ZONES--------------------
|
|
|
|
|
|
// field
|
|
|
|
T1Field = new G4UniformElectricField(G4ThreeVector(0.,0.,-23.75*kilovolt/meter));
|
|
T1FieldMgr = new G4FieldManager();
|
|
T1FieldMgr->SetDetectorField(T1Field);
|
|
|
|
T2Field = new G4UniformElectricField(G4ThreeVector(0.,0.,+41.416*kilovolt/meter));
|
|
T2FieldMgr = new G4FieldManager();
|
|
T2FieldMgr->SetDetectorField(T2Field);
|
|
|
|
T3Field = new G4UniformElectricField(G4ThreeVector(0.,0.,-493.75*kilovolt/meter));
|
|
T3FieldMgr = new G4FieldManager();
|
|
T3FieldMgr->SetDetectorField(T3Field);
|
|
|
|
G4MagIntegratorStepper *pStepper;
|
|
G4El_UsualEqRhs *fEquation = new G4El_UsualEqRhs(T1Field);
|
|
pStepper = new G4ClassicalRK4( fEquation, 12 );
|
|
G4ChordFinder* pChordFinder = new G4ChordFinder( T1Field,1e-10 * mm,pStepper);
|
|
T1FieldMgr->SetDetectorField(T1Field);
|
|
T1FieldMgr->SetChordFinder(pChordFinder);
|
|
|
|
G4MagIntegratorStepper *pStepper2;
|
|
G4El_UsualEqRhs *fEquation2 = new G4El_UsualEqRhs(T2Field);
|
|
pStepper2 = new G4ClassicalRK4( fEquation2, 12 );
|
|
G4ChordFinder* pChordFinder2 = new G4ChordFinder( T2Field,1e-10 * mm,pStepper2);
|
|
T2FieldMgr->SetDetectorField(T2Field);
|
|
T2FieldMgr->SetChordFinder(pChordFinder2);
|
|
|
|
G4MagIntegratorStepper *pStepper3;
|
|
G4El_UsualEqRhs *fEquation3 = new G4El_UsualEqRhs(T3Field);
|
|
pStepper3 = new G4ClassicalRK4( fEquation3, 12 );
|
|
G4ChordFinder* pChordFinder3 = new G4ChordFinder( T3Field,1e-10 * mm,pStepper3);//minimum step =0 becuz the field is very big!
|
|
//therefore, all min step were set to very small values, just in case.
|
|
T3FieldMgr->SetDetectorField(T3Field);
|
|
T3FieldMgr->SetChordFinder(pChordFinder3);
|
|
|
|
|
|
// logical volumes
|
|
|
|
|
|
lv_TriggerE=new G4LogicalVolume(Trigger_box,Vacuum,"lv_TriggerE",T1FieldMgr,0,0);
|
|
lv_TriggerE2=new G4LogicalVolume(Trigger_box2,Vacuum,"lv_TriggerE2",T2FieldMgr,0,0);
|
|
lv_TriggerE3=new G4LogicalVolume(Trigger_box,Vacuum,"lv_TriggerE3",T3FieldMgr,0,0);
|
|
|
|
|
|
G4Transform3D Rotation2, transformation2, trl;
|
|
trl=G4Translate3D(0.,0.,2.25*mm);
|
|
Rotation2= G4Rotate3D(45*deg,G4ThreeVector(0.,1.,0.));
|
|
transformation2=trl*Rotation2;
|
|
|
|
|
|
if(trigger_field!=0)
|
|
{
|
|
pv_TriggerE = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,(-3.85)*cm),lv_TriggerE,"pv_TriggerE",lv_TriggerV, false, 0 );
|
|
|
|
pv_TriggerE2 = new G4PVPlacement(transformation2,lv_TriggerE2,"pv_TriggerE2",lv_TriggerV, false, 0 );
|
|
|
|
pv_TriggerE3 = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,(+4.3)*cm),lv_TriggerE3,"pv_TriggerE3",lv_TriggerV, false, 0 );
|
|
}
|
|
|
|
|
|
//visual attibutes
|
|
lv_TriggerV->SetVisAttributes(G4VisAttributes::Invisible);
|
|
lv_Trigger->SetVisAttributes(Blue_style);
|
|
lv_TriggerF->SetVisAttributes(fBlue_style);
|
|
lv_CFOIL->SetVisAttributes(MACOR_style);
|
|
|
|
G4UserLimits* RAV_lim = new G4UserLimits();
|
|
// RAV_lim -> SetMaxAllowedStep(FieldStepLim );
|
|
// RAV_lim->SetUserMaxTrackLength(1.2*m);
|
|
RAV_lim-> SetUserMinEkine(1.*eV);
|
|
lv_TriggerV->SetUserLimits(RAV_lim);
|
|
|
|
}
|
|
|
|
|
|
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
// DEFINE THE COMPENSATION GATE
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
void LEMuSRDetectorConstruction::lemuCGate()
|
|
{
|
|
|
|
// solids
|
|
CGateV_tube = new G4Tubs("sCGateV",0.*cm,10.*cm,7.85*cm, dSPhi, dEPhi);
|
|
CGate_tube = new G4Tubs("sCGate",10.*cm,10.3*cm,7.85*cm, dSPhi, dEPhi);
|
|
CGateF_tube = new G4Tubs( "sCGF", 10.3*cm, 12.65*cm, 1.2*cm, dSPhi, dEPhi);
|
|
|
|
|
|
// logical volumes
|
|
lv_CGateV = new G4LogicalVolume(CGateV_tube,Vacuum,"lv_CGateV",0,0,0);
|
|
lv_CGateF = new G4LogicalVolume(CGateF_tube,SSteel,"lv_CGateF",0,0,0);
|
|
lv_CGate = new G4LogicalVolume(CGate_tube,SSteel,"lv_CGate",0,0,0);
|
|
|
|
|
|
G4double CompGatez=-86.55 ;// L3z-22-7.85;
|
|
|
|
pv_CGateV = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,CompGatez*cm),lv_CGateV,"pv_CGateV",lv_LABO, false, 0 );
|
|
pv_CGateF1 = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,(CompGatez+6.65)*cm),lv_CGateF,"pv_CGateF1",lv_LABO, false, 0 );
|
|
pv_CGateF2 = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,(CompGatez-6.65)*cm),lv_CGateF,"pv_CGateF2",lv_LABO, false, 0 );
|
|
pv_CGate = new G4PVPlacement( 0,G4ThreeVector(0.*cm,0.*cm,CompGatez*cm),lv_CGate,"pv_CGate",lv_LABO, false, 0 );
|
|
|
|
//visual attibutes
|
|
lv_CGateV->SetVisAttributes(G4VisAttributes::Invisible);
|
|
lv_CGate->SetVisAttributes(Blue_style);
|
|
lv_CGateF->SetVisAttributes(fBlue_style);
|
|
|
|
G4UserLimits* RAV_lim = new G4UserLimits();
|
|
RAV_lim -> SetMaxAllowedStep(FieldStepLim );
|
|
// RAV_lim->SetUserMaxTrackLength(1.2*m);
|
|
RAV_lim-> SetUserMinEkine(1.*eV);
|
|
lv_CGateV->SetUserLimits(RAV_lim);
|
|
|
|
}
|
|
|
|
|
|
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
// DEFINE THE FIELDS
|
|
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
|
|
|
|
|
|
|
|
void LEMuSRDetectorConstruction::buildAnodeField()
|
|
{
|
|
|
|
|
|
|
|
G4String dir= FieldMapsDir;
|
|
|
|
int k=2*Grid+Guards;
|
|
|
|
std::cout<<"buildAnodeField::case = "<<k<<std::endl;
|
|
switch(k)
|
|
{
|
|
|
|
case 0:
|
|
dir+="/MCPV-80-80-200/No_Grid_NoGuards/"; break;
|
|
|
|
case 1:
|
|
dir+="/MCPV-80-80-200/No_Grid_Guards/"; break;
|
|
|
|
case 2:
|
|
dir+="/MCPV-80-80-200/Grid_NoGuards/"; break;
|
|
|
|
case 3:
|
|
dir+="/MCPV-80-80-200/Grid_Guards/"; break;
|
|
|
|
default: break;
|
|
}
|
|
|
|
|
|
|
|
// IF THERE IS A FIELD IN THE ANODE
|
|
if(anode_elfield==1)
|
|
{
|
|
|
|
// TEST OF TOTAL MCPV FIELD
|
|
|
|
// electric field
|
|
// G4cout<<"offset"<<mcpv_z/mm<<G4endl;
|
|
// left
|
|
|
|
G4String leftfile="RAL.map";
|
|
G4String leftmap = dir+leftfile;
|
|
|
|
LEMuSRElectricField* GFieldLeft = new LEMuSRElectricField(1,leftmap,"mm",0.0,80,80,200);
|
|
|
|
|
|
|
|
// right
|
|
|
|
G4String rightfile="RAR.map";
|
|
G4String rightmap = dir+rightfile;
|
|
|
|
LEMuSRElectricField* GFieldRight = new LEMuSRElectricField(1,rightmap,"mm",0.0,80,80,200);
|
|
|
|
|
|
// mix
|
|
// GField0
|
|
G4ElectricField* GField0 =
|
|
new LEMuSRElFieldMix(GFieldLeft,GFieldRight,RALval,RARval);
|
|
|
|
// mcdetector=1 or 0; 0 for cryo mode
|
|
buildCryoField();//cryostat field
|
|
|
|
// GField
|
|
G4ElectricField* GField =
|
|
new LEMuSRElFieldMix(GField0,cryoField,1,1-mcdetector);
|
|
|
|
|
|
#ifdef DEBUG_INTERPOLATING_FIELD
|
|
G4double Efield[3];
|
|
G4double position[4];
|
|
position[0]=0*mm;
|
|
position[1]=0*mm;
|
|
position[2]=-100.*mm;
|
|
position[3]=0;
|
|
GField->GetFieldValue(position,Efield);
|
|
do
|
|
{
|
|
|
|
GField->GetFieldValue(position,Efield);
|
|
G4cout<<position[0]<<" "<<position[1]<<" "<<position[2]<<G4endl;
|
|
G4cout<<"Field E Value " << G4BestUnit(Efield[0]*meter,"Electric potential") <<"/m " <<Efield[1]/volt*meter <<" V/m "<< Efield[2]/volt*meter <<" V/m " <<G4endl;
|
|
position[2]+=1.*mm;
|
|
}while(position[2]<20);
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// 1 case of pure electric field in the mcp
|
|
|
|
if(magfield==0)
|
|
{
|
|
|
|
GFieldMgr = new G4FieldManager();//1
|
|
G4MagIntegratorStepper *pStepper;
|
|
G4El_UsualEqRhs *fEquation = new G4El_UsualEqRhs(GField);
|
|
|
|
pStepper = new G4ClassicalRK4(fEquation,12);
|
|
// 8 is the number of parameters: position+momentum + TIME (parameter [7]
|
|
// in an array starting at [0])
|
|
|
|
G4ChordFinder* pChordFinder = new G4ChordFinder( GField,
|
|
1e-10 * mm, // Minimum step size: must be set to a very small value for a correct calculation of the enrgy
|
|
pStepper);
|
|
|
|
GFieldMgr->SetDetectorField(GField,false);
|
|
GFieldMgr->SetChordFinder(pChordFinder);
|
|
|
|
lv_MCPV = new G4LogicalVolume( MCPV_tube, Vacuum ,"lv_MCPV",GFieldMgr,0,0);
|
|
|
|
|
|
#ifdef DEBUG_INTERPOLATING_FIELD
|
|
//**************************************************************************//
|
|
G4double Efield[3];
|
|
G4double position[4];
|
|
position[0]=0*mm;
|
|
position[1]=0*mm;
|
|
position[2]=-103*mm;
|
|
position[3]=0*mm;
|
|
GField->GetFieldValue(position,Efield);
|
|
do
|
|
{
|
|
G4cout<<"Position? "<<G4endl;
|
|
G4cin>>position[0]>>position[1]>>position[2]>>position[3];
|
|
GField->GetFieldValue(position,Efield);
|
|
G4cout<<"Field E Value " << G4BestUnit(Efield[0]*meter,"Electric potential") <<"/m " <<Efield[1]/volt*meter <<" V/m "<< Efield[2]/volt*meter <<" V/m " <<G4endl;
|
|
|
|
}while(position[3]!=-1);
|
|
//*************************************************************************//
|
|
#endif
|
|
}
|
|
|
|
|
|
// 2 case of electro magnetic field
|
|
|
|
G4UniformMagField* mcField;
|
|
|
|
if(magfield==1)
|
|
{
|
|
|
|
#ifdef LEMU_TRANSVERSE_FIELD
|
|
mcField = new LEMuSRMagneticField(G4ThreeVector(0.,B*gauss,0.));
|
|
G4cout<<"Transverse Field Applied: (0 G, " <<B <<"G, 0 G) \n"<<G4endl;
|
|
//sleep(3); // wait 3 seconds
|
|
#else
|
|
mcField = new LEMuSRMagneticField(G4ThreeVector(0.,0.,B*gauss));
|
|
G4cout<<"Longtudinal Field Applied: (0 G, 0 G, " <<B <<"G) \n"<<G4endl;
|
|
//sleep(3); // wait 3 seconds
|
|
#endif
|
|
|
|
|
|
|
|
G4MagneticField* EMField = new LEMuSRElMagField(GField,mcField,1.,1.);
|
|
|
|
LEMuSRElMag_SpinEqRhs *ElMag_SpinEqRhs = new LEMuSRElMag_SpinEqRhs(EMField);
|
|
|
|
G4MagIntegratorStepper *EMStepper;
|
|
|
|
EMStepper = new G4ClassicalRK4( ElMag_SpinEqRhs,12 );
|
|
|
|
G4ChordFinder* EMChordFinder = new G4ChordFinder(EMField,
|
|
1e-10 * mm,
|
|
EMStepper );
|
|
|
|
G4FieldManager* EMFieldMgr = new G4FieldManager(); // 1
|
|
|
|
EMFieldMgr->SetDetectorField(EMField,true);
|
|
EMFieldMgr->SetChordFinder(EMChordFinder);
|
|
EMFieldMgr->SetFieldMagComponent(true);
|
|
|
|
|
|
lv_MCPV = new G4LogicalVolume( MCPV_tube , Vacuum ,"lv_MCPV",EMFieldMgr,0,0);
|
|
|
|
|
|
//////////////////
|
|
#ifdef DEBUG_INTERPOLATING_FIELD
|
|
G4double EBfield[6];
|
|
G4double position[4];
|
|
position[0]=0*mm;
|
|
position[1]=0*mm;
|
|
position[2]=-300.*mm;
|
|
position[3]=0;
|
|
GField->GetFieldValue(position,EBfield);
|
|
do
|
|
{
|
|
|
|
EMField->GetFieldValue(position,EBfield);
|
|
G4cout<<position[0]<<" "<<position[1]<<" "<<position[2]<<G4endl;
|
|
G4cout<<"Field EM Field Value " << EBfield[0]/gauss <<"gauss " <<EBfield[1]/gauss <<"gauss "<< EBfield[2]/gauss <<"gauss \n"
|
|
<< EBfield[3]/volt*meter <<"V/m " <<EBfield[3]/volt*meter <<"V/m "<< EBfield[5]/volt*meter <<"V/m \n" <<G4endl;
|
|
position[2]+=10.*mm;
|
|
}while(position[2]<300);
|
|
#endif
|
|
/////////////////
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(anode_elfield == 0)
|
|
{
|
|
// 3 pure magnetic field
|
|
if(magfield==1)
|
|
{
|
|
|
|
G4UniformMagField* mcField;
|
|
|
|
|
|
#ifdef LEMU_TRANSVERSE_FIELD
|
|
mcField = new LEMuSRMagneticField(G4ThreeVector(0.,B*gauss,0.));
|
|
G4cout<<"Longitudinal Field Applied: (0 G, " <<B <<"G, 0 G) \n"<<G4endl;
|
|
//sleep(3); // wait 3 seconds
|
|
#else
|
|
mcField = new LEMuSRMagneticField(G4ThreeVector(0.,0.,B*gauss));
|
|
G4cout<<"Transverse Field Applied: (0 G, 0 G, " <<B <<"G) \n"<<G4endl;
|
|
//sleep(3); // wait 3 seconds
|
|
#endif
|
|
|
|
|
|
LEMuSRMag_SpinEqRhs *Mag_SpinEqRhs;
|
|
G4MagIntegratorStepper *pStepper;
|
|
Mag_SpinEqRhs = new LEMuSRMag_SpinEqRhs(mcField);
|
|
pStepper = new G4ClassicalRK4( Mag_SpinEqRhs,12 );
|
|
|
|
// equation considers spin or not
|
|
G4ChordFinder* pChordFinder = new G4ChordFinder(mcField,
|
|
1.e-10* mm,
|
|
pStepper );
|
|
|
|
G4FieldManager* mcFieldMgr = new G4FieldManager(); // 1
|
|
// G4TransportationManager::GetTransportationManager()->GetFieldManager(); // 2
|
|
mcFieldMgr->SetDetectorField(mcField,true);
|
|
mcFieldMgr->SetChordFinder(pChordFinder);
|
|
mcFieldMgr->SetFieldMagComponent(true);
|
|
lv_MCPV = new G4LogicalVolume( MCPV_tube , Vacuum ,"lv_MCPV",mcFieldMgr,0,0);
|
|
}
|
|
if(magfield==0)
|
|
{
|
|
// 4 no field at all
|
|
lv_MCPV = new G4LogicalVolume( MCPV_tube , Vacuum ,"lv_MCPV",0,0,0);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LEMuSRDetectorConstruction::buildCryoField()
|
|
{
|
|
// sample ELECTRIC field
|
|
// G4double d= cryoFieldLength*cm;
|
|
// G4double V= cryoVoltage*kilovolt;
|
|
|
|
// G4ThreeVector C_field(0.,0.,-V/d);
|
|
|
|
G4String dir= FieldMapsDir;
|
|
|
|
int k=2*Grid+Guards;
|
|
switch(k)
|
|
{
|
|
|
|
case 0:
|
|
dir+="/MCPV-80-80-200/No_Grid_NoGuards/"; break;
|
|
|
|
case 1:
|
|
dir+="/MCPV-80-80-200/No_Grid_Guards/"; break;
|
|
|
|
case 2:
|
|
dir+="/MCPV-80-80-200/Grid_NoGuards/"; break;
|
|
|
|
case 3:
|
|
dir+="/MCPV-80-80-200/Grid_Guards/"; break;
|
|
|
|
default: break;
|
|
}
|
|
|
|
|
|
G4String filename="SAMPLE.map";
|
|
|
|
G4String fmap=dir+filename;
|
|
|
|
cryoField = new LEMuSRElectricField(cryoVoltage,fmap,"mm",0.0,80,80,200);//offset in milimeters)
|
|
|
|
|
|
#ifdef DEBUG_INTERPOLATING_FIELD
|
|
|
|
G4double Efield[3];
|
|
G4double position[4];
|
|
position[0]=0*mm;
|
|
position[1]=0*mm;
|
|
position[2]=-100.*mm;
|
|
position[3]=0;
|
|
cryoField->GetFieldValue(position,Efield);
|
|
do
|
|
{
|
|
cryoField->GetFieldValue(position,Efield);
|
|
G4cout<<position[0]<<" "<<position[1]<<" "<<position[2]<<G4endl;
|
|
G4cout<<"Field E Value " << G4BestUnit(Efield[0]*meter,"Electric potential") <<"/m " <<Efield[1]/volt*meter <<" V/m "<< Efield[2]/volt*meter <<" V/m " <<G4endl;
|
|
position[2]+=1.*mm;
|
|
}while(position[2]<20);
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void LEMuSRDetectorConstruction::NEWMAPS()
|
|
{
|
|
|
|
// FIELD IN THE ANODE
|
|
// left
|
|
LEMuSRElectricField* LEFTMAP =
|
|
new LEMuSRElectricField(1,
|
|
FieldMapsDir+"/MCPV-80-80-200/Grid_NoGuards/RAL_Ex.txt",
|
|
FieldMapsDir+"/MCPV-80-80-200/Grid_NoGuards/RAL_Ey.txt",
|
|
FieldMapsDir+"/MCPV-80-80-200/Grid_NoGuards/RAL_Ez.txt",
|
|
"mm",0.0,80,80,200);//offset in milimeters
|
|
|
|
// right
|
|
LEMuSRElectricField* RIGHTMAP =
|
|
new LEMuSRElectricField(1,
|
|
FieldMapsDir+"/MCPV-80-80-200/Grid_NoGuards/RAR_Ex.txt",
|
|
FieldMapsDir+"/MCPV-80-80-200/Grid_NoGuards/RAR_Ey.txt",
|
|
FieldMapsDir+"/MCPV-80-80-200/Grid_NoGuards/RAR_Ez.txt",
|
|
"mm",0.0,80,80,200);//offset in milimeters
|
|
|
|
|
|
|
|
// sample ELECTRIC field
|
|
|
|
LEMuSRElectricField* SAMPLEMAP =
|
|
new LEMuSRElectricField(1,
|
|
FieldMapsDir+"/MCPV-80-80-200/Grid_NoGuards/SAMPLE_Ex.txt",
|
|
FieldMapsDir+"/MCPV-80-80-200/Grid_NoGuards/SAMPLE_Ey.txt",
|
|
FieldMapsDir+"/MCPV-80-80-200/Grid_NoGuards/SAMPLE_Ez.txt",
|
|
"mm",0.0,80,80,200);//offset in milimeters)
|
|
|
|
|
|
|
|
|
|
delete LEFTMAP;
|
|
delete RIGHTMAP;
|
|
delete SAMPLEMAP;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LEMuSRDetectorConstruction::PrintStatus()
|
|
{
|
|
G4cout<<G4endl
|
|
<<" Detector Status " <<G4endl;
|
|
|
|
|
|
G4cout<<"magfield " << magfield <<G4endl
|
|
<<"elfield " <<elfield <<G4endl
|
|
<<"anode_elfield " <<anode_elfield <<G4endl
|
|
<<"trigger_field " <<trigger_field <<G4endl
|
|
<<"B " <<B <<G4endl
|
|
<<"GRID " <<Grid <<G4endl
|
|
<<"GUARDS " <<Guards <<G4endl
|
|
<<G4endl;
|
|
|
|
if(FieldMapsDir)
|
|
{
|
|
G4cout<<"Fied Maps Directory is: "<< FieldMapsDir<<endl;
|
|
}
|
|
else
|
|
{
|
|
G4cout<<"Fied Maps Directory is not defined!!!"<<endl;//sleep(10);
|
|
}
|
|
}
|