Loading...
Searching...
No Matches
Par02Output.cc
Go to the documentation of this file.
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//
27/// \file Par02Output.cc
28/// \brief Implementation of the Par02Output class
29
30#include "Par02Output.hh"
32
33#include "G4Event.hh"
34#include "G4RunManager.hh"
35#include "G4UnitsTable.hh"
36#include "G4SystemOfUnits.hh"
37#include "G4AnalysisManager.hh"
38
39//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
40
42G4ThreadLocal G4int Par02Output::fCurrentNtupleId = 0;
43G4ThreadLocal G4int Par02Output::fCurrentID = 0;
44
45//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
46
47Par02Output::Par02Output() : fFileNameWithRunNo( false ) {
48 fFileName = "DefaultOutput.root";
49}
50
51//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
52
54
55//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
56
58 if ( ! fPar02Output ) {
60 }
61 return fPar02Output;
62}
63
64//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
65
67 fFileName = aName;
68}
69
70//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
71
72void Par02Output::AppendName( G4bool aApp ) {
73 fFileNameWithRunNo = aApp;
74}
75
76//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
77
81
82//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
83
84void Par02Output::StartAnalysis( G4int aRunID ) {
85 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
86 if ( fFileNameWithRunNo ) {
87 fFileName += "_run";
88 fFileName += G4UIcommand::ConvertToString( aRunID );
89 }
90 analysisManager->SetDefaultFileType("root");
91 analysisManager->SetVerboseLevel( 1 );
92 analysisManager->SetFileName( fFileName );
93 analysisManager->OpenFile( fFileName );
94}
95
96//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
97
99 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
100 analysisManager->Write();
101 analysisManager->CloseFile();
102}
103
104//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
105
107 const G4Event* event = G4RunManager::GetRunManager()->GetCurrentEvent();
108 G4String evName = "Event_";
109 evName += G4UIcommand::ConvertToString( event->GetEventID() );
110 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
111 fCurrentNtupleId = analysisManager->CreateNtuple( evName, evName );
112
113 analysisManager->CreateNtupleIColumn( "particleID" ); // column Id = 0
114 analysisManager->CreateNtupleIColumn( "PID" ); // column Id = 1
115 analysisManager->CreateNtupleDColumn( "MC_pX" ); // column Id = 2
116 analysisManager->CreateNtupleDColumn( "MC_pY" ); // column Id = 3
117 analysisManager->CreateNtupleDColumn( "MC_pZ" ); // column Id = 4
118
119 analysisManager->CreateNtupleDColumn( "tracker_res" ); // column Id = 5
120 analysisManager->CreateNtupleDColumn( "tracker_eff" ); // column Id = 6
121 analysisManager->CreateNtupleDColumn( "tracker_pX" ); // column Id = 7
122 analysisManager->CreateNtupleDColumn( "tracker_pY" ); // column Id = 8
123 analysisManager->CreateNtupleDColumn( "tracker_pZ" ); // column Id = 9
124
125 analysisManager->CreateNtupleDColumn( "emcal_res" ); // column Id = 10
126 analysisManager->CreateNtupleDColumn( "emcal_eff" ); // column Id = 11
127 analysisManager->CreateNtupleDColumn( "emcal_X" ); // column Id = 12
128 analysisManager->CreateNtupleDColumn( "emcal_Y" ); // column Id = 13
129 analysisManager->CreateNtupleDColumn( "emcal_Z" ); // column Id = 14
130 analysisManager->CreateNtupleDColumn( "emcal_E" ); // column Id = 15
131
132 analysisManager->CreateNtupleDColumn( "hcal_res" ); // column Id = 16
133 analysisManager->CreateNtupleDColumn( "hcal_eff" ); // column Id = 17
134 analysisManager->CreateNtupleDColumn( "hcal_X" ); // column Id = 18
135 analysisManager->CreateNtupleDColumn( "hcal_Y" ); // column Id = 19
136 analysisManager->CreateNtupleDColumn( "hcal_Z" ); // column Id = 20
137 analysisManager->CreateNtupleDColumn( "hcal_E" ); // column Id = 21
138
139 analysisManager->FinishNtuple( fCurrentNtupleId );
140}
141
142//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
143
145{
146 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
147 analysisManager->CreateH1( "Pdiff", "momentum smeared in tracker", 100, 0.8, 1.2 );
148 analysisManager->SetH1XAxisTitle( 0, "p_{smeared}/p_{true}" );
149 analysisManager->SetH1YAxisTitle( 0, "Entries" );
150 analysisManager->CreateH1( "EMCalEdiff", "energy smeared in EMCal", 100, 0.8, 1.2 );
151 analysisManager->SetH1XAxisTitle( 1, "E_{smeared}/E_{true}" );
152 analysisManager->SetH1YAxisTitle( 1, "Entries" );
153 analysisManager->CreateH1( "HCalEdiff", "energy smeared in HCal", 100, 0.0, 2.0 );
154 analysisManager->SetH1XAxisTitle( 2, "E_{smeared}/E_{true}" );
155 analysisManager->SetH1YAxisTitle( 2, "Entries" );
156}
157
158//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
159
160void Par02Output::SaveTrack( SaveType aWhatToSave, G4int aPartID, G4int aPDG,
161 G4ThreeVector aVector, G4double aResolution,
162 G4double aEfficiency, G4double aEnergy ) {
163 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
164 switch( aWhatToSave ) {
166 break;
167 case Par02Output::eSaveMC : {
168 analysisManager->FillNtupleIColumn( fCurrentNtupleId, 0, aPartID );
169 analysisManager->FillNtupleIColumn( fCurrentNtupleId, 1, aPDG );
170 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 2, aVector.x() );
171 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 3, aVector.y() );
172 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 4, aVector.z() );
173 fCurrentID = aPartID;
174 break;
175 }
177 if ( aPartID != fCurrentID ) G4cout <<
178 " Wrong particle - trying to save Tracker information of different particle"
179 << G4endl;
180 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 5, aResolution );
181 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 6, aEfficiency );
182 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 7, aVector.x() );
183 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 8, aVector.y() );
184 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 9, aVector.z() );
185 break;
186 }
188 if ( aPartID != fCurrentID ) G4cout <<
189 " Wrong particle - trying to save EMCal information of different particle"
190 << G4endl;
191 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 10, aResolution );
192 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 11, aEfficiency );
193 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 12, aVector.x() );
194 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 13, aVector.y() );
195 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 14, aVector.z() );
196 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 15, aEnergy );
197 break;
198 }
200 if ( aPartID != fCurrentID ) G4cout <<
201 " Wrong particle - trying to save HCal information of different particle"
202 << G4endl;
203 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 16, aResolution );
204 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 17, aEfficiency );
205 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 18, aVector.x() );
206 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 19, aVector.y() );
207 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 20, aVector.z() );
208 analysisManager->FillNtupleDColumn( fCurrentNtupleId, 21, aEnergy );
209 analysisManager->AddNtupleRow( fCurrentNtupleId );
210 break;
211 }
212 }
213}
214
215//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
216
217void Par02Output::FillHistogram( G4int aHistNo, G4double aValue ) const {
218 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
219 analysisManager->FillH1( aHistNo, aValue );
220}
221
222//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
223
Definition of the Par02EventInformation class.
Definition of the Par02Output class.
Handling the saving to the file.
static G4ThreadLocal G4int fCurrentNtupleId
Current ntuple Id.
void CreateHistograms()
Creates histograms to combine information from all the events in the run.
G4bool fFileNameWithRunNo
If true, a run number should be added to the file. Default: false.
void AppendName(G4bool app)
Sets fFileNameWithRunNo that indicates whether to add the run number to the file name.
void FillHistogram(G4int HNo, G4double value) const
Fills the histogram.
void CreateNtuples()
Creates Ntuples used to store information about particle (its ID, PDG code, energy deposits,...
void SetFileName(G4String name)
Sets the file name of the output root file.
void SaveTrack(SaveType aWhatToSave, G4int aPartID, G4int aPDG, G4ThreeVector aVector, G4double aResolution=0, G4double aEfficiency=1, G4double aEnergy=0)
Saves the information about the particle (track).
void StartAnalysis(G4int runID)
Calls the G4AnalysisManager::Instance().
static Par02Output * fPar02Output
The pointer to the only Par02Output class object.
G4String fFileName
A name of the output root file.
void EndAnalysis()
Calls the G4AnalysisManager::Instance().
SaveType
Indicates to which ntuple to save the information.
static G4ThreadLocal G4int fCurrentID
A control value of particle ID to ensure that data saved to various ntuples match the same particle.
Par02Output()
A default, protected constructor (due to singleton pattern).
G4String GetFileName()
Gets the file name of the output root file.
static Par02Output * Instance()
Allows the access to the unique Par02Output object.

Applications | User Support | Publications | Collaboration