Skip to content

Commit c1eb078

Browse files
authored
Merge pull request #12 from rest-for-physics/event_processing
Implementation of full ray-tracing event processing
2 parents fe645e9 + f384ae2 commit c1eb078

34 files changed

+1379
-4799
lines changed

.github/workflows/validation.yml

+33-3
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ jobs:
8080
restRoot -b -q GetMagneticField_test.C
8181
cd ../boundary/
8282
restRoot -b -q Boundaries_test.C
83-
- name: Optics
83+
- name: Optics Mirrors
8484
run: |
8585
source ${{ env.REST_PATH }}/thisREST.sh
8686
cd pipeline/metadata/optics/
@@ -91,8 +91,12 @@ jobs:
9191
wget https://sultan.unizar.es/axionlib-data/opticsMirror/Reflectivity_Single_Au_250_Ni_0.4.N901f
9292
wget https://sultan.unizar.es/axionlib-data/opticsMirror/Transmission_Single_Au_250_Ni_0.4.N901f
9393
python mirrors.py
94-
#python optics.py
95-
#python basic.py
94+
- name: MCPL Optics
95+
run: |
96+
source ${{ env.REST_PATH }}/thisREST.sh
97+
cd pipeline/metadata/optics/
98+
wget https://sultan.unizar.es/axionlib-data/optics/optics.rml
99+
python mcpl.py
96100
- name: X-ray transmission
97101
run: |
98102
source ${{ env.REST_PATH }}/thisREST.sh
@@ -114,3 +118,29 @@ jobs:
114118
python solarTests.py
115119
python solarPlot.py
116120
python compare.py
121+
122+
Ray-tracing:
123+
name: Check ray-tracing processing chain
124+
runs-on: ubuntu-latest
125+
container:
126+
image: ghcr.io/lobis/root-geant4-garfield:rest-for-physics
127+
needs: [ build-axionlib ]
128+
steps:
129+
- uses: actions/checkout@v3
130+
- name: Restore cache
131+
uses: actions/cache@v3
132+
id: axionlib-install-cache
133+
with:
134+
key: ${{ env.BRANCH_NAME }}-${{ github.sha }}
135+
path: ${{ env.REST_PATH }}
136+
- name: XMM optics bench ray-tracing
137+
run: |
138+
source ${{ env.REST_PATH }}/thisREST.sh
139+
export REST_NEVENTS=1000
140+
export REST_RUN=100
141+
wget https://sultan.unizar.es/axionlib-data/optics/xmm.rml
142+
wget https://sultan.unizar.es/axionlib-data/optics/XMM.Wolter
143+
wget https://sultan.unizar.es/axionlib-data/opticsMirror/Reflectivity_Single_Au_250_Ni_0.4.N901f
144+
wget https://sultan.unizar.es/axionlib-data/opticsMirror/Transmission_Single_Au_250_Ni_0.4.N901f
145+
restManager --c opticsBench.rml
146+
restRoot ValidateXMM.C'("OpticsBench_Yaw_0.02_Dev_0.005_BabyIAXO_Run00100.root")'

.gitlab-ci.yml

+29
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ stages:
55
- build
66
- loadRESTLibs
77
- metadata
8+
- ray-tracing
89

910
before_script:
1011
- export USER="axion"
@@ -104,6 +105,17 @@ mirrors:
104105
variables:
105106
- $CRONJOB
106107

108+
MCPL Optics:
109+
stage: metadata
110+
script:
111+
- . ${CI_PROJECT_DIR}/install/thisREST.sh
112+
- cd ${CI_PROJECT_DIR}/pipeline/metadata/optics/
113+
- wget https://sultan.unizar.es/axionlib-data/optics/optics.rml
114+
- python mcpl.py
115+
except:
116+
variables:
117+
- $CRONJOB
118+
107119
xRayTransmission:
108120
stage: metadata
109121
script:
@@ -131,3 +143,20 @@ solarFlux:
131143
except:
132144
variables:
133145
- $CRONJOB
146+
147+
XMM optics bench ray-tracing:
148+
stage: ray-tracing
149+
script:
150+
- . ${CI_PROJECT_DIR}/install/thisREST.sh
151+
- cd ${CI_PROJECT_DIR}/pipeline/ray-tracing/
152+
- export REST_NEVENTS=1000
153+
- export REST_RUN=100
154+
- wget https://sultan.unizar.es/axionlib-data/opticsMirror/Reflectivity_Single_Au_250_Ni_0.4.N901f
155+
- wget https://sultan.unizar.es/axionlib-data/opticsMirror/Transmission_Single_Au_250_Ni_0.4.N901f
156+
- wget https://sultan.unizar.es/axionlib-data/optics/xmm.rml
157+
- wget https://sultan.unizar.es/axionlib-data/optics/XMM.Wolter
158+
- restManager --c opticsBench.rml
159+
- restRoot ValidateXMM.C'("OpticsBench_Yaw_0.05_Dev_0.005_BabyIAXO_Run00100.root")'
160+
except:
161+
variables:
162+
- $CRONJOB

