musrsim/geant4/LEMuSR/src/TDCheck.cc
2006-02-16 17:20:45 +00:00

257 lines
6.2 KiB
C++

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//*
// LOW ENERGY MUON SPIN RELAXATION, ROTATION, RADIATION
//
// ID :TDCheck.cc , v 1.2
// AUTHOR: Taofiq PARAISO
// DATE : 2005-03-01 10:07
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
//
// & &&&&&&&&&& &&&&&&& &&&&&&&&
// & & && && & &&
// & & & & & & &&
// & &&&&&&& & & &&&&&& &&&&&&&&
// & & & && & & &&
// & & && & & && && & &
// &&&&&&&&&& &&&&&&&&&& & &&&&& && &&&&&&& & &&
// &
// &
// &
// &
// TDCHECK
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
#include "TDCheck.hh"
#include "G4SteppingManager.hh"
#include "G4Transform3D.hh"
#include "G4DynamicParticle.hh"
#include "G4UnitsTable.hh"
#include "LEMuSRDetectorConstruction.hh"
#include "LEMuSRPrimaryGeneratorAction.hh"
TDCheck::TDCheck()
{
BookRoot();
muon.thickness=0;
pointer=this ;
loop=0;
oldz=0;
thk_old=0;
id=0;
old_id=0;
loop=0;
}
TDCheck::~TDCheck()
{
WriteRoot();
}
TDCheck* TDCheck::pointer=0;
TDCheck* TDCheck::GetInstance()
{
return pointer;
}
void TDCheck::UserSteppingAction(const G4Step* aStep)
{
if( aStep->GetPreStepPoint()&& aStep->GetPreStepPoint()->GetPhysicalVolume() )
{
SetParticleVolumeNames(aStep);
if(CheckCondition(aStep))
{
// Get datas
SetPositionMomentum(aStep);
SetTimeEnergy(aStep);
Update();
FillRoot();
#if defined G4UI_USE_ROOT
myFile->Write();
#endif
}
LoopKiller(aStep);
}
}
G4bool TDCheck::CheckCondition(const G4Step* )
{
G4bool condition=false;
if(v_name=="lv_CFOIL" )
{
if(p_name=="Mu" || p_name == "mu+")
{
condition=true;
}
}
if(v_name=="lv_SAH2" )
{
if(p_name=="Mu" || p_name == "mu+")
{
condition=true;
}
}
return condition;
}
void TDCheck::LoopKiller(const G4Step *aStep)
{
// loop killa
if(aStep->GetStepLength()<0.1*mm)
{
loop++;
if(loop>20)
{
aStep->GetTrack()->SetTrackStatus(fStopAndKill);
loop=0;
}
}
// kill useless particles
if(aStep->GetTrack()->GetDefinition()->GetParticleName()=="e-"
||aStep->GetTrack()->GetDefinition()->GetParticleName()=="gamma")
{
// if(aStep->GetTrack()->GetKineticEnergy()<10.*eV)
// {
aStep->GetTrack()->SetTrackStatus(fStopAndKill);
// }
}
}
void TDCheck::SetParticleVolumeNames(const G4Step* aStep)
{
// NAMES
p_name = aStep->GetTrack()->GetDefinition()->GetParticleName(); // particle name
v_name = aStep->GetPreStepPoint()->GetPhysicalVolume()->GetLogicalVolume()->GetName();
pv_name = aStep->GetPreStepPoint()->GetPhysicalVolume()->GetName();
}
void TDCheck::SetPositionMomentum(const G4Step* aStep)
{
// POSITION, MOMENTUM
position = aStep->GetPreStepPoint()->GetPosition(); // position
momentum = aStep->GetPostStepPoint()->GetMomentumDirection(); // momentum
momentum_direction = aStep->GetPreStepPoint()->GetMomentumDirection(); // momentum
}
void TDCheck::SetTimeEnergy(const G4Step* aStep)
{
// ENERGY
kenergy= aStep->GetTrack()->GetDynamicParticle()->GetKineticEnergy(); // position
tenergy= aStep->GetTrack()->GetDynamicParticle()->GetTotalEnergy(); // position
// TIME
localtime = (aStep->GetPreStepPoint()->GetLocalTime()+ aStep->GetPreStepPoint()->GetLocalTime())/2.; // time since track creation
globaltime = aStep->GetPreStepPoint()->GetGlobalTime();// time since event creation
proptime = aStep->GetPreStepPoint()->GetProperTime(); // proper time of the particle
time = proptime;
}
void TDCheck::Update()
{
muon.localtime = localtime/ns ;
muon.globaltime= globaltime/ns ;
muon.proptime = proptime/ns ;
muon.positionx = LEMuSRPrimaryGeneratorAction::GetPGA()->X/cm; // position.x()/cm;
muon.positiony = LEMuSRPrimaryGeneratorAction::GetPGA()->Y/cm; //position.y()/cm;
muon.positionz = position.z()/cm;
muon.momdirx= LEMuSRPrimaryGeneratorAction::GetPGA()->angle/rad;//momentum_direction.x();
muon.momdiry= LEMuSRPrimaryGeneratorAction::GetPGA()->radius/cm; //momentum_direction.y();
muon.momdirz= momentum_direction.z();
muon.tenergy = kenergy/keV;
muon.thickness = LEMuSRDetectorConstruction::GetInstance()->cfthk;
muon.angle=0;
muon.index=0;
muon.ienergy= LEMuSRPrimaryGeneratorAction::GetPGA()->energy/keV;
muon.angle=acos(momentum.z())*180/M_PI;
/////////////////
/*
G4cout << "particle name : " << p_name <<" ;\n "
<< "position : " << position <<" ;\n "
<< "momentum direction: " <<momentum_direction <<" ;\n "
<< "time : " << globaltime/ns <<" ;\n "
<<std::endl;
*/
//////////////////
if( G4RunManager::GetRunManager()->GetCurrentRun()->GetRunID()!=old_id)
{
id=id+1;
old_id= G4RunManager::GetRunManager()->GetCurrentRun()->GetRunID();
}
if( LEMuSRDetectorConstruction::GetInstance()->cfthk!=thk_old)
{
id=0;
thk_old=LEMuSRDetectorConstruction::GetInstance()->cfthk;
}
muon.id = G4RunManager::GetRunManager()->GetCurrentRun()->GetRunID();
if(p_name=="Mu") muon.charge=0;
else if(p_name=="mu+") muon.charge=1;
}
//--------------------------------------------------------------------------------//
// ROOT
void TDCheck::BookRoot()
{
myFile = new TFile("gfoil.root", "RECREATE");
tree = new TTree ("tree","Muons parameters");
tree->Branch("muon",&muon.ienergy,"Init_Energy/F:kenergy/F:localtime/F:globaltime:propertime/F:positionx/F:positiony:positionz:init_angle:init_radius:momdirz:Angle/F:Plane/I:foil_thickness/F:runID/I:Charge/I");
}
void TDCheck::FillRoot()
{
tree->Fill();
}
void TDCheck::WriteRoot()
{
myFile->Write();
myFile->Close();
}