musrsim/geant4/TaoLEMuSR/src/LEMuSRDetectorMessenger.cc
2008-03-20 09:23:20 +00:00

462 lines
13 KiB
C++

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//*
// LOW ENERGY MUON SPIN RELAXATION, ROTATION, RADIATION
//
// ID : LEMuSRDetectorMessenger.cc , v 1.2
// AUTHOR: Taofiq PARAISO
// DATE : 2004-08-20 10:20
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
//
// & &&&&&&&&&& &&&&&&& &&&&&&&&
// & & && && & &&
// & & & & & & &&
// & &&&&&&& & & &&&&&& &&&&&&&&
// & & & && & & &&
// & & && & & && && & &
// &&&&&&&&&& &&&&&&&&&& & &&&&& && &&&&&&& & &&
// &
// &
// &
// &
// DETECTOR MESSENGER
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
#include "LEMuSRDetectorMessenger.hh"
#include "LEMuSRDetectorConstruction.hh"
//
// process remove
#include "G4ParticleTable.hh"
#include "G4ParticleDefinition.hh"
#include "G4ParticleChange.hh"
#include "G4ProcessVector.hh"
#include "G4ProcessManager.hh"
#include "G4VProcess.hh"
LEMuSRDetectorMessenger::LEMuSRDetectorMessenger(LEMuSRDetectorConstruction *lemuDetector)
{
theDetector=lemuDetector;
DetMode = new G4UIdirectory("/Detector/");
DetMode->SetGuidance("Set detector parameters");
// commands
SetDetMode = new G4UIcmdWithAString("/Detector/Mode",this);
SetDetMode->SetGuidance("\n mcp: multiple channel mode \n cryo: cryostat mode ");
SetDetMode->SetParameterName("mode",false);
SetDetMode->SetDefaultValue("mcp");
SetDetMode->AvailableForStates(G4State_PreInit,G4State_Idle);
// commands
// El field on/off
SetElField = new G4UIcmdWithAString("/Detector/ElectricField",this);
SetElField->SetGuidance("\n on: electric field on \n off: electric field off ");
SetElField->SetParameterName("field",false);
SetElField->SetDefaultValue("on");
SetElField->AvailableForStates(G4State_PreInit,G4State_Idle);
// Grid on/off
SetGrid = new G4UIcmdWithAString("/Detector/Sample/Grid",this);
SetGrid->SetGuidance("\n on: Sample Grid on \n off: Sample Grid off ");
SetGrid->SetParameterName("grid",false);
SetGrid->SetDefaultValue("on");
SetGrid->AvailableForStates(G4State_PreInit,G4State_Idle);
// Guards on/off
SetGuards = new G4UIcmdWithAString("/Detector/Sample/Guards",this);
SetGuards->SetGuidance("\n on: Sample Guards Rings on \n off: Sample Guards off ");
SetGuards->SetParameterName("guards",false);
SetGuards->SetDefaultValue("on");
SetGuards->AvailableForStates(G4State_PreInit,G4State_Idle);
// ASYM
SetAsymCheck = new G4UIcmdWithAString("/Detector/AsymCheck",this);
SetAsymCheck->SetGuidance("\n on: asym on \n off:asym off ");
SetAsymCheck->SetParameterName("asym",false);
SetAsymCheck->SetDefaultValue("on");
SetAsymCheck->AvailableForStates(G4State_PreInit,G4State_Idle);
// SAH MATERIAL
SetSAHmaterial = new G4UIcmdWithAString("/Detector/Sample/HolderMaterial",this);
SetSAHmaterial->SetGuidance("\n Sample material");
SetSAHmaterial->SetParameterName("material",false);
SetSAHmaterial->SetDefaultValue("copper");
SetSAHmaterial->AvailableForStates(G4State_PreInit,G4State_Idle);
// ELECTRIC POTENTIALS
SetThirdLensPotential = new G4UIcmdWithADouble("/Detector/Voltage/ThirdLens",this);
SetThirdLensPotential->SetGuidance("\n Third Lens Middle Cylinder Voltage Value >> IN KILOVOLT ");
SetThirdLensPotential->SetParameterName("f",false);
SetThirdLensPotential->SetDefaultValue(1);
SetThirdLensPotential->AvailableForStates(G4State_PreInit,G4State_Idle);
SetMagField = new G4UIcmdWithADouble("/Detector/MagneticField",this);
SetMagField->SetGuidance("\n Magnetic Field Max Value >>> in GAUSS ");
SetMagField->SetParameterName("f",false);
SetMagField->SetDefaultValue(100);
SetMagField->AvailableForStates(G4State_PreInit,G4State_Idle);
SetRAPotential = new G4UIcmdWith3Vector("/Detector/Voltage/ConicalAnode",this);
SetRAPotential->SetGuidance("\n Conical anode left and right side Voltage Values >> IN KILOVOLT; set build to !=0 to build the detector ");
SetRAPotential->SetParameterName("RA-Left Voltage [kV]","RA-Right Voltage [kV]","Build",false,true);
SetRAPotential->SetDefaultValue(Hep3Vector(8.1,8.1,1.0));
SetRAPotential->AvailableForStates(G4State_PreInit,G4State_Idle);
SetCryoPotential = new G4UIcmdWithADouble("/Detector/Voltage/Cryo",this);
SetCryoPotential->SetGuidance("\n Cryo voltage in kV ");
SetCryoPotential->SetParameterName("Voltage [kV]",true,true);
SetCryoPotential->SetDefaultValue(7.2);
SetCryoPotential->AvailableForStates(G4State_PreInit,G4State_Idle);
SetDetVisualization = new G4UIcmdWithAString("/Detector/View",this);
SetDetVisualization->SetGuidance("\n quarter: quarter cut view of the detector \n half: half cut view of the detector \n total: view of the total detector ");
SetDetVisualization->SetParameterName("view",false);
SetDetVisualization->SetDefaultValue("total");
SetDetVisualization->AvailableForStates(G4State_PreInit,G4State_Idle);
SetFieldStepLim = new G4UIcmdWithADouble("/Detector/MaxStepInField",this);
SetFieldStepLim->SetGuidance("\n The user step limitation in third lens chamber and sample chamber [mm] ");
SetFieldStepLim->SetParameterName("usl",false);
SetFieldStepLim->SetDefaultValue(10.);
SetFieldStepLim->AvailableForStates(G4State_PreInit,G4State_Idle);
// Carbon Foil
SetCFthk = new G4UIcmdWithADouble("/Detector/CfoilThickness",this);
SetCFthk->SetGuidance("\n Carbon foil thickness; unit is mug/cm2 ");
SetCFthk->SetParameterName("f",false);
SetCFthk->SetDefaultValue(1.0);
SetCFthk->AvailableForStates(G4State_PreInit,G4State_Idle);
}
LEMuSRDetectorMessenger::~LEMuSRDetectorMessenger()
{
delete theDetector;
delete DetMode;
delete SetMagField;
delete SetThirdLensPotential;
delete SetCFthk;
delete SetCryoPotential;
delete SetRAPotential;
delete SetElField;
delete SetGrid;
delete SetGuards;
delete SetFieldCheck;
delete SetAsymCheck;
delete SetDetMode;
delete SetDetVisualization;
delete SetFieldStepLim;
delete SetSAHmaterial;
}
void LEMuSRDetectorMessenger::SetNewValue(G4UIcommand* command, G4String newvalue)//MUST have the name SetNewValue:: inherited method from messenger class.
{
//G4UImanager* UI = G4UImanager::GetUIpointer();
if(command == SetDetMode)
{
if(newvalue=="mcp")
{
theDetector->mcdetector=1;
}
else if(newvalue=="cryo")
{
theDetector->mcdetector=0;
}
else
{
G4cout << "Unknown command: please check value."<<G4endl;
}
G4cout << "About to build new detector."<<G4endl;
newDetector = theDetector->Construct();
G4cout << "New detector built."<<G4endl;
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
G4cout << " runmanager updated\n" ;
// Actualisation du visualiseur
//UI ->ApplyCommand("/vis/viewer/refresh") ;
//UI ->ApplyCommand("/vis/viewer/update");
}
else if(command == SetThirdLensPotential)
{
if(SetThirdLensPotential->GetNewDoubleValue(newvalue)!=0.)
{
theDetector->elfield=1;
theDetector->L3FieldVal=SetThirdLensPotential->GetNewDoubleValue(newvalue);
}
else if(SetThirdLensPotential->GetNewDoubleValue(newvalue)==0.)
{
theDetector->elfield=0;
}
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
}
else if(command == SetMagField)
{
if(SetMagField->GetNewDoubleValue(newvalue)!=0.)
{
theDetector->magfield=1;
theDetector->B=SetMagField->GetNewDoubleValue(newvalue);
}
else if(SetMagField->GetNewDoubleValue(newvalue)==0.)
{
theDetector->magfield=0;
}
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
}
else if(command == SetSAHmaterial)
{
if(G4Material::GetMaterial(newvalue))
{
theDetector->Material_SAH=newvalue;
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
}
else
{
G4cout<<":-? Material "<<newvalue<<" not found!!!"<<G4endl;
G4cout<<"Sample holder material is still "
<<theDetector->Material_SAH<<"."<<G4endl;
}
}
else if(command == SetCFthk)
{
theDetector->cfthk=SetCFthk->GetNewDoubleValue(newvalue);
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
G4cout<<"Thickness: " << LEMuSRDetectorConstruction::GetInstance()->cfthk<<G4endl;
}
else if(command == SetRAPotential)
{
G4double ral, rar, build;
ral = SetRAPotential->GetNew3VectorValue(newvalue).x();
rar = SetRAPotential->GetNew3VectorValue(newvalue).y();
build = SetRAPotential->GetNew3VectorValue(newvalue).z();
theDetector->RALval=ral;
theDetector->RARval=rar;
G4cout<<"Conical anode Voltage:\n RA-L: "<< ral <<"[kV] RA-R: "<<rar <<" [kV]"<<G4endl;
theDetector->anode_elfield=1;
if(build!=0.0)
{
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
}
else
{
G4cout<<"\n ~~~~~~~~~~~~~ATTENTION:: DETECTOR NOT BUILT~~~~~~~~~~~~"<<G4endl;
}
}
else if(command == SetCryoPotential)
{
G4double V;
V = SetCryoPotential->GetNewDoubleValue(newvalue);
theDetector->cryoVoltage=V;
G4cout<<"Cryo Voltage:\n V: "<< V <<"[kV]"<<G4endl;
theDetector->anode_elfield=1;
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
}
else if(command == SetElField)
{
if(newvalue=="on")
{
// theDetector->elfield=1;
// theDetector->anode_elfield=1;
theDetector->trigger_field=1;
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
G4cout<<"THIS COMMAND ONLY ENABLES THE TRIGGER FIELD.\n"
<<"TO SET THE ELECTROSTATIC LENSES PLEASE USE THE /Detector/Voltage COMMANDS."<<G4endl;
}
else if(newvalue=="off")
{
theDetector->elfield=0;
theDetector->anode_elfield=0;
theDetector->trigger_field=0;
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
G4cout<<"ALL ELECTRIC FIELDS ARE NOW DISABLED."<<G4endl;
}
else
{
G4cout<<"UNRECOGNIZED COMMAND PLEASE ENTER on OR off."<<G4endl;
}
}
// SAMPLE GRID
else if(command == SetGrid)
{
if(newvalue=="on")
{
theDetector->Grid=1;
}
else if(newvalue=="off")
{
theDetector->Grid=0;
}
G4cout<<"SAMPLE CRYOSTAT:: GRID ON ==>> DON'T FORGET TO REBUILD DETECTOR"<<G4endl;
}
// SAMPLE GUARDS
else if(command == SetGuards)
{
if(newvalue=="on")
{
theDetector->Guards=1;
}
else if(newvalue=="off")
{
theDetector->Guards=0;
}
G4cout<<"SAMPLE CRYOSTAT:: GUARDS ON ==>> DON'T FORGET TO REBUILD DETECTOR"<<G4endl;
}
else if(command == SetFieldStepLim)
{
theDetector->FieldStepLim=SetFieldStepLim->GetNewDoubleValue(newvalue)*mm;
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
}
else if(command == SetAsymCheck)
{
if(newvalue=="on")
{
theDetector->AsymCheck=1;
}
else if(newvalue=="off")
{
theDetector->AsymCheck=0;
}
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
}
else if(command == SetDetVisualization)
{
if(newvalue=="total")
{
theDetector->dSPhi=0.*deg;
theDetector->dEPhi=360.*deg;
theDetector->halfview=0;
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
G4cout << " \n TOTAL GEOMETRY IS LOADED. \n" ;
}
else if(newvalue=="half")
{
theDetector->dSPhi=90.*deg;
theDetector->dEPhi=180.*deg;
theDetector->halfview=1;
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
G4cout << " \n !!! BEFORE '/run/beamOn' :: PLEASE ENSURE TOTAL GEOMETRY IS LOADED !!! \n" ;
}
else if(newvalue=="quarter")
{
theDetector->dSPhi=0.*deg;
theDetector->dEPhi=270.*deg;
theDetector->halfview=1;
newDetector = theDetector->Construct();
G4RunManager::GetRunManager()->DefineWorldVolume(newDetector);
G4cout << " \n !!! BEFORE '/run/beamOn' :: PLEASE ENSURE TOTAL GEOMETRY IS LOADED !!! \n" ;
}
else
{
G4cout << "Unknown command: please check value is total/quarter/half ."<<G4endl;
}
// Update visualization
//UI ->ApplyCommand("/vis/viewer/refresh") ;
//UI ->ApplyCommand("/vis/viewer/update");
}
else
{
G4cout << "Unknown command: please check value."<<G4endl;
}
}