CLARION2_GEANT4/CloverEventAction.cc
2022-12-15 14:53:07 -05:00

227 lines
6.9 KiB
C++

#include "CloverEventAction.hh"
#include "CloverCrystalSD.hh"
#include "CloverCrystalHit.hh"
#include "CloverAnalysis.hh"
#include "Detector_Parameters.hh"
#include "BGOSD.hh"
#include "BGOHIT.hh"
#include "G4RunManager.hh"
#include "G4Event.hh"
#include "G4SDManager.hh"
#include "G4HCofThisEvent.hh"
#include "G4UnitsTable.hh"
#include "G4SystemOfUnits.hh"
//#include <cmath.h>
#include <stdlib.h>
#include "Randomize.hh"
#include <iomanip>
#include <vector>
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
CloverEventAction::CloverEventAction()
: G4UserEventAction(),
fCrystalHCID(-1),
fBGOHCID(-1),
fNBGODet(Crystal_Num/4), // number of bgo
fNDet(Crystal_Num) // number of crystal
{
fdEList.clear();
fdLList.clear();
fBEList.clear();
fBLList.clear();
for(int i = 0 ; i < fNDet; i++){
fdEList.push_back(0.);
fdLList.push_back(0.);
fBEList.push_back(0.);
fBLList.push_back(0.);
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
CloverEventAction::~CloverEventAction()
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
CloverCrystalHitsCollection* CloverEventAction::GetHitsCollection(G4int hcID, const G4Event* event) const
{
auto hitsCollection = static_cast<CloverCrystalHitsCollection*>(event->GetHCofThisEvent()->GetHC(hcID));
if ( ! hitsCollection ) {
G4ExceptionDescription msg;
msg << "Cannot access hitsCollection ID " << hcID;
G4Exception("CloverEventAction::GetHitsCollection()",
"MyCode0003", FatalException, msg);
}
return hitsCollection;
}
BGOHitsCollection* CloverEventAction::GetHitsBGOCollection(G4int hcID, const G4Event* event) const
{
auto hitsCollection = static_cast<BGOHitsCollection*>(event->GetHCofThisEvent()->GetHC(hcID));
if ( ! hitsCollection ) {
G4ExceptionDescription msg;
msg << "Cannot access hitsCollection ID " << hcID;
G4Exception("CloverEventAction::GetHitsCollection() BGOHIT",
"MyCode0003", FatalException, msg);
}
return hitsCollection;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void CloverEventAction::PrintEventStatistics( G4double absoEdep, G4double absoTrackLength) const
{
// print event statistics
G4cout
<< "CloverEventAction::PrintEventStatistics" << G4endl
<< " Absorber: total energy: "
<< std::setw(7) << G4BestUnit(absoEdep, "Energy")
<< " total track length: "
<< std::setw(7) << G4BestUnit(absoTrackLength, "Length")
<< G4endl;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void CloverEventAction::BeginOfEventAction(const G4Event* /*event*/)
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void CloverEventAction::EndOfEventAction(const G4Event* event)
{
G4TrajectoryContainer* trajectoryContainer = event->GetTrajectoryContainer();
G4int n_trajectories = 0;
if (trajectoryContainer) n_trajectories = trajectoryContainer->entries();
// periodic printing
//G4cout << "######################################### CloverEventAction::EndOfEventAction" << G4endl;
//G4int eventID = event->GetEventID();
//if ( eventID < 100 || eventID % 1000 == 0) {
// G4cout << ">>>>>>>> Event: " << eventID << G4endl;
// if ( trajectoryContainer ) {
// G4cout << " " << n_trajectories
// << " trajectories stored in this event." << G4endl;
// }
// G4VHitsCollection* hc = event->GetHCofThisEvent()->GetHC(0);
// G4cout << " "
// << hc->GetSize() << " hits stored in this event" << G4endl;
//}
G4PrimaryVertex * pv = event->GetPrimaryVertex();
G4PrimaryParticle * pp = pv->GetPrimary();
G4double beamEnergy = pp->GetKineticEnergy() * 1000; // to keV
G4ThreeVector pmomt = pp->GetMomentumDirection();
G4double beamTheta = pmomt.theta() / degree;
G4double beamPhi = pmomt.phi() / degree;
//G4cout << "Beam Energy : " << beamEnergy << G4endl;
// << "Beam theta : " << beamTheta << G4endl
// << "Beam phi : " << beamPhi << G4endl;
// Get hits collections IDs (only once)
if ( fCrystalHCID == -1 ) {
fCrystalHCID = G4SDManager::GetSDMpointer()->GetCollectionID("CrystalHitsCollection");
}
if ( fBGOHCID == -1 ) {
fBGOHCID = G4SDManager::GetSDMpointer()->GetCollectionID("BGOHitsCollection");
}
// Get hits collections
auto crystalHC = GetHitsCollection(fCrystalHCID, event); //this is G4VHitsCollection
for( int i = 0 ; i < fNDet ; i++){
CloverCrystalHit * crystalHit = (*crystalHC)[i]; //this is CloverCrystalHit :: G4VHit
//add detector resolution of 1%
G4double edep = crystalHit->GetEdep();
G4double resol = G4RandGauss::shoot(1, 0.001);
//Energy Resolution of the detectors is Energy dependent.
/*
double Fano = 0.112;
double electron_hole_work_function_GE = .003; //3 ev in HPGe.
//
double energy_width = 2*std::pow((2* 0.693 * Fano * edep * electron_hole_work_function_GE),0.5);
double electron_width = 0.001;
double e_res = std::pow( std::pow(energy_width,2) + std::pow(electron_width,2),0.5);
G4double resol = G4RandGauss::shoot(1,e_res);
*/
fdEList[i] = edep * resol * 1000; // to keV
fdLList[i] = crystalHit->GetStepLength();
// std::cout<< "crystalhere "<< i << ", " << fdEList[i] << std::endl;
}
auto BGOHC = GetHitsBGOCollection(fBGOHCID, event); //this is G4VHitsCollection
for( int i = 0 ; i < fNBGODet ; i++){
BGOHit * bgoHit = (*BGOHC)[i]; //this is CloverCrystalHit :: G4VHit
//add detector resolution of 1%
G4double edep = bgoHit->GetEdep();
G4double resol = G4RandGauss::shoot(1, 0.001);
//Energy Resolution of the detectors is Energy dependent.
/*
double Fano = 0.112;
double electron_hole_work_function_GE = .003; //3 ev in HPGe.
//
double energy_width = 2*std::pow((2* 0.693 * Fano * edep * electron_hole_work_function_GE),0.5);
double electron_width = 0.001;
double e_res = std::pow( std::pow(energy_width,2) + std::pow(electron_width,2),0.5);
G4double resol = G4RandGauss::shoot(1,e_res);
*/
fBEList[i] = edep * resol * 1000; // to keV
fBLList[i] = bgoHit->GetStepLength();
// std::cout<< "bgohere "<< i << ", " << fBEList[i] << std::endl;
}
// get analysis manager
auto analysisManager = G4AnalysisManager::Instance();
// fill ntuple
analysisManager->FillNtupleIColumn(0, n_trajectories);
analysisManager->FillNtupleDColumn(5, beamEnergy);
analysisManager->FillNtupleDColumn(6, beamTheta);
analysisManager->FillNtupleDColumn(7, beamPhi);
analysisManager->AddNtupleRow();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......