Skip to content

Commit fc0f60e

Browse files
committed
added class A2FileGeneratorGiBUU
1 parent 6507a3c commit fc0f60e

File tree

2 files changed

+173
-0
lines changed

2 files changed

+173
-0
lines changed

include/A2FileGeneratorGiBUU.hh

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// event generator reading GiBUU ROOT files
2+
// Author: Dominik Werthmueller, 2019
3+
4+
#ifndef A2FileGeneratorGiBUU_h
5+
#define A2FileGeneratorGiBUU_h 1
6+
7+
#include "TTreeReaderValue.h"
8+
9+
#include "A2FileGeneratorTree.hh"
10+
11+
class TTreeReader;
12+
13+
class A2FileGeneratorGiBUU : public A2FileGeneratorTree
14+
{
15+
16+
protected:
17+
TTreeReader* fReader; // tree reader
18+
TTreeReaderValue<G4double>* fReaderWeight; // event weight
19+
TTreeReaderValue<std::vector<G4int>>* fReaderCode; // particle code
20+
TTreeReaderValue<std::vector<G4double>>* fReaderPx; // particle momentum
21+
TTreeReaderValue<std::vector<G4double>>* fReaderPy; // particle momentum
22+
TTreeReaderValue<std::vector<G4double>>* fReaderPz; // particle momentum
23+
TTreeReaderValue<std::vector<G4double>>* fReaderE; // particle energy
24+
25+
static const G4int fgMaxParticles;
26+
27+
public:
28+
A2FileGeneratorGiBUU(const char* filename);
29+
virtual ~A2FileGeneratorGiBUU();
30+
31+
virtual G4bool Init();
32+
virtual G4bool ReadEvent(G4int event);
33+
virtual G4int GetMaxParticles();
34+
};
35+
36+
#endif
37+

src/A2FileGeneratorGiBUU.cc

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
// event generator reading GiBUU ROOT files
2+
// Author: Dominik Werthmueller, 2019
3+
4+
#include "G4ParticleTable.hh"
5+
#include "G4IonTable.hh"
6+
7+
#include "TTreeReader.h"
8+
9+
#include "A2FileGeneratorGiBUU.hh"
10+
11+
using namespace CLHEP;
12+
13+
const G4int A2FileGeneratorGiBUU::fgMaxParticles = 99;
14+
15+
//______________________________________________________________________________
16+
A2FileGeneratorGiBUU::A2FileGeneratorGiBUU(const char* filename)
17+
: A2FileGeneratorTree(filename, kGiBUU, "RootTuple")
18+
{
19+
// Constructor.
20+
21+
// init members
22+
fReader = 0;
23+
fReaderWeight = 0;
24+
fReaderCode = 0;
25+
fReaderPx = 0;
26+
fReaderPy = 0;
27+
fReaderPz = 0;
28+
fReaderE = 0;
29+
}
30+
31+
//______________________________________________________________________________
32+
A2FileGeneratorGiBUU::~A2FileGeneratorGiBUU()
33+
{
34+
// Destructor.
35+
36+
if (fReaderWeight)
37+
delete fReaderWeight;
38+
if (fReaderCode)
39+
delete fReaderCode;
40+
if (fReaderPx)
41+
delete fReaderPx;
42+
if (fReaderPy)
43+
delete fReaderPy;
44+
if (fReaderPz)
45+
delete fReaderPz;
46+
if (fReaderE)
47+
delete fReaderE;
48+
if (fReader)
49+
delete fReader;
50+
}
51+
52+
//______________________________________________________________________________
53+
G4bool A2FileGeneratorGiBUU::Init()
54+
{
55+
// Init the file event reader.
56+
57+
// call parent method
58+
if (!A2FileGeneratorTree::Init())
59+
return false;
60+
61+
// create tree reader
62+
fReader = new TTreeReader(fTree);
63+
64+
// create particle readers
65+
fReaderWeight = new TTreeReaderValue<G4double>(*fReader, "weight");
66+
fReaderCode = new TTreeReaderValue<std::vector<G4int>>(*fReader, "barcode");
67+
fReaderPx = new TTreeReaderValue<std::vector<G4double>>(*fReader, "Px");
68+
fReaderPy = new TTreeReaderValue<std::vector<G4double>>(*fReader, "Py");
69+
fReaderPz = new TTreeReaderValue<std::vector<G4double>>(*fReader, "Pz");
70+
fReaderE = new TTreeReaderValue<std::vector<G4double>>(*fReader, "E");
71+
72+
return true;
73+
}
74+
75+
//______________________________________________________________________________
76+
G4bool A2FileGeneratorGiBUU::ReadEvent(G4int event)
77+
{
78+
// Read the event 'event'.
79+
80+
// read event
81+
if (!fReader->Next())
82+
return false;
83+
84+
// clear particles
85+
fPart.clear();
86+
87+
// event weight
88+
SetWeight(*(*fReaderWeight));
89+
90+
// loop over particles
91+
for (UInt_t i = 0; i < (*fReaderCode)->size(); i++)
92+
{
93+
// look-up particle
94+
Int_t pdg = (*fReaderCode)->at(i);
95+
G4ParticleDefinition* partDef = G4ParticleTable::GetParticleTable()->FindParticle(pdg);
96+
if (!partDef)
97+
{
98+
G4int Z, A, L, J;
99+
G4double E;
100+
if (G4IonTable::GetNucleusByEncoding(pdg, Z, A, L, E, J))
101+
partDef = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(Z, A, L, 0.0, J);
102+
}
103+
if (!partDef)
104+
{
105+
// user info
106+
G4cout << "A2FileGeneratorGiBUU::Init(): Undefined particle with PDG ID " << pdg
107+
<< " will not be tracked!" << G4endl;
108+
continue;
109+
}
110+
111+
// set event particle
112+
A2GenParticle_t part;
113+
part.fDef = partDef;
114+
part.fP.set((*fReaderPx)->at(i)*GeV, (*fReaderPy)->at(i)*GeV, (*fReaderPz)->at(i)*GeV);
115+
part.fE = (*fReaderE)->at(i)*GeV;
116+
part.SetCorrectMass(true);
117+
part.fX = fVertex;
118+
part.fT = 0;
119+
part.fIsTrack = true;
120+
121+
// add event particle
122+
if (!std::isnan(part.fP.mag()) && fPart.size() < fgMaxParticles)
123+
fPart.push_back(part);
124+
}
125+
126+
return true;
127+
}
128+
129+
//______________________________________________________________________________
130+
G4int A2FileGeneratorGiBUU::GetMaxParticles()
131+
{
132+
// Return the maximum number of particles.
133+
134+
return fgMaxParticles;
135+
}
136+

0 commit comments

Comments
 (0)