Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 #include "Par04RunAction.hh" 27 28 #include "Par04DetectorConstruction.hh" // for Par04DetectorConstruction 29 #include "Par04EventAction.hh" // for Par04EventAction 30 31 #include "G4AnalysisManager.hh" // for G4AnalysisManager 32 33 #include <G4GenericAnalysisManager.hh> // for G4GenericAnalysisManager 34 #include <G4ThreeVector.hh> // for G4ThreeVector 35 #include <G4Types.hh> // for G4int, G4double 36 #include <G4UserRunAction.hh> // for G4UserRunAction 37 38 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 39 40 Par04RunAction::Par04RunAction(Par04DetectorConstruction* aDetector, Par04EventAction* aEventAction) 41 : G4UserRunAction(), fDetector(aDetector), fEventAction(aEventAction) 42 { 43 // Create analysis manager 44 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); 45 analysisManager->SetDefaultFileType("root"); 46 47 // Default filename, can be overriden with /analysis/setFileName 48 analysisManager->SetFileName("Par04Output"); 49 } 50 51 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 52 53 Par04RunAction::~Par04RunAction() = default; 54 55 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 56 57 void Par04RunAction::BeginOfRunAction(const G4Run*) 58 { 59 // Get analysis manager 60 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); 61 62 // Create directories 63 analysisManager->SetNtupleMerging(true); 64 analysisManager->SetVerboseLevel(0); 65 66 // Get detector dimensions 67 G4int cellNumZ = fDetector->GetMeshNbOfCells().z(); 68 G4int cellNumRho = fDetector->GetMeshNbOfCells().x(); 69 G4int cellNumPhi = fDetector->GetMeshNbOfCells().y(); 70 G4double cellSizeZ = fDetector->GetMeshSizeOfCells().z(); 71 G4double cellSizeRho = fDetector->GetMeshSizeOfCells().x(); 72 G4double cellSizePhi = fDetector->GetMeshSizeOfCells().y(); 73 // Default max value of energy stored in histogram (in GeV) 74 G4double maxEnergy = 1000; 75 76 // Creating control histograms 77 analysisManager->CreateH1("energyParticle", "Primary energy;E_{MC} (GeV);Entries", 1024, 0, 78 1.1 * maxEnergy); 79 analysisManager->CreateH1("energyDepositedInVirtual", "Deposited energy;E_{MC} (GeV);Entries", 80 1024, 0, 1.1 * maxEnergy); 81 analysisManager->CreateH1("energyRatioInVirtual", 82 "Ratio of energy deposited to primary;E_{dep} / E_{MC};Entries", 1024, 83 0, 1); 84 analysisManager->CreateH1("time", "Simulation time; time (s);Entries", 2048, 0, 100); 85 analysisManager->CreateH1("longProfile", "Longitudinal profile;t (mm);#LTE#GT (MeV)", cellNumZ, 86 -0.5 * cellSizeZ, (cellNumZ - 0.5) * cellSizeZ); 87 analysisManager->CreateH1("transProfile", "Transverse profile;r (mm);#LTE#GT (MeV)", cellNumRho, 88 -0.5 * cellSizeRho, (cellNumRho - 0.5) * cellSizeRho); 89 analysisManager->CreateH1("longFirstMoment", 90 "First moment of longitudinal distribution;#LT#lambda#GT (mm);Entries", 91 1024, -0.5 * cellSizeZ, 92 cellNumZ * cellSizeZ / 2); // arbitrary scaling of max value on axis 93 analysisManager->CreateH1("transFirstMoment", 94 "First moment of transverse distribution;#LTr#GT " 95 "(mm);Entries", 96 1024, -0.5 * cellSizeRho, 97 cellNumRho * cellSizeRho 98 / 1); // arbitrary scaling of max value on axis 99 analysisManager->CreateH1( 100 "longSecondMoment", 101 "Second moment of longitudinal distribution;#LT#lambda^{2}#GT " 102 "(mm^{2});Entries", 103 1024, 0, std::pow(cellNumZ * cellSizeZ, 2) / 25); // arbitrary scaling of max value on axis 104 analysisManager->CreateH1( 105 "transSecondMoment", "Second moment of transverse distribution;#LTr^{2}#GT (mm^{2});Entries", 106 1024, 0, std::pow(cellNumRho * cellSizeRho, 2) / 5); // arbitrary scaling of max value on axis 107 analysisManager->CreateH1("hitType", "hit type;type (0=full, 1= fast);Entries", 2, -0.5, 1.5); 108 analysisManager->CreateH1( 109 "phiProfile", "Azimuthal angle profile, centred at mean;phi;#LTE#GT (MeV)", cellNumPhi, 110 -(cellNumPhi - 0.5) * cellSizePhi, (cellNumPhi - 0.5) * cellSizePhi); 111 analysisManager->CreateH1("numHitsInVirtual", "Number of hits above 0.5 keV", 4048, 0, 20000); 112 analysisManager->CreateH1("cellEnergy", "Cell energy distribution;log10(E/MeV);Entries", 1024, -4, 113 2); 114 analysisManager->CreateH1("numDepositsInVirtual", "Number of deposits in all cells per event", 115 4048, 0, 40000); 116 analysisManager->CreateH1("cellDepositsInVirtual", 117 "Distribution of number of deposits per cell per event", 4048, 0, 1024); 118 analysisManager->CreateH1("energyDepositedInPhysical", 119 "Deposited energy in physical detector readout;E_{MC} (GeV);Entries", 120 1024, 0, 1.1 * maxEnergy); 121 analysisManager->CreateH1( 122 "energyRatioInPhysical", 123 "Ratio of energy deposited in physical readout to primary; E_{dep} / E_{MC};Entries", 1024, 0, 124 1); 125 analysisManager->CreateH1("numHitsInPhysical", "Number of hits in physical readout above 0.5 keV", 126 4048, 0, 5000); 127 analysisManager->CreateH1("cellEnergyInPhysical", 128 "Physical cell energy distribution;log10(E/MeV);Entries", 1024, -4, 2); 129 analysisManager->CreateH1("numDepositsInPhysical", 130 "Number of deposits in all physical cells per event", 4048, 0, 40000); 131 analysisManager->CreateH1("cellDepositsInPhysical", 132 "Distribution of number of deposits per physical cell per event", 4048, 133 0, 1024); 134 135 // Creating ntuple 136 analysisManager->CreateNtuple("global", "Event data"); 137 analysisManager->CreateNtupleDColumn("EnergyMC"); 138 analysisManager->CreateNtupleDColumn("SimTime"); 139 analysisManager->FinishNtuple(); 140 141 analysisManager->CreateNtuple("virtualReadout", "Cylindrical mesh readout"); 142 analysisManager->CreateNtupleDColumn("EnergyCell", fEventAction->GetCalEdep()); 143 analysisManager->CreateNtupleIColumn("rhoCell", fEventAction->GetCalRho()); 144 analysisManager->CreateNtupleIColumn("phiCell", fEventAction->GetCalPhi()); 145 analysisManager->CreateNtupleIColumn("zCell", fEventAction->GetCalZ()); 146 analysisManager->FinishNtuple(); 147 148 analysisManager->CreateNtuple("physicalReadout", "Detector physical readout"); 149 analysisManager->CreateNtupleDColumn("EnergyCell", fEventAction->GetPhysicalCalEdep()); 150 analysisManager->CreateNtupleIColumn("layerCell", fEventAction->GetPhysicalCalLayer()); 151 analysisManager->CreateNtupleIColumn("rowCell", fEventAction->GetPhysicalCalRow()); 152 analysisManager->CreateNtupleIColumn("sliceCell", fEventAction->GetPhysicalCalSlice()); 153 analysisManager->FinishNtuple(); 154 155 analysisManager->OpenFile(); 156 } 157 158 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 159 160 void Par04RunAction::EndOfRunAction(const G4Run*) 161 { 162 auto analysisManager = G4AnalysisManager::Instance(); 163 analysisManager->Write(); 164 analysisManager->CloseFile(); 165 } 166