This repository was archived by the owner on May 6, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathphotonuclear_models.py
More file actions
140 lines (110 loc) · 4.63 KB
/
Copy pathphotonuclear_models.py
File metadata and controls
140 lines (110 loc) · 4.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
"""Configuration classes for default photonuclear models"""
from LDMX.SimCore import simcfg
class BertiniModel(simcfg.PhotoNuclearModel):
"""The default model for photonuclear interactions.
Keeps the default Bertini model from Geant4.
"""
def __init__(self):
super().__init__('BertiniModel',
'simcore::BertiniModel',
'SimCore_PhotoNuclearModels')
class BertiniNothingHardModel(simcfg.PhotoNuclearModel):
"""A photonuclear model producing only topologies with no particles above a
certain threshold.
Uses the default Bertini model from Geant4.
"""
def __init__(self):
"""
Nothing hard events are unlikely to come from low A nuclei. This can
be tested by instrumenting one of the models and checking the typical
number of attempts for different nuclei.
If we count light ions and nuclei as potential hard particles and
ignore events producing heavy exotic particles, then here are some
example results:
Z74 -> ~5000 attempts
While for lighter nuclei, perhaps unsurprsingly
Z1 -> 1e5 attempts before giving up
Z6 -> 1e5 attempts before giving up
Z7 -> 1e5 attempts before giving up
Z8 -> 1e5 attempts before giving up
Z11 -> 1e5 attempts before giving up
Z14 -> 1e5 attempts before giving up
Z20 -> 1e5 attempts before giving up
Z29 -> 30000 attempts
In a similar manner, we can check how often a photonuclear interaction
is with a particular nucleus in an ECal PN sample
|Nucleus | Rate [%] |
| H | 4.78 |
| C | 9.73 |
| N | 0.04 |
| O | 7.01 |
| Ni | 1.25 |
| Al | 0.01 |
| Si | 6.23 |
| Ca | 1.36 |
| Mn | 0.01 |
| Fe | 0.67 |
| Cu | 12.47 |
| W | 56.44 |
So for the purposes of running Nothing hard simulations, it is
probably fine to have a high `zmin` value, either 29 (Cu) or 74 (W).
Single hard particle events, however, can come from any kind of
nucleus.
"""
super().__init__('BertiniNothingHardModel',
'simcore::BertiniNothingHardModel',
'SimCore_PhotoNuclearModels')
self.count_light_ions = True
self.hard_particle_threshold = 200.
self.zmin = 74
self.emin = 2500.
class BertiniSingleNeutronModel(simcfg.PhotoNuclearModel):
"""A photonuclear model producing only topologies where only one neutron has
kinetic energy above a particular threshold.
Uses the default Bertini model from Geant4.
"""
def __init__(self):
super().__init__('BertiniSingleNeutronModel',
'simcore::BertiniSingleNeutronModel',
'SimCore_PhotoNuclearModels')
self.hard_particle_threshold = 200.
self.zmin = 0
self.emin = 2500.
self.count_light_ions = True
class BertiniAtLeastNProductsModel(simcfg.PhotoNuclearModel):
""" A photonuclear model producing only topologies with no particles above a
certain threshold.
Uses the default Bertini model from Geant4.
"""
def __init__(self, name):
super().__init__(name,
'simcore::BertiniAtLeastNProductsModel',
'SimCore_PhotoNuclearModels')
self.hard_particle_threshold = 200.
self.zmin = 0
self.emin = 2500.
self.min_products = 1
self.pdg_ids = []
def kaon(min_products = 1, hard_particle_threshold=200.):
# Note: By default, this is requiring at least 1 kaon with at least 200
# MeV. You may want a different energy threshold depending on your needs.
model = BertiniAtLeastNProductsModel(f"{min_products}_kaon_model")
model.hard_particle_threshold=hard_particle_threshold
model.pdg_ids = [
130, # K_L^0
310, # K_S^0
311, # K^0
321, # K^+
-321, # K^-
]
model.min_products = min_products
return model
class NoPhotoNuclearModel(simcfg.PhotoNuclearModel):
"""A PhotoNuclear model that disables the photonuclear process entirely.
Make sure that no biasing operators for photonuclear reactions are enabled
when using this model.
"""
def __init__(self):
super().__init__('NoPhotoNuclearModel',
'simcore::NoPhotoNuclearModel',
'SimCore_PhotoNuclearModels')