File indexing completed on 2025-02-23 09:22:33
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #include "Par02Output.hh"
0031
0032 #include "Par02EventInformation.hh"
0033
0034 #include "G4AnalysisManager.hh"
0035 #include "G4Event.hh"
0036 #include "G4RunManager.hh"
0037 #include "G4SystemOfUnits.hh"
0038 #include "G4UnitsTable.hh"
0039
0040
0041
0042 Par02Output* Par02Output::fPar02Output = nullptr;
0043 G4ThreadLocal G4int Par02Output::fCurrentNtupleId = 0;
0044 G4ThreadLocal G4int Par02Output::fCurrentID = 0;
0045
0046
0047
0048 Par02Output::Par02Output() : fFileNameWithRunNo(false)
0049 {
0050 fFileName = "DefaultOutput.root";
0051 }
0052
0053
0054
0055 Par02Output::~Par02Output() = default;
0056
0057
0058
0059 Par02Output* Par02Output::Instance()
0060 {
0061 if (!fPar02Output) {
0062 fPar02Output = new Par02Output();
0063 }
0064 return fPar02Output;
0065 }
0066
0067
0068
0069 void Par02Output::SetFileName(G4String aName)
0070 {
0071 fFileName = aName;
0072 }
0073
0074
0075
0076 void Par02Output::AppendName(G4bool aApp)
0077 {
0078 fFileNameWithRunNo = aApp;
0079 }
0080
0081
0082
0083 G4String Par02Output::GetFileName()
0084 {
0085 return fFileName;
0086 }
0087
0088
0089
0090 void Par02Output::StartAnalysis(G4int aRunID)
0091 {
0092 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
0093 if (fFileNameWithRunNo) {
0094 fFileName += "_run";
0095 fFileName += G4UIcommand::ConvertToString(aRunID);
0096 }
0097 analysisManager->SetDefaultFileType("root");
0098 analysisManager->SetVerboseLevel(1);
0099 analysisManager->SetFileName(fFileName);
0100 analysisManager->OpenFile(fFileName);
0101 }
0102
0103
0104
0105 void Par02Output::EndAnalysis()
0106 {
0107 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
0108 analysisManager->Write();
0109 analysisManager->CloseFile();
0110 }
0111
0112
0113
0114 void Par02Output::CreateNtuples()
0115 {
0116 const G4Event* event = G4RunManager::GetRunManager()->GetCurrentEvent();
0117 G4String evName = "Event_";
0118 evName += G4UIcommand::ConvertToString(event->GetEventID());
0119 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
0120 fCurrentNtupleId = analysisManager->CreateNtuple(evName, evName);
0121
0122 analysisManager->CreateNtupleIColumn("particleID");
0123 analysisManager->CreateNtupleIColumn("PID");
0124 analysisManager->CreateNtupleDColumn("MC_pX");
0125 analysisManager->CreateNtupleDColumn("MC_pY");
0126 analysisManager->CreateNtupleDColumn("MC_pZ");
0127
0128 analysisManager->CreateNtupleDColumn("tracker_res");
0129 analysisManager->CreateNtupleDColumn("tracker_eff");
0130 analysisManager->CreateNtupleDColumn("tracker_pX");
0131 analysisManager->CreateNtupleDColumn("tracker_pY");
0132 analysisManager->CreateNtupleDColumn("tracker_pZ");
0133
0134 analysisManager->CreateNtupleDColumn("emcal_res");
0135 analysisManager->CreateNtupleDColumn("emcal_eff");
0136 analysisManager->CreateNtupleDColumn("emcal_X");
0137 analysisManager->CreateNtupleDColumn("emcal_Y");
0138 analysisManager->CreateNtupleDColumn("emcal_Z");
0139 analysisManager->CreateNtupleDColumn("emcal_E");
0140
0141 analysisManager->CreateNtupleDColumn("hcal_res");
0142 analysisManager->CreateNtupleDColumn("hcal_eff");
0143 analysisManager->CreateNtupleDColumn("hcal_X");
0144 analysisManager->CreateNtupleDColumn("hcal_Y");
0145 analysisManager->CreateNtupleDColumn("hcal_Z");
0146 analysisManager->CreateNtupleDColumn("hcal_E");
0147
0148 analysisManager->FinishNtuple(fCurrentNtupleId);
0149 }
0150
0151
0152
0153 void Par02Output::CreateHistograms()
0154 {
0155 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
0156 analysisManager->CreateH1("Pdiff", "momentum smeared in tracker", 100, 0.8, 1.2);
0157 analysisManager->SetH1XAxisTitle(0, "p_{smeared}/p_{true}");
0158 analysisManager->SetH1YAxisTitle(0, "Entries");
0159 analysisManager->CreateH1("EMCalEdiff", "energy smeared in EMCal", 100, 0.8, 1.2);
0160 analysisManager->SetH1XAxisTitle(1, "E_{smeared}/E_{true}");
0161 analysisManager->SetH1YAxisTitle(1, "Entries");
0162 analysisManager->CreateH1("HCalEdiff", "energy smeared in HCal", 100, 0.0, 2.0);
0163 analysisManager->SetH1XAxisTitle(2, "E_{smeared}/E_{true}");
0164 analysisManager->SetH1YAxisTitle(2, "Entries");
0165 }
0166
0167
0168
0169 void Par02Output::SaveTrack(SaveType aWhatToSave, G4int aPartID, G4int aPDG, G4ThreeVector aVector,
0170 G4double aResolution, G4double aEfficiency, G4double aEnergy)
0171 {
0172 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
0173 switch (aWhatToSave) {
0174 case Par02Output::eNoSave:
0175 break;
0176 case Par02Output::eSaveMC: {
0177 analysisManager->FillNtupleIColumn(fCurrentNtupleId, 0, aPartID);
0178 analysisManager->FillNtupleIColumn(fCurrentNtupleId, 1, aPDG);
0179 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 2, aVector.x());
0180 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 3, aVector.y());
0181 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 4, aVector.z());
0182 fCurrentID = aPartID;
0183 break;
0184 }
0185 case Par02Output::eSaveTracker: {
0186 if (aPartID != fCurrentID)
0187 G4cout << " Wrong particle - trying to save Tracker information of different particle"
0188 << G4endl;
0189 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 5, aResolution);
0190 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 6, aEfficiency);
0191 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 7, aVector.x());
0192 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 8, aVector.y());
0193 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 9, aVector.z());
0194 break;
0195 }
0196 case Par02Output::eSaveEMCal: {
0197 if (aPartID != fCurrentID)
0198 G4cout << " Wrong particle - trying to save EMCal information of different particle"
0199 << G4endl;
0200 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 10, aResolution);
0201 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 11, aEfficiency);
0202 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 12, aVector.x());
0203 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 13, aVector.y());
0204 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 14, aVector.z());
0205 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 15, aEnergy);
0206 break;
0207 }
0208 case Par02Output::eSaveHCal: {
0209 if (aPartID != fCurrentID)
0210 G4cout << " Wrong particle - trying to save HCal information of different particle"
0211 << G4endl;
0212 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 16, aResolution);
0213 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 17, aEfficiency);
0214 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 18, aVector.x());
0215 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 19, aVector.y());
0216 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 20, aVector.z());
0217 analysisManager->FillNtupleDColumn(fCurrentNtupleId, 21, aEnergy);
0218 analysisManager->AddNtupleRow(fCurrentNtupleId);
0219 break;
0220 }
0221 }
0222 }
0223
0224
0225
0226 void Par02Output::FillHistogram(G4int aHistNo, G4double aValue) const
0227 {
0228 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
0229 analysisManager->FillH1(aHistNo, aValue);
0230 }
0231
0232