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

236 lines
5.9 KiB
C++

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//*
// LOW ENERGY MUON SPIN RELAXATION, ROTATION, RADIATION
//
// ID :LEMuSRCryoSD.cc , v 1.2
// AUTHOR: Taofiq PARAISO
// DATE : 2006-01-19 15:17
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
//
// & &&&&&&&&&& &&&&&&& &&&&&&&&
// & & && && & &&
// & & & & & & &&
// & &&&&&&& & & &&&&&& &&&&&&&&
// & & & && & & &&
// & & && & & && && & &
// &&&&&&&&&& &&&&&&&&&& & &&&&& && &&&&&&& & &&
// &
// &
// &
// &
// CRYOSD
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//
#include "LEMuSRCryoSD.hh"
#include "LEMuSRDetectorConstruction.hh"
#include "G4HCofThisEvent.hh"
#include "G4TouchableHistory.hh"
#include "G4Track.hh"
#include "G4Step.hh"
#include "G4ios.hh"
#include "G4VProcess.hh"
// ROOT
#include "TROOT.h"
#include "TApplication.h"
#include "TSystem.h"
#include "TH1.h"
#include "TPad.h"
#include "TCanvas.h"
LEMuSRCryoSD::LEMuSRCryoSD(G4String name)
:G4VSensitiveDetector(name)
{
G4String HCname;
collectionName.insert(HCname="CryoCollection");
positionResolution = 1*mm;
// ROOT
BookRoot();
}
LEMuSRCryoSD::~LEMuSRCryoSD()
{
// ROOT
WriteRoot();
}
void LEMuSRCryoSD::Initialize(G4HCofThisEvent* HCE)
{
static int HCID = -1;
CryoCollection = new LEMuSRCryoHitsCollection
(SensitiveDetectorName,collectionName[0]);
if(HCID<0)
{ HCID = GetCollectionID(0); }
HCE->AddHitsCollection(HCID,CryoCollection);
}
G4bool LEMuSRCryoSD::ProcessHits(G4Step* aStep, G4TouchableHistory*)
{
// G4cout << "PROCESS HIT"<<G4endl;
mu=0;e=0;g=0;
// LEMuSRCryoHit* aHit;
p_name = aStep->GetTrack()->GetDefinition()->GetParticleName(); // particle name
if(p_name=="mu+")mu=1;
if(p_name=="Mu")e=1;
// G4cout<<"mu+ "<< mu <<" mu "<<e;
if( CheckCondition(aStep))
{
GetDatas(aStep);
getHit();
FillRoot();
}
/* Obsolete: to be removed
// Define Hit
aHit = new LEMuSRCryoHit();
//++++++++++++++ set hit values _______________
aHit->SetParticleName(p_name);
aHit->SetSpin(spin);
aHit->SetMomentum( hitmom );
aHit->SetPosition( hitpos );
aHit->SetTimeOfFlight( tof);
aHit->SetEnergyDeposition( edep );
CryoCollection->insert( aHit );
// aHit->Print();
// aHit->print("Statistics/SCIS.Hits");
aHit->Draw();
PrintAll();
*/
return true;
}
void LEMuSRCryoSD::EndOfEvent(G4HCofThisEvent*)
{
// G4int NbHits = CryoCollection->entries();
// G4cout << "\n-------->Hits Collection: in this event they are " << NbHits
// << " hits in the cryo: " << G4endl;
// for (G4int i=0;i<NbHits;i++) (*CryoCollection)[i]->Print();
}
G4bool LEMuSRCryoSD::CheckCondition(const G4Step* aStep)
{
G4bool condition=false;
if(p_name == "mu+"||p_name == "Mu")
{
if(aStep->GetTrack()->GetNextVolume()->GetLogicalVolume()->GetName()=="lv_SAH2")
{
condition=true;
}
}
return condition;
}
void LEMuSRCryoSD::clear()
{
delete CryoCollection;
}
void LEMuSRCryoSD::DrawAll()
{
}
void LEMuSRCryoSD::PrintAll()
{
}
void LEMuSRCryoSD::GetDatas(const G4Step *aStep)
{
// Get datas
//a Volume, name, spin
vname = aStep->GetPreStepPoint()->GetPhysicalVolume()->GetName();
spin= aStep->GetTrack()->GetDefinition()->GetPDGSpin(); // spin in units of 1
//b Position momentum
hitpos = aStep->GetPreStepPoint()->GetPosition(); // position
hitmom = aStep->GetPreStepPoint()->GetMomentum(); // momentum
//c Times
tof = aStep->GetPreStepPoint()->GetLocalTime(); // time since track creation
globaltime = aStep->GetPreStepPoint()->GetGlobalTime();// time since event creation
proptime = aStep->GetPreStepPoint()->GetProperTime(); // particle's proper time
//d Energy
edep = aStep->GetTotalEnergyDeposit();
toten = aStep->GetTrack()->GetTotalEnergy();
kinen = aStep->GetTrack()->GetKineticEnergy();
}
void LEMuSRCryoSD::getHit()
{
theHit.kenergy = kinen/keV;
theHit.tenergy = toten/keV;
theHit.edeposit = edep/keV;
theHit.localtime = tof/ns;
theHit.globaltime = globaltime/ns;
theHit.proptime = proptime/ns;
theHit.positionx = hitpos.x()/mm;
theHit.positiony = hitpos.y()/mm;
theHit.positionz = hitpos.z()/mm;
theHit.momdirx = hitmom.x();
theHit.momdiry = hitmom.y();
theHit.momdirz = hitmom.z();
theHit.foil = LEMuSRDetectorConstruction::GetInstance()->cfthk;
theHit.muon = mu;
theHit.positron = e;
theHit.gamma = g;
theHit.runid = G4RunManager::GetRunManager()->GetCurrentRun()->GetRunID();
theParticle.muon = mu;
theParticle.positron = e;
theParticle.gamma = g;
theParticle.runid = G4RunManager::GetRunManager()->GetCurrentRun()->GetRunID();
}
// ROOT METHODS
void LEMuSRCryoSD::BookRoot()
{
// open root file
myFile = new TFile("SDCryoE0.root", "RECREATE");
// myFile->SetCompressionLevel(1);
tree = new TTree ("tree"," Cryo Datas");
tree->Branch("cryoHit",&theHit.kenergy,"kenergy/F:tenergy/F:edeposit/F:localtime/F:globaltime:propertime/F:positionx/F:positiony:positionz:momdirx:momdiry:momdirz/F:foil/F:muon/I:muonium/I:gamma/I:runID/I");
tree->Branch("particle",&theParticle.muon,"muon/I:muonium/I:gamma/I:runID/I");
}
void LEMuSRCryoSD::FillRoot()
{
tree->Fill();
}
void LEMuSRCryoSD::WriteRoot()
{
myFile->Write();
myFile->Close();
}