ECCE @ EIC Software
Reference for
ECCE @ EIC
simulation and reconstruction software on GitHub
Home page
Related Pages
Modules
Namespaces
Classes
Files
External Links
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
PhysicsList.cc
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file PhysicsList.cc
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
//
29
30
#include "PhysicsList.hh"
31
32
#include "
G4UIcmdWithAnInteger.hh
"
33
#include "
G4SystemOfUnits.hh
"
34
35
// Geant4-DNA MODELS
36
37
#include "
G4DNAElastic.hh
"
38
#include "
G4DNAChampionElasticModel.hh
"
39
#include "
G4DNAScreenedRutherfordElasticModel.hh
"
40
41
#include "
G4DNAExcitation.hh
"
42
#include "
G4DNAMillerGreenExcitationModel.hh
"
43
#include "
G4DNABornExcitationModel.hh
"
44
45
#include "
G4DNAIonisation.hh
"
46
#include "
G4DNABornIonisationModel.hh
"
47
#include "
G4DNARuddIonisationModel.hh
"
48
49
#include "
G4DNAChargeDecrease.hh
"
50
#include "
G4DNADingfelderChargeDecreaseModel.hh
"
51
52
#include "
G4DNAChargeIncrease.hh
"
53
#include "
G4DNADingfelderChargeIncreaseModel.hh
"
54
55
#include "
G4DNAAttachment.hh
"
56
#include "
G4DNAMeltonAttachmentModel.hh
"
57
58
#include "
G4DNAVibExcitation.hh
"
59
#include "
G4DNASancheExcitationModel.hh
"
60
61
#include "
G4DNAElectronSolvation.hh
"
62
63
//
64
65
#include "
G4LossTableManager.hh
"
66
#include "
G4EmConfigurator.hh
"
67
#include "
G4VEmModel.hh
"
68
#include "
G4DummyModel.hh
"
69
#include "
G4eIonisation.hh
"
70
#include "
G4hIonisation.hh
"
71
#include "
G4ionIonisation.hh
"
72
#include "
G4eMultipleScattering.hh
"
73
#include "
G4hMultipleScattering.hh
"
74
#include "
G4BraggIonGasModel.hh
"
75
#include "
G4BetheBlochIonGasModel.hh
"
76
#include "
G4UrbanMscModel.hh
"
77
#include "
G4MollerBhabhaModel.hh
"
78
#include "
G4IonFluctuations.hh
"
79
#include "
G4UniversalFluctuation.hh
"
80
81
#include "G4ElectronCapture.hh"
82
83
#include "
SplitProcess.hh
"
84
85
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
86
87
PhysicsList::PhysicsList
()
88
:
G4VUserPhysicsList
(),
G4UImessenger
()
89
90
{
91
92
fpNumberOfSplit
=
new
G4UIcmdWithAnInteger
(
"/vrt/numberOfSplit"
,
this
);
93
fpNumberOfSplit
->
SetGuidance
(
"Number of split for particle splitting"
);
94
fpNumberOfSplit
->
SetParameterName
(
"NumberOfSplit"
,
false
);
95
fpNumberOfSplit
->
SetDefaultValue
(1);
96
97
defaultCutValue
= 1*
micrometer
;
98
fCutForGamma
=
defaultCutValue
;
99
fCutForElectron
=
defaultCutValue
;
100
fCutForPositron
=
defaultCutValue
;
101
fCutForProton
=
defaultCutValue
;
102
103
SetVerboseLevel
(1);
104
105
// fNumberOfSplit = 1;
106
107
}
108
109
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
110
111
PhysicsList::~PhysicsList
()
112
{}
113
114
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
115
void
PhysicsList::SetNewValue
(
G4UIcommand
* command,
116
G4String
newValue) {
117
if
( command ==
fpNumberOfSplit
)
118
fNumberOfSplit
=
fpNumberOfSplit
->
GetNewIntValue
(newValue);
119
}
120
121
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
122
123
void
PhysicsList::ConstructParticle
()
124
{
125
ConstructBosons
();
126
ConstructLeptons
();
127
ConstructBarions
();
128
}
129
130
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
131
132
void
PhysicsList::ConstructBosons
()
133
{
134
// gamma
135
G4Gamma::GammaDefinition
();
136
}
137
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
138
139
void
PhysicsList::ConstructLeptons
()
140
{
141
// leptons
142
G4Electron::ElectronDefinition
();
143
G4Positron::PositronDefinition
();
144
}
145
146
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
147
148
//DNA
149
#include "
G4DNAGenericIonsManager.hh
"
150
//ENDDNA
151
152
void
PhysicsList::ConstructBarions
()
153
{
154
// baryons
155
G4Proton::ProtonDefinition
();
156
G4GenericIon::GenericIonDefinition
();
157
158
// Geant4 DNA new particles
159
G4DNAGenericIonsManager
* genericIonsManager;
160
genericIonsManager=
G4DNAGenericIonsManager::Instance
();
161
genericIonsManager->
GetIon
(
"alpha++"
);
162
genericIonsManager->
GetIon
(
"alpha+"
);
163
genericIonsManager->
GetIon
(
"helium"
);
164
genericIonsManager->
GetIon
(
"hydrogen"
);
165
}
166
167
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
168
169
void
PhysicsList::ConstructProcess
()
170
{
171
AddTransportation
();
172
ConstructEM
();
173
ConstructGeneral
();
174
}
175
176
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
177
178
void
PhysicsList::ConstructEM
()
179
{
180
181
auto
particleIterator
=
GetParticleIterator
();
182
particleIterator
->reset();
183
G4bool
splitProcessActive =
false
;
184
// Only if particle split is larger than 1, VRT is set
185
if
(
fNumberOfSplit
> 1 )
186
splitProcessActive =
true
;
187
188
while
( (*
particleIterator
)() )
189
{
190
191
G4ParticleDefinition
*
particle
=
particleIterator
->value();
192
G4ProcessManager
* pmanager = particle->
GetProcessManager
();
193
G4String
particleName = particle->
GetParticleName
();
194
195
// *********************************
196
// 1) Processes for the World region
197
// *********************************
198
199
if
(particleName ==
"e-"
) {
200
201
// STANDARD msc is active in the world
202
G4eMultipleScattering
* msc =
new
G4eMultipleScattering
();
203
msc->
AddEmModel
(1,
new
G4UrbanMscModel
());
204
pmanager->
AddProcess
(msc, -1, 1, -1);
205
206
// STANDARD ionisation is active in the world
207
G4eIonisation
* eion =
new
G4eIonisation
();
208
eion->
SetEmModel
(
new
G4MollerBhabhaModel
(), 1);
209
pmanager->
AddProcess
(eion, -1, 2, 2);
210
211
// DNA elastic is not active in the world
212
G4DNAElastic
* theDNAElasticProcess =
new
G4DNAElastic
(
"e-_G4DNAElastic"
);
213
theDNAElasticProcess->
SetEmModel
(
new
G4DummyModel
(),1);
214
pmanager->
AddDiscreteProcess
(theDNAElasticProcess);
215
216
// DNA excitation is not active in the world
217
G4DNAExcitation
* dnaex =
new
G4DNAExcitation
(
"e-_G4DNAExcitation"
);
218
dnaex->
SetEmModel
(
new
G4DummyModel
(),1);
219
pmanager->
AddDiscreteProcess
(dnaex);
220
221
// DNA ionisation is not active in the world
222
G4DNAIonisation
* dnaioni =
new
G4DNAIonisation
(
"e-_G4DNAIonisation"
);
223
dnaioni->
SetEmModel
(
new
G4DummyModel
(),1);
224
225
// Variance reduction is set here
226
if
(splitProcessActive) {
227
G4String
splitRegion =
"Target"
;
228
G4cout
<<
"- Split for e-e created in e-_G4DNAIonisation process activated"
229
<<
"with split number "
<<
fNumberOfSplit
<<
" in region "
230
<< splitRegion <<
"-- "
<<
G4endl
;
231
SplitProcess
* splitProcess =
new
SplitProcess
(splitRegion,
fNumberOfSplit
);
232
splitProcess->
RegisterProcess
(dnaioni);
233
234
pmanager->
AddDiscreteProcess
(splitProcess);
235
236
}
else
{
237
pmanager->
AddDiscreteProcess
(dnaioni);
238
}
239
240
// DNA attachment is not active in the world
241
G4DNAAttachment
* dnaatt =
new
G4DNAAttachment
(
"e-_G4DNAAttachment"
);
242
dnaatt->
SetEmModel
(
new
G4DummyModel
(),1);
243
pmanager->
AddDiscreteProcess
(dnaatt);
244
245
// DNA vib. excitation is not active in the world
246
G4DNAVibExcitation
* dnavib =
247
new
G4DNAVibExcitation
(
"e-_G4DNAVibExcitation"
);
248
dnavib->
SetEmModel
(
new
G4DummyModel
(),1);
249
pmanager->
AddDiscreteProcess
(dnavib);
250
251
// THE FOLLOWING PROCESS WILL KILL ALL ELECTRONS BELOW A
252
// SELECTED ENERY THRESHOLD
253
// Capture of low-energy e-
254
G4ElectronCapture
* ecap =
new
G4ElectronCapture
(
"Target"
, 7.4*
eV
);
255
pmanager->
AddDiscreteProcess
(ecap);
256
// 7.4 eV is compatible with the validity range of the Champion's model
257
258
}
else
if
( particleName ==
"proton"
) {
259
260
// STANDARD msc is active in the world
261
G4hMultipleScattering
* msc =
new
G4hMultipleScattering
();
262
msc->
AddEmModel
(1,
new
G4UrbanMscModel
());
263
pmanager->
AddProcess
(msc, -1, 1, -1);
264
265
// STANDARD ionisation is active in the world
266
G4hIonisation
* hion =
new
G4hIonisation
();
267
hion->
SetEmModel
(
new
G4BraggIonGasModel
(), 1);
268
hion->
SetEmModel
(
new
G4BetheBlochIonGasModel
(), 2);
269
pmanager->
AddProcess
(hion, -1, 2, 2);
270
271
// DNA excitation is not active in the world
272
G4DNAExcitation
* dnaex =
new
G4DNAExcitation
(
"proton_G4DNAExcitation"
);
273
dnaex->
SetEmModel
(
new
G4DummyModel
(),1);
274
dnaex->
SetEmModel
(
new
G4DummyModel
(),2);
275
pmanager->
AddDiscreteProcess
(dnaex);
276
277
// DNA ionisation is not active in the world
278
G4DNAIonisation
* dnaioni =
new
G4DNAIonisation
(
"proton_G4DNAIonisation"
);
279
dnaioni->
SetEmModel
(
new
G4DummyModel
(),1);
280
dnaioni->
SetEmModel
(
new
G4DummyModel
(),2);
281
pmanager->
AddDiscreteProcess
(dnaioni);
282
283
// DNA charge decrease is ACTIVE in the world since
284
// no corresponding STANDARD process exist
285
pmanager->
AddDiscreteProcess
(
286
new
G4DNAChargeDecrease
(
"proton_G4DNAChargeDecrease"
));
287
288
}
else
if
( particleName ==
"hydrogen"
) {
289
290
// DNA processes are ACTIVE in the world since
291
// no corresponding STANDARD processes exist
292
pmanager->
AddDiscreteProcess
(
293
new
G4DNAIonisation
(
"hydrogen_G4DNAIonisation"
));
294
pmanager->
AddDiscreteProcess
(
295
new
G4DNAExcitation
(
"hydrogen_G4DNAExcitation"
));
296
pmanager->
AddDiscreteProcess
(
297
new
G4DNAChargeIncrease
(
"hydrogen_G4DNAChargeIncrease"
));
298
299
}
else
if
(particleName ==
"GenericIon"
) {
300
301
// THIS IS NEEDED FOR STANDARD ALPHA G4ionIonisation PROCESS
302
303
// STANDARD msc is active in the world
304
G4hMultipleScattering
* msc =
new
G4hMultipleScattering
();
305
msc->
AddEmModel
(1,
new
G4UrbanMscModel
());
306
pmanager->
AddProcess
(msc, -1, 1, -1);
307
308
// STANDARD ionisation is active in the world
309
G4ionIonisation
* hion =
new
G4ionIonisation
();
310
hion->
SetEmModel
(
new
G4BraggIonGasModel
(),1);
311
hion->
SetEmModel
(
new
G4BetheBlochIonGasModel
(), 2);
312
pmanager->
AddProcess
(hion, -1, 2, 2);
313
314
}
else
if
( particleName ==
"alpha"
) {
315
316
// STANDARD msc is active in the world
317
G4hMultipleScattering
* msc =
new
G4hMultipleScattering
();
318
msc->
AddEmModel
(1,
new
G4UrbanMscModel
());
319
pmanager->
AddProcess
(msc, -1, 1, -1);
320
321
// STANDARD ionisation is active in the world
322
G4ionIonisation
* hion =
new
G4ionIonisation
();
323
hion->
SetEmModel
(
new
G4BraggIonGasModel
(),1);
324
hion->
SetEmModel
(
new
G4BetheBlochIonGasModel
(), 2);
325
pmanager->
AddProcess
(hion, -1, 2, 2);
326
327
// DNA excitation is not active in the world
328
G4DNAExcitation
* dnaex =
new
G4DNAExcitation
(
"alpha_G4DNAExcitation"
);
329
dnaex->
SetEmModel
(
new
G4DummyModel
(),1);
330
pmanager->
AddDiscreteProcess
(dnaex);
331
332
// DNA ionisation is not active in the world
333
G4DNAIonisation
* dnaioni =
new
G4DNAIonisation
(
"alpha_G4DNAIonisation"
);
334
dnaioni->
SetEmModel
(
new
G4DummyModel
(),1);
335
pmanager->
AddDiscreteProcess
(dnaioni);
336
337
// DNA charge decrease is ACTIVE in the world since no
338
// corresponding STANDARD process exist
339
pmanager->
AddDiscreteProcess
(
340
new
G4DNAChargeDecrease
(
"alpha_G4DNAChargeDecrease"
));
341
342
}
else
if
( particleName ==
"alpha+"
) {
343
344
// DNA processes are ACTIVE in the world since no
345
// corresponding STANDARD processes exist
346
pmanager->
AddDiscreteProcess
(
347
new
G4DNAExcitation
(
"alpha+_G4DNAExcitation"
));
348
pmanager->
AddDiscreteProcess
(
349
new
G4DNAIonisation
(
"alpha+_G4DNAIonisation"
));
350
pmanager->
AddDiscreteProcess
(
351
new
G4DNAChargeDecrease
(
"alpha+_G4DNAChargeDecrease"
));
352
pmanager->
AddDiscreteProcess
(
353
new
G4DNAChargeIncrease
(
"alpha+_G4DNAChargeIncrease"
));
354
355
}
else
if
( particleName ==
"helium"
) {
356
357
// DNA processes are ACTIVE in the world since no
358
// corresponding STANDARD processes exist
359
pmanager->
AddDiscreteProcess
(
360
new
G4DNAExcitation
(
"helium_G4DNAExcitation"
));
361
pmanager->
AddDiscreteProcess
(
362
new
G4DNAIonisation
(
"helium_G4DNAIonisation"
));
363
pmanager->
AddDiscreteProcess
(
364
new
G4DNAChargeIncrease
(
"helium_G4DNAChargeIncrease"
));
365
366
}
367
}
368
369
// **************************************
370
// 2) Define processes for Target region
371
// **************************************
372
373
// STANDARD EM processes should be inactivated when
374
// corresponding DNA processes are used
375
// - STANDARD EM e- processes are inactivated below 1 MeV
376
// - STANDARD EM proton & alpha processes are inactivated below
377
// standEnergyLimit
378
G4double
standEnergyLimit = 9.9*
MeV
;
379
//
380
381
G4double
massFactor = 1.0079/4.0026;
382
G4EmConfigurator
*
em_config
=
383
G4LossTableManager::Instance
()->
EmConfigurator
();
384
385
G4VEmModel
* mod;
386
387
// *** e-
388
389
// ---> STANDARD EM processes are inactivated below 1 MeV
390
391
mod =
new
G4UrbanMscModel
();
392
mod->
SetActivationLowEnergyLimit
(1.*
MeV
);
393
em_config->
SetExtraEmModel
(
"e-"
,
"msc"
,mod,
"Target"
);
394
395
mod =
new
G4MollerBhabhaModel
();
396
mod->
SetActivationLowEnergyLimit
(1*
MeV
);
397
em_config->
SetExtraEmModel
(
"e-"
,
398
"eIoni"
,
399
mod,
400
"Target"
,
401
0.0,
402
100*
TeV
,
403
new
G4UniversalFluctuation
());
404
405
// ---> DNA processes activated
406
407
mod =
new
G4DNAChampionElasticModel
();
408
em_config->
SetExtraEmModel
(
"e-"
,
"e-_G4DNAElastic"
,
409
mod,
"Target"
,7.4*
eV
,1.*
MeV
);
410
411
mod =
new
G4DNABornIonisationModel
();
412
em_config->
SetExtraEmModel
(
"e-"
,
"e-_G4DNAIonisation"
,
413
mod,
"Target"
,11.*
eV
,1.*
MeV
);
414
// Note: valid from 11 eV to 0.999.. MeV then switch to std models at
415
// higher energies ; same for other models
416
417
mod =
new
G4DNABornExcitationModel
();
418
em_config->
SetExtraEmModel
(
"e-"
,
"e-_G4DNAExcitation"
,
419
mod,
"Target"
,9.*
eV
,1.*
MeV
);
420
421
mod =
new
G4DNAMeltonAttachmentModel
();
422
em_config->
SetExtraEmModel
(
"e-"
,
"e-_G4DNAAttachment"
,
423
mod,
"Target"
,4.*
eV
,13.*
eV
);
424
425
mod =
new
G4DNASancheExcitationModel
();
426
em_config->
SetExtraEmModel
(
"e-"
,
"e-_G4DNAVibExcitation"
,
427
mod,
"Target"
,2.*
eV
,100.*
eV
);
428
429
// *** proton
430
431
// ---> STANDARD EM processes inactivated below standEnergyLimit
432
433
// STANDARD msc is still active
434
// Inactivate following STANDARD processes
435
436
mod =
new
G4BraggIonGasModel
();
437
mod->
SetActivationLowEnergyLimit
(standEnergyLimit);
438
em_config->
SetExtraEmModel
(
"proton"
,
"hIoni"
,
439
mod,
"Target"
,0.0,2*
MeV
,
new
G4IonFluctuations
());
440
441
mod =
new
G4BetheBlochIonGasModel
();
442
mod->
SetActivationLowEnergyLimit
(standEnergyLimit);
443
em_config->
SetExtraEmModel
(
"proton"
,
"hIoni"
,
444
mod,
"Target"
,2*
MeV
,100*
TeV
,
445
new
G4UniversalFluctuation
());
446
447
// ---> DNA processes activated
448
449
mod =
new
G4DNARuddIonisationModel
();
450
em_config->
SetExtraEmModel
(
"proton"
,
"proton_G4DNAIonisation"
,
451
mod,
"Target"
,0.0,0.5*
MeV
);
452
453
mod =
new
G4DNABornIonisationModel
();
454
em_config->
SetExtraEmModel
(
"proton"
,
"proton_G4DNAIonisation"
,
455
mod,
"Target"
,0.5*
MeV
,10*
MeV
);
456
457
mod =
new
G4DNAMillerGreenExcitationModel
();
458
em_config->
SetExtraEmModel
(
"proton"
,
"proton_G4DNAExcitation"
,
459
mod,
"Target"
,10*
eV
,0.5*
MeV
);
460
461
mod =
new
G4DNABornExcitationModel
();
462
em_config->
SetExtraEmModel
(
"proton"
,
"proton_G4DNAExcitation"
,
463
mod,
"Target"
,0.5*
MeV
,10*
MeV
);
464
465
// *** alpha
466
467
// ---> STANDARD EM processes inactivated below standEnergyLimit
468
469
// STANDARD msc is still active
470
// Inactivate following STANDARD processes
471
472
mod =
new
G4BraggIonGasModel
();
473
mod->
SetActivationLowEnergyLimit
(standEnergyLimit);
474
em_config->
SetExtraEmModel
(
"alpha"
,
"ionIoni"
,
475
mod,
"Target"
,0.0,2*
MeV
/massFactor,
476
new
G4IonFluctuations
());
477
478
mod =
new
G4BetheBlochIonGasModel
();
479
mod->
SetActivationLowEnergyLimit
(standEnergyLimit);
480
em_config->
SetExtraEmModel
(
"alpha"
,
"ionIoni"
,
481
mod,
"Target"
,2*
MeV
/massFactor,100*
TeV
,
482
new
G4UniversalFluctuation
());
483
484
// ---> DNA processes activated
485
486
mod =
new
G4DNARuddIonisationModel
();
487
em_config->
SetExtraEmModel
(
"alpha"
,
"alpha_G4DNAIonisation"
,
488
mod,
"Target"
,0.0,10*
MeV
);
489
490
mod =
new
G4DNAMillerGreenExcitationModel
();
491
em_config->
SetExtraEmModel
(
"alpha"
,
"alpha_G4DNAExcitation"
,
492
mod,
"Target"
,1*
keV
,10*
MeV
);
493
494
}
495
496
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
497
498
void
PhysicsList::ConstructGeneral
()
499
{ }
500
501
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
502
503
void
PhysicsList::SetCuts
()
504
{
505
if
(
verboseLevel
>0)
506
{
507
G4cout
<<
"PhysicsList::SetCuts:"
;
508
G4cout
<<
"CutLength : "
<<
G4BestUnit
(
defaultCutValue
,
"Length"
) <<
G4endl
;
509
}
510
511
// set cut values for gamma at first and for e- second and next for e+,
512
// because some processes for e+/e- need cut values for gamma
513
SetCutValue
(
fCutForGamma
,
"gamma"
);
514
SetCutValue
(
fCutForElectron
,
"e-"
);
515
SetCutValue
(
fCutForPositron
,
"e+"
);
516
SetCutValue
(
fCutForProton
,
"proton"
);
517
518
if
(
verboseLevel
>0) {
DumpCutValuesTable
(); }
519
}
520
521
void
PhysicsList::SetNumberOfSplit
(
G4int
nb) {
522
fNumberOfSplit
= nb;
523
}
524
525
G4int
PhysicsList::GetNumberOfSplit
() {
526
return
fNumberOfSplit
;
527
}
528
geant4
tree
geant4-10.6-release
examples
extended
medical
dna
splitting
src
PhysicsList.cc
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:24:51
using
1.8.2 with
ECCE GitHub integration