//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//* // 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 // 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<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 asymcheck==1 then build a spherical detector around mcp chamber to test the asymmetry. Shall be modified in the future. if(AsymCheck==1) { lemuAsym(); } //! If asymcheck==0 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 LEMU_TEST_FOCAL_LENGTH 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 cryo, mcp and scint are set to 1 as soon as the sensitive detector is built. */ if(mcdetector==0) //! If mcdetector==0 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 mcdetector==1then 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"<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 = "<GetFieldValue(position,Efield); do { GField->GetFieldValue(position,Efield); G4cout<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? "<>position[0]>>position[1]>>position[2]>>position[3]; GField->GetFieldValue(position,Efield); G4cout<<"Field E Value " << G4BestUnit(Efield[0]*meter,"Electric potential") <<"/m " <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<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<