Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-02-23 09:22:33

0001 //
0002 // ********************************************************************
0003 // * License and Disclaimer                                           *
0004 // *                                                                  *
0005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
0006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
0007 // * conditions of the Geant4 Software License,  included in the file *
0008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
0009 // * include a list of copyright holders.                             *
0010 // *                                                                  *
0011 // * Neither the authors of this software system, nor their employing *
0012 // * institutes,nor the agencies providing financial support for this *
0013 // * work  make  any representation or  warranty, express or implied, *
0014 // * regarding  this  software system or assume any liability for its *
0015 // * use.  Please see the license in the file  LICENSE  and URL above *
0016 // * for the full disclaimer and the limitation of liability.         *
0017 // *                                                                  *
0018 // * This  code  implementation is the result of  the  scientific and *
0019 // * technical work of the GEANT4 collaboration.                      *
0020 // * By using,  copying,  modifying or  distributing the software (or *
0021 // * any work based  on the software)  you  agree  to acknowledge its *
0022 // * use  in  resulting  scientific  publications,  and indicate your *
0023 // * acceptance of all terms of the Geant4 Software license.          *
0024 // ********************************************************************
0025 //
0026 //
0027 /// \file Par02Output.cc
0028 /// \brief Implementation of the Par02Output class
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 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0041 
0042 Par02Output* Par02Output::fPar02Output = nullptr;
0043 G4ThreadLocal G4int Par02Output::fCurrentNtupleId = 0;
0044 G4ThreadLocal G4int Par02Output::fCurrentID = 0;
0045 
0046 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0047 
0048 Par02Output::Par02Output() : fFileNameWithRunNo(false)
0049 {
0050   fFileName = "DefaultOutput.root";
0051 }
0052 
0053 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0054 
0055 Par02Output::~Par02Output() = default;
0056 
0057 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0058 
0059 Par02Output* Par02Output::Instance()
0060 {
0061   if (!fPar02Output) {
0062     fPar02Output = new Par02Output();
0063   }
0064   return fPar02Output;
0065 }
0066 
0067 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0068 
0069 void Par02Output::SetFileName(G4String aName)
0070 {
0071   fFileName = aName;
0072 }
0073 
0074 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0075 
0076 void Par02Output::AppendName(G4bool aApp)
0077 {
0078   fFileNameWithRunNo = aApp;
0079 }
0080 
0081 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0082 
0083 G4String Par02Output::GetFileName()
0084 {
0085   return fFileName;
0086 }
0087 
0088 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
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 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0104 
0105 void Par02Output::EndAnalysis()
0106 {
0107   G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
0108   analysisManager->Write();
0109   analysisManager->CloseFile();
0110 }
0111 
0112 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
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");  // column Id = 0
0123   analysisManager->CreateNtupleIColumn("PID");  // column Id = 1
0124   analysisManager->CreateNtupleDColumn("MC_pX");  // column Id = 2
0125   analysisManager->CreateNtupleDColumn("MC_pY");  // column Id = 3
0126   analysisManager->CreateNtupleDColumn("MC_pZ");  // column Id = 4
0127 
0128   analysisManager->CreateNtupleDColumn("tracker_res");  // column Id = 5
0129   analysisManager->CreateNtupleDColumn("tracker_eff");  // column Id = 6
0130   analysisManager->CreateNtupleDColumn("tracker_pX");  // column Id = 7
0131   analysisManager->CreateNtupleDColumn("tracker_pY");  // column Id = 8
0132   analysisManager->CreateNtupleDColumn("tracker_pZ");  // column Id = 9
0133 
0134   analysisManager->CreateNtupleDColumn("emcal_res");  // column Id = 10
0135   analysisManager->CreateNtupleDColumn("emcal_eff");  // column Id = 11
0136   analysisManager->CreateNtupleDColumn("emcal_X");  // column Id = 12
0137   analysisManager->CreateNtupleDColumn("emcal_Y");  // column Id = 13
0138   analysisManager->CreateNtupleDColumn("emcal_Z");  // column Id = 14
0139   analysisManager->CreateNtupleDColumn("emcal_E");  // column Id = 15
0140 
0141   analysisManager->CreateNtupleDColumn("hcal_res");  // column Id = 16
0142   analysisManager->CreateNtupleDColumn("hcal_eff");  // column Id = 17
0143   analysisManager->CreateNtupleDColumn("hcal_X");  // column Id = 18
0144   analysisManager->CreateNtupleDColumn("hcal_Y");  // column Id = 19
0145   analysisManager->CreateNtupleDColumn("hcal_Z");  // column Id = 20
0146   analysisManager->CreateNtupleDColumn("hcal_E");  // column Id = 21
0147 
0148   analysisManager->FinishNtuple(fCurrentNtupleId);
0149 }
0150 
0151 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
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 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
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 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0225 
0226 void Par02Output::FillHistogram(G4int aHistNo, G4double aValue) const
0227 {
0228   G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
0229   analysisManager->FillH1(aHistNo, aValue);
0230 }
0231 
0232 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......