CMakeLists.txt

+5
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,10 @@ INSTALL(DIRECTORY ./data/
6868
COMPONENT install
6969
)
7070

71+
INSTALL(DIRECTORY ./examples/
72+
DESTINATION ./examples/axion/
73+
COMPONENT install
74+
)
75+
7176
file(GLOB_RECURSE MAC "${CMAKE_CURRENT_SOURCE_DIR}/macros/*")
7277
INSTALL(FILES ${MAC} DESTINATION ./macros/axion)

README.md

+7
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,10 @@ cd framework/build
5959
cmake -DRESTLIB_AXION=ON ../
6060
make -j4 install
6161
```
62+
63+
### Publications
64+
65+
This repository makes use of the following published codes:
66+
- K. Altenmuller et al, REST-for-Physics, a ROOT-based framework for event oriented data analysis and combined Monte Carlo response, [Computer Physics Communications 273, April 2022, 108281](https://doi.org/10.1016/j.cpc.2021.108281).
67+
- S.Hoof, J.Jaeckel, T.J.Lennert, Quantifying uncertainties in the solar axion flux and their impact on determining axion model parameters, [JCAP09(2021)006](https://doi.org/10.1088/1475-7516/2021/09/006).
68+
- T.Kittelmann, E.Klinkby, E.B.Knudsen, P.Willendrup, X.X.Cai, K.Kanaki, Monte Carlo Particle Lists: MCPL, Computer Physics Communications 218 (2017) 17–42](http://dx.doi.org/10.17632/cby92vsv5g.1).

data

Submodule data updated 1 file

examples/README.md

+2
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
TOBE written, say few words listing, and describing the examples, and briefly explain how to use them.
2+
3+
- **opticsBench.rml**: It defines a simple generator with a parallel flux in order to validate the optics process.

examples/axionGenerator.rml

+78-111
Original file line numberDiff line numberDiff line change
@@ -1,113 +1,80 @@
1-
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
2-
3-
<!--This file is an example of REST simulation functionality. We process the output root file
4-
from restG4, converting its TRestGeant4Event to TRestDetectorSignalEvent. Observables and processes's
5-
internal values are saved.
6-
-->
7-
1+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
82
<TRestManager name="RESTManagerSim" title="Template manager to process a simulation generated by restG4." verboseLevel="info">
9-
10-
<TRestRun name="axionRun" title="REST Metadata run info (template)" verboseLevel="info">
11-
<parameter name="experimentName" value="babyIAXO"/>
12-
<parameter name="runType" value="simulation"/>
13-
<parameter name="runNumber" value="auto"/> <!-- it will find next run number from database when we use "auto" -->
14-
<parameter name="runTag" value="Template"/>
15-
<parameter name="runDescription" value="We launched 100000 events to check everything is ok for 1 volume and from a plane YZ."/>
16-
<parameter name="user" value="${USER}"/>
17-
<parameter name="verboseLevel" value="2"/>
18-
<parameter name="outputFileName" value="./Run_[fExperimentName]_randomWall.root" />
19-
20-
<TRestAxionSolarModel name="sunPrimakoff" file="metadata.rml" verboseLevel="warning" />
21-
<TRestAxionMagneticField name="bFieldBabyIAXO" file="metadata.rml"/>
22-
<TRestAxionBufferGas name="helium" file="metadata.rml"/>
23-
<!--<TRestAxionLikelihood name="babyIAXO" file="metadata.rml" verboseLevel="debug" />-->
24-
25-
</TRestRun>
26-
27-
28-
<TRestProcessRunner name="EventProcess" verboseLevel="info">
29-
<parameter name="eventsToProcess" value="10000" />
30-
<parameter name="threadNumber" value="1"/>
31-
32-
<parameter name="inputAnalysis" value="on"/>
33-
<parameter name="inputEvent" value="on"/>
34-
<parameter name="outputEvent" value="on"/>
35-
36-
<addProcess type="TRestAxionGeneratorProcess" name="axionGen" value="ON" verboseLevel="info" >
37-
<parameter name="energyStep" value="1.e-3keV" />
38-
39-
<parameter name="energyRange" value="(0,15)keV" />
40-
41-
<parameter name="axionMass" value="2.0e-3eV" />
42-
43-
<parameter name="angularDistribution" value="flux" />
44-
<parameter name="angularDirection" value="(-1,0,1)mm" /> <!-- "(-1,0,5)mm"-->
45-
46-
<parameter name="spatialDistribution" value="circleWallXY" /> <!--circleWall or circleWallYZ or sphereIn or sphereOut -->
47-
<parameter name="spatialRadius" value="6500mm" />
48-
<parameter name="spatialOrigin" value="(10000,0,-1000)mm" />
49-
<!--<parameter name="mode" value="nPlanRotation" />--> <!-- XYZRotation or nPlanRotation-->
50-
<!--<parameter name="rotation" value="(0,-0.789,0)" />-->
51-
<!--<parameter name="normalWall" value="(-1,0,5)mm" />--> <!-- "(1,0,-10)mm" -->
52-
</addProcess>
53-
54-
<addProcess type="TRestAxionAnalysisProcess" name="axGen1" value="ON" verboseLevel="info" >
55-
<observable name="energy" value="ON" />
56-
<observable name="posX" value="ON" />
57-
<observable name="posY" value="ON" />
58-
<observable name="posZ" value="ON" />
59-
<observable name="probability" value="ON" />
60-
</addProcess>
61-
62-
<addProcess type="TRestAxionFieldPropagationProcess" name="babyMagnet" value="ON" verboseLevel="info" >
63-
<parameter name="mode" value="plan" /> <!-- plan or distance -->
64-
<parameter name="distance" value="30000mm" />
65-
<parameter name="finalNPlan" value="(0,0,1)mm" />
66-
<parameter name="finalPositionPlan" value="(0,0,10000)mm" />
67-
</addProcess>
68-
69-
<addProcess type="TRestAxionTransmissionProcess" name="magnetWindow" value="ON" verboseLevel="info" >
70-
</addProcess>
71-
72-
<addProcess type="TRestAxionOpticsResponseProcess" name="optics" value="ON" verboseLevel="info" >
73-
</addProcess>
74-
75-
<addProcess type="TRestAxionTransmissionProcess" name="detectorWindow" value="ON" verboseLevel="info" >
76-
</addProcess>
77-
78-
<addProcess type="TRestAxionAnalysisProcess" name="axGen2" value="ON" verboseLevel="info" >
79-
<observable name="energy" value="ON" />
80-
<observable name="posX" value="ON" />
81-
<observable name="posY" value="ON" />
82-
<observable name="posZ" value="ON" />
83-
<observable name="probability" value="ON" />
84-
</addProcess>
85-
86-
<!-- file="processes.rml"/> -->
87-
88-
</TRestProcessRunner>
89-
90-
<!--
91-
<TRestAxionSolarModel name="sunPrimakoff" file="metadata.rml" verboseLevel="info" />
92-
93-
<addTask command="sunPrimakoff->PrintMetadata()" value="ON"/>
94-
95-
<addTask type="processEvents" value="ON" />-->
96-
<addTask command="EventProcess->RunProcess()" value="ON"/>
97-
98-
<!--<parameter name="outputLevel" value="internalvar" /> -->
99-
<!-- options are : nooutput(0), observable(1), internalvar(2), fulloutput(3) --> -
100-
101-
<globals>
102-
<parameter name="verboseLevel" value="essential" /> <!-- options are : silent(0), essential(1), info(2), info(3), extreme(4) -->
103-
<parameter name="inputFileName" value=""/>
104-
105-
<searchPath value="$ENV{REST_INPUTDATA}/definitions/"/>
106-
107-
<variable name="PI" value="3.14" overwrite="false" />
108-
</globals>
109-
3+
<globals>
4+
<parameter name="verboseLevel" value="essential"/>
5+
<!-- options are : silent(0), essential(1), info(2), info(3), extreme(4) -->
6+
<parameter name="inputFileName" value=""/>
7+
<parameter name="Pi" value="3.1415927"/>
8+
</globals>
9+
<TRestRun name="axionRun" title="BabyIAXO V1.0" verboseLevel="info">
10+
<parameter name="experimentName" value="babyIAXO"/>
11+
<parameter name="runType" value="simulation"/>
12+
<parameter name="runNumber" value="auto"/>
13+
<parameter name="runTag" value="Dummy"/>
14+
<parameter name="runDescription" value=""/>
15+
<parameter name="user" value="${USER}"/>
16+
<parameter name="verboseLevel" value="2"/>
17+
<parameter name="outputFileName" value="./Run_[fExperimentName]_[fRunTag]_PrimakoffDummy_[fRunNumber].root"/>
18+
<TRestAxionSolarFlux name="combined" verboseLevel="info">
19+
<parameter name="couplingType" value="g_ag"/>
20+
<parameter name="couplingStrength" value="1.e-10"/>
21+
<parameter name="fluxDataFile" value="Primakoff_Gianotti_201904.dat"/>
22+
<parameter name="fluxSptFile" value="Dummy_Galan_202202.spt"/>
23+
<parameter name="seed" value="137"/>
24+
</TRestAxionSolarFlux>
25+
<TRestAxionMagneticField name="bFieldBabyIAXO" title="bFieldBabyIAXO">
26+
<addMagneticVolume fileName="Bykovskiy_201906.dat" position="(0,0,-4500)mm"/>
27+
</TRestAxionMagneticField>
28+
<TRestAxionBufferGas name="helium" verboseLevel="warning">
29+
<gas name="He" density="0.0025e-6"/>
30+
</TRestAxionBufferGas>
31+
</TRestRun>
32+
<TRestProcessRunner name="EventProcess" verboseLevel="info">
33+
<parameter name="eventsToProcess" value="1000"/>
34+
<parameter name="threadNumber" value="1"/>
35+
<parameter name="inputAnalysis" value="on"/>
36+
<parameter name="inputEvent" value="off"/>
37+
<parameter name="outputEvent" value="on"/>
38+
<addProcess type="TRestAxionGeneratorProcess" name="axionGen" value="ON" verboseLevel="info">
39+
<parameter name="axionMass" value="5meV"/>
40+
<parameter name="detectorRadius" value="75cm"/>
41+
</addProcess>
42+
<addProcess type="TRestAxionAnalysisProcess" name="axGen1" value="ON" verboseLevel="info">
43+
<observable name="energy" value="ON"/>
44+
<observable name="posX" value="ON"/>
45+
<observable name="posY" value="ON"/>
46+
<observable name="posZ" value="ON"/>
47+
</addProcess>
48+
<!-- We move the particle 1-m before origin -->
49+
<addProcess type="TRestAxionTransportProcess" name="ToOpticsEntrance" zPosition="-1000">
50+
</addProcess>
51+
<addProcess type="TRestAxionAnalysisProcess" name="beforeOptics" value="ON" verboseLevel="info">
52+
<observable name="energy" value="ON"/>
53+
<observable name="posX" value="ON"/>
54+
<observable name="posY" value="ON"/>
55+
<observable name="posZ" value="ON"/>
56+
</addProcess>
57+
<addProcess type="TRestAxionFieldPropagationProcess" name="babyMagnet" value="OFF" verboseLevel="info">
58+
<parameter name="center" value="(0,0,-5)m"/>
59+
<parameter name="theta" value="10.*Pi/180."/>
60+
<parameter name="phi" value="5.*Pi/180."/>
61+
<parameter name="displacement" value="(7,-7)mm"/>
62+
</addProcess>
63+
<addProcess type="TRestAxionTransmissionProcess" name="magnetWindow" value="OFF" verboseLevel="info"> </addProcess>
64+
<addProcess type="TRestAxionOpticsResponseProcess" name="optics" value="OFF" verboseLevel="info"> </addProcess>
65+
<addProcess type="TRestAxionTransmissionProcess" name="detectorWindow" value="OFF" verboseLevel="info"> </addProcess>
66+
<addProcess type="TRestAxionAnalysisProcess" name="axGen2" value="OFF" verboseLevel="info">
67+
<observable name="energy" value="ON"/>
68+
<observable name="posX" value="ON"/>
69+
<observable name="posY" value="ON"/>
70+
<observable name="posZ" value="ON"/>
71+
<observable name="probability" value="ON"/>
72+
</addProcess>
73+
</TRestProcessRunner>
74+
<!--
75+
<TRestAxionSolarModel name="sunPrimakoff" file="metadata.rml" verboseLevel="info" />
76+
77+
<addTask command="sunPrimakoff->PrintMetadata()" value="ON"/>
78+
-->
79+
<addTask command="EventProcess-&gt;RunProcess()" value="ON"/>
11080
</TRestManager>
111-
112-
113-
<!--paramater here is accessible to all the classes -->

examples/opticsBench.rml

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+
<TRestManager name="RESTManagerSim" title="Template manager to process a simulation generated by restG4." verboseLevel="info">
3+
<globals>
4+
<parameter name="verboseLevel" value="essential"/>
5+
<!-- options are : silent(0), essential(1), info(2), info(3), extreme(4) -->
6+
<parameter name="inputFileName" value=""/>
7+
<parameter name="Pi" value="3.1415927"/>
8+
<variable name="REST_DEV" value="0.005"/>
9+
<variable name="REST_YAW" value="0.05"/>
10+
<variable name="REST_NEVENTS" value="1000000"/>
11+
<variable name="REST_RUN" value="auto"/>
12+
</globals>
13+
<TRestRun name="axionRun" title="BabyIAXO V1.0" verboseLevel="info">
14+
<parameter name="experimentName" value="BabyIAXO"/>
15+
<parameter name="runType" value="OpticsBench"/>
16+
<parameter name="runNumber" value="${REST_RUN}"/>
17+
<parameter name="runTag" value="Yaw_${REST_YAW}_Dev_${REST_DEV}"/>
18+
<parameter name="runDescription" value=""/>
19+
<parameter name="user" value="${USER}"/>
20+
<parameter name="verboseLevel" value="2"/>
21+
<parameter name="outputFileName" value="[fRunType]_[fRunTag]_[fExperimentName]_Run[fRunNumber].root"/>
22+
<!-- Optics definition -->
23+
<TRestAxionWolterOptics file="xmm.rml"/>
24+
</TRestRun>
25+
<TRestProcessRunner name="EventProcess" verboseLevel="info">
26+
<parameter name="eventsToProcess" value="${REST_NEVENTS}"/>
27+
<parameter name="threadNumber" value="1"/>
28+
<parameter name="inputAnalysis" value="on"/>
29+
<parameter name="inputEvent" value="off"/>
30+
<parameter name="outputEvent" value="on"/>
31+
<addProcess type="TRestAxionGeneratorProcess" name="axionGen" value="ON" verboseLevel="info">
32+
<parameter name="generatorType" value="flat"/>
33+
<parameter name="maxEnergy" value="10"/>
34+
<parameter name="axionMass" value="5meV"/>
35+
<parameter name="targetRadius" value="40cm"/>
36+
</addProcess>
37+
<addProcess type="TRestAxionAnalysisProcess" name="axGen1" observable="all"/>
38+
<!-- Moving to Z=-1000 -->
39+
<addProcess type="TRestAxionTransportProcess" name="ToOpticsEntrance" zPosition="-350"/>
40+
<addProcess type="TRestAxionDeviationProcess" name="deviation" devAngle="${REST_DEV}degrees" value="ON"/>
41+
<addProcess type="TRestAxionAnalysisProcess" name="beforeOptics" verboseLevel="info">
42+
<observable name="posX"/>
43+
<observable name="posY"/>
44+
</addProcess>
45+
<!-- Optics response -->
46+
<addProcess type="TRestAxionOpticsProcess" name="optics">
47+
<parameter name="center" value="(0,0,0)"/>
48+
<parameter name="yaw" value="${REST_YAW}degrees"/>
49+
<parameter name="opticalAxis" value="false"/>
50+
<observable name="efficiency" value="ON"/>
51+
</addProcess>
52+
<addProcess type="TRestAxionAnalysisProcess" name="afterOptics">
53+
<observable name="posX"/>
54+
<observable name="posY"/>
55+
</addProcess>
56+
<!-- Moving to Z=1500 -->
57+
<addProcess type="TRestAxionTransportProcess" name="ToZ1500" zPosition="1500"/>
58+
<addProcess type="TRestAxionAnalysisProcess" name="z1500">
59+
<observable name="posX"/>
60+
<observable name="posY"/>
61+
</addProcess>
62+
<!-- Moving to Z=7500 -->
63+
<addProcess type="TRestAxionTransportProcess" name="ToFocalPoint" zPosition="7500"/>
64+
<addProcess type="TRestAxionAnalysisProcess" name="focal">
65+
<observable name="posX"/>
66+
<observable name="posY"/>
67+
</addProcess>
68+
</TRestProcessRunner>
69+
<addTask command="EventProcess-&gt;RunProcess()" value="ON"/>
70+
</TRestManager>

0 commit comments

Comments
 (0)