From ab28b6b051c8a13b3e99acc67de84e502098265f Mon Sep 17 00:00:00 2001 From: axelrannou Date: Fri, 25 Apr 2025 13:12:48 +0200 Subject: [PATCH 1/2] added model for anode heel effect + test --- .../contrib/carm/anode_heel_effect_model.py | 47 ++++++ opengate/contrib/carm/anodeheeleffect.npz | Bin 1108 -> 0 bytes .../contrib/carm/experimental_values.json | 34 ++++ opengate/contrib/carm/gbr_model.pkl | Bin 0 -> 195757 bytes opengate/contrib/carm/gbr_scaler.pkl | Bin 0 -> 1063 bytes opengate/contrib/carm/siemensciosalpha.py | 32 ++-- .../tests/src/test075_siemens_cios_alpha.py | 153 ++++++++++++++++-- 7 files changed, 237 insertions(+), 29 deletions(-) create mode 100644 opengate/contrib/carm/anode_heel_effect_model.py delete mode 100644 opengate/contrib/carm/anodeheeleffect.npz create mode 100644 opengate/contrib/carm/experimental_values.json create mode 100644 opengate/contrib/carm/gbr_model.pkl create mode 100644 opengate/contrib/carm/gbr_scaler.pkl diff --git a/opengate/contrib/carm/anode_heel_effect_model.py b/opengate/contrib/carm/anode_heel_effect_model.py new file mode 100644 index 000000000..5ea9b9c3f --- /dev/null +++ b/opengate/contrib/carm/anode_heel_effect_model.py @@ -0,0 +1,47 @@ +import numpy as np +import pandas as pd +import pathlib +import joblib +from scipy.interpolate import interp1d + +# Function to generate phi_weights and phi_angles based on kvp (energy) +def get_phi_distribution(kvp): + # Load the scaler and model + current_path = pathlib.Path(__file__).parent.resolve() + scaler = joblib.load(current_path / "gbr_scaler.pkl") + gbr_model = joblib.load(current_path / "gbr_model.pkl") + + distances = np.arange(-9, 10, 1) + phi_angles = np.arctan(distances / 70) + + + # Create a DataFrame for prediction + input_data = pd.DataFrame({ + 'Distance': distances, + 'Energy': kvp, + 'Theta': phi_angles, + 'ThetaDegrees': np.degrees(phi_angles) + }) + + # Scale the input data + input_data_scaled = scaler.transform(input_data) + + # Predict the weights + phi_weights = gbr_model.predict(input_data_scaled) + + # Now interpolate between the predicted values with finer steps + fine_distances = np.arange(-9, 9.01, 0.1) + fine_phi_angles = np.arctan(fine_distances / 70) + + # Interpolate the predicted weights using linear interpolation + interp_function = interp1d(distances, phi_weights, kind='linear') + + # Interpolate predictions for the finer distances + fine_phi_weights = interp_function(fine_distances) + fine_phi_weights = fine_phi_weights[1:] + + # Adjust angles (shift them by 90 degrees in radians) + for i in range(len(fine_phi_angles)): + fine_phi_angles[i] = fine_phi_angles[i] + 180 * np.pi / 180 + + return fine_phi_weights, fine_phi_angles \ No newline at end of file diff --git a/opengate/contrib/carm/anodeheeleffect.npz b/opengate/contrib/carm/anodeheeleffect.npz deleted file mode 100644 index cc60bb367413b310c678ad8065fb4bca182276d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1108 zcmWIWW@Zs#fB;2?)_DQ{H!w0VfG{V62t#6CdQPfdUO^=zg8*0%q!1(t0+anheFGvH z8Oj){)l*W7lZ(`?6x40fEYx)r)YI~dN{SNm;`57AQbFQwi8;loK=I;?#DY{HU&Gi! zM^i_kR)KuL_2tu>iB9<(4(pHVZ+u=)#mH4hOaDt?zAnI2<0@{@{B)mBV3< zfVJL)`5X=rk86D`S8_OrY&($iXcLFS`3~lu?mZk1UD0lw4tp;1aT+}4a426EsB!ZRhl5e&6!)fY91iciucv7p32ZP8x`|`6m9bRkyzbjF~>9FjdTV%4^IUQt| z9Jdyk$mwvSj4OKYEKY|hp1xISOE?|;WhTtzU&rad{r=L99osn_jvW-ek$8~Pp>ayY zcdpZ%4mRnt#kO4GbO=C+>T`k4}8VwHFs~&92UE^@VzS(%{MXr{E_Gce|dt*A~ zxV`7`ZtE%657uT647R(=K~R=zJJ-bbvP_ vlL#}e3=MHLh-?7IFFbprYeP*O$l6{5H6oHqfHx}}NR|l*^MUkvW)Kem$>}^u diff --git a/opengate/contrib/carm/experimental_values.json b/opengate/contrib/carm/experimental_values.json new file mode 100644 index 000000000..a9adb8183 --- /dev/null +++ b/opengate/contrib/carm/experimental_values.json @@ -0,0 +1,34 @@ +{ + "50": { + "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "weight": [0.0374836173001311, 0.64720600500417, 0.721077088049565, 0.782199451924223, 0.839985702371023, 0.866198022161325, 0.903371857500298, 0.942213749553199, 0.890980579053974, 0.994042654593113, 1.0, 1.02823781722864, 1.0296675801263, 1.02311450017872, 1.04646729417372, 1.03991421422614, 1.03812701060408, 1.04253544620517, 1.08804956511379, 1.07887525318718, 0.0378887167877994] + }, + "60": { + "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "weight": [0.0374768661320173, 0.670573719925972, 0.751079580505861, 0.795496607032696, 0.862122146822949, 0.906539173349784, 0.912091301665638, 0.942319555829735, 0.969463294262801, 0.959901295496607, 1.0, 0.970080197409007, 1.0308451573103, 1.0410240592227, 1.0407156076496, 1.04380012338063, 1.03917334978408, 1.0613818630475, 1.01357186921653, 0.898519432449105, 0.0378470080197409] + }, + "70": { + "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "weight": [0.0465753424657534, 0.629144331943617, 0.756204089735954, 0.79630732578916, 0.840182648401826, 0.881080007941235, 0.912249354774668, 0.937661306333135, 0.965455628350208, 0.984117530275958, 1.0, 1.01290450665078, 1.03434584077824, 1.03911058169545, 1.04625769307127, 1.04744887830058, 1.03911058169545, 1.01111772880683, 1.01608100059559, 0.808616239825293, 0.0480643240023824] + }, + "80": { + "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "weight": [0.0441979872663791, 0.647360854384884, 0.75374820291641, 0.786609159991785, 0.83651673855001, 0.873279934278086, 0.90798932018895, 0.945163277880468, 0.957896898747176, 0.951735469295543, 1.0, 1.0145820497022, 1.03388786198398, 1.04066543438078, 1.03470938591087, 1.04805914972274, 1.04210310125282, 1.02752105155063, 1.01109057301294, 1.0262887656603, 0.046991168617786] + }, + "90": { + "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "weight": [0.060656574247321, 0.635652321823439, 0.747576118387481, 0.795713556727335, 0.84504167375404, 0.887906106480694, 0.920734818846743, 0.946419459091682, 0.967171287633951, 0.969892838918183, 1.0, 1.00408232692635, 1.04643646878721, 1.05290015308726, 1.06072461302943, 1.0580030617452, 1.05409083177411, 1.05443102568464, 0.986052049668311, 1.09627487667971, 0.0656574247320973] + }, + "100": { + "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "weight": [0.0898376184032476, 0.644925575101489, 0.719891745602165, 0.790527740189445, 0.843031123139378, 0.887821380243572, 0.922733423545332, 0.951556156968877, 0.979296346414073, 0.990933694181326, 1.0, 1.04208389715832, 1.0553450608931, 1.06887686062246, 1.07510148849797, 1.07861975642761, 1.07307171853857, 1.06657645466847, 1.05439783491204, 0.985926928281461, 0.102692828146143] + }, + "110": { + "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "weight": [0.117010596765198, 0.596319018404908, 0.680981595092024, 0.765755716675962, 0.81840490797546, 0.857557166759621, 0.896151701059676, 0.925153374233129, 0.955493586168433, 0.971556051310653, 1.0, 1.0228667038483, 1.02163970998327, 1.04138315672058, 1.05142219743447, 1.05543781372002, 1.0532069157836, 1.0499721137758, 1.01940881204685, 0.815393195761294, 0.144562186279978] + }, + "120": { + "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "weight": [0.119681149657573, 0.617716402829235, 0.691366341080049, 0.77500842034355, 0.82519366790165, 0.867070843157067, 0.904120354777141, 0.934770405299203, 0.960368249691254, 0.975861681823285, 1.0, 1.02234197821938, 1.04064219153475, 1.05029751880543, 1.05883013360278, 1.06264735601213, 1.05838104861345, 1.0511956887841, 1.02627147187605, 0.771977096665544, 0.145728079038958] + } +} \ No newline at end of file diff --git a/opengate/contrib/carm/gbr_model.pkl b/opengate/contrib/carm/gbr_model.pkl new file mode 100644 index 0000000000000000000000000000000000000000..d83f0a25edaaa02c95052e2a8de7cfa57d93e5be GIT binary patch literal 195757 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 pgo0%{*?rpouT!C)7@BPu6BM4Hh>Yf76oHj;jCw literal 0 HcmV?d00001 diff --git a/opengate/contrib/carm/gbr_scaler.pkl b/opengate/contrib/carm/gbr_scaler.pkl new file mode 100644 index 0000000000000000000000000000000000000000..3f58e4edbcfcb28fb6be68d50e4421f455c20467 GIT binary patch literal 1063 zcma)5&1(}u6i?EmO}98=J$1TDV7 zqW*@uCE|?tr)r@TNTr(0!LQ`HD`&ux4lXTtj-eX zIEQJXw4$g6q?EIWe~YsYFCP&ra$ymwK?m_%cvbi|DT%8rI4S&+TNVGc9xW-NLemqx zwz19&Je_M}!DXJ$=WqNH=6`Y-mn%$yhG8!O(}WJMu~aidp9ergFIy(ET%c54M0u{a zqO62eKSWk-f@HH|xVj%K0fJQ9qAsbZu7m^4D5;gQgoC-jDh{bYwM$5)60$r;!fi!Q z4h4sc?P4{ct6O6@vWD9WxMLkh3%E0#3yLbS)B^PDlWf3h=uec8eKW2Q9x)k z8QpHu2KbuLl104f16=EBj-(dX5?Y@(3fh1+s3kqn`9q-EnWGKyAhnYl+OVf*%o~RT zJ006O72EmN*s^~-wySrt!}jK_?-w66u5EsJyDNQe)JI#1u<#-z|48Bd0YUcxxNx4r z<-MD)rn4jU(F^YuR Date: Fri, 25 Apr 2025 11:16:31 +0000 Subject: [PATCH 2/2] [pre-commit.ci] Automatic python and c++ formatting --- .../contrib/carm/anode_heel_effect_model.py | 20 +- .../contrib/carm/experimental_values.json | 416 ++++++++++++++++-- .../tests/src/test075_siemens_cios_alpha.py | 62 +-- 3 files changed, 430 insertions(+), 68 deletions(-) diff --git a/opengate/contrib/carm/anode_heel_effect_model.py b/opengate/contrib/carm/anode_heel_effect_model.py index 5ea9b9c3f..a07fe5121 100644 --- a/opengate/contrib/carm/anode_heel_effect_model.py +++ b/opengate/contrib/carm/anode_heel_effect_model.py @@ -4,6 +4,7 @@ import joblib from scipy.interpolate import interp1d + # Function to generate phi_weights and phi_angles based on kvp (energy) def get_phi_distribution(kvp): # Load the scaler and model @@ -14,14 +15,15 @@ def get_phi_distribution(kvp): distances = np.arange(-9, 10, 1) phi_angles = np.arctan(distances / 70) - # Create a DataFrame for prediction - input_data = pd.DataFrame({ - 'Distance': distances, - 'Energy': kvp, - 'Theta': phi_angles, - 'ThetaDegrees': np.degrees(phi_angles) - }) + input_data = pd.DataFrame( + { + "Distance": distances, + "Energy": kvp, + "Theta": phi_angles, + "ThetaDegrees": np.degrees(phi_angles), + } + ) # Scale the input data input_data_scaled = scaler.transform(input_data) @@ -34,7 +36,7 @@ def get_phi_distribution(kvp): fine_phi_angles = np.arctan(fine_distances / 70) # Interpolate the predicted weights using linear interpolation - interp_function = interp1d(distances, phi_weights, kind='linear') + interp_function = interp1d(distances, phi_weights, kind="linear") # Interpolate predictions for the finer distances fine_phi_weights = interp_function(fine_distances) @@ -44,4 +46,4 @@ def get_phi_distribution(kvp): for i in range(len(fine_phi_angles)): fine_phi_angles[i] = fine_phi_angles[i] + 180 * np.pi / 180 - return fine_phi_weights, fine_phi_angles \ No newline at end of file + return fine_phi_weights, fine_phi_angles diff --git a/opengate/contrib/carm/experimental_values.json b/opengate/contrib/carm/experimental_values.json index a9adb8183..95baacf50 100644 --- a/opengate/contrib/carm/experimental_values.json +++ b/opengate/contrib/carm/experimental_values.json @@ -1,34 +1,386 @@ { - "50": { - "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "weight": [0.0374836173001311, 0.64720600500417, 0.721077088049565, 0.782199451924223, 0.839985702371023, 0.866198022161325, 0.903371857500298, 0.942213749553199, 0.890980579053974, 0.994042654593113, 1.0, 1.02823781722864, 1.0296675801263, 1.02311450017872, 1.04646729417372, 1.03991421422614, 1.03812701060408, 1.04253544620517, 1.08804956511379, 1.07887525318718, 0.0378887167877994] - }, - "60": { - "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "weight": [0.0374768661320173, 0.670573719925972, 0.751079580505861, 0.795496607032696, 0.862122146822949, 0.906539173349784, 0.912091301665638, 0.942319555829735, 0.969463294262801, 0.959901295496607, 1.0, 0.970080197409007, 1.0308451573103, 1.0410240592227, 1.0407156076496, 1.04380012338063, 1.03917334978408, 1.0613818630475, 1.01357186921653, 0.898519432449105, 0.0378470080197409] - }, - "70": { - "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "weight": [0.0465753424657534, 0.629144331943617, 0.756204089735954, 0.79630732578916, 0.840182648401826, 0.881080007941235, 0.912249354774668, 0.937661306333135, 0.965455628350208, 0.984117530275958, 1.0, 1.01290450665078, 1.03434584077824, 1.03911058169545, 1.04625769307127, 1.04744887830058, 1.03911058169545, 1.01111772880683, 1.01608100059559, 0.808616239825293, 0.0480643240023824] - }, - "80": { - "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "weight": [0.0441979872663791, 0.647360854384884, 0.75374820291641, 0.786609159991785, 0.83651673855001, 0.873279934278086, 0.90798932018895, 0.945163277880468, 0.957896898747176, 0.951735469295543, 1.0, 1.0145820497022, 1.03388786198398, 1.04066543438078, 1.03470938591087, 1.04805914972274, 1.04210310125282, 1.02752105155063, 1.01109057301294, 1.0262887656603, 0.046991168617786] - }, - "90": { - "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "weight": [0.060656574247321, 0.635652321823439, 0.747576118387481, 0.795713556727335, 0.84504167375404, 0.887906106480694, 0.920734818846743, 0.946419459091682, 0.967171287633951, 0.969892838918183, 1.0, 1.00408232692635, 1.04643646878721, 1.05290015308726, 1.06072461302943, 1.0580030617452, 1.05409083177411, 1.05443102568464, 0.986052049668311, 1.09627487667971, 0.0656574247320973] - }, - "100": { - "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "weight": [0.0898376184032476, 0.644925575101489, 0.719891745602165, 0.790527740189445, 0.843031123139378, 0.887821380243572, 0.922733423545332, 0.951556156968877, 0.979296346414073, 0.990933694181326, 1.0, 1.04208389715832, 1.0553450608931, 1.06887686062246, 1.07510148849797, 1.07861975642761, 1.07307171853857, 1.06657645466847, 1.05439783491204, 0.985926928281461, 0.102692828146143] - }, - "110": { - "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "weight": [0.117010596765198, 0.596319018404908, 0.680981595092024, 0.765755716675962, 0.81840490797546, 0.857557166759621, 0.896151701059676, 0.925153374233129, 0.955493586168433, 0.971556051310653, 1.0, 1.0228667038483, 1.02163970998327, 1.04138315672058, 1.05142219743447, 1.05543781372002, 1.0532069157836, 1.0499721137758, 1.01940881204685, 0.815393195761294, 0.144562186279978] - }, - "120": { - "distance": [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "weight": [0.119681149657573, 0.617716402829235, 0.691366341080049, 0.77500842034355, 0.82519366790165, 0.867070843157067, 0.904120354777141, 0.934770405299203, 0.960368249691254, 0.975861681823285, 1.0, 1.02234197821938, 1.04064219153475, 1.05029751880543, 1.05883013360278, 1.06264735601213, 1.05838104861345, 1.0511956887841, 1.02627147187605, 0.771977096665544, 0.145728079038958] - } + "50": { + "distance": [ + -10, + -9, + -8, + -7, + -6, + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "weight": [ + 0.0374836173001311, + 0.64720600500417, + 0.721077088049565, + 0.782199451924223, + 0.839985702371023, + 0.866198022161325, + 0.903371857500298, + 0.942213749553199, + 0.890980579053974, + 0.994042654593113, + 1.0, + 1.02823781722864, + 1.0296675801263, + 1.02311450017872, + 1.04646729417372, + 1.03991421422614, + 1.03812701060408, + 1.04253544620517, + 1.08804956511379, + 1.07887525318718, + 0.0378887167877994 + ] + }, + "60": { + "distance": [ + -10, + -9, + -8, + -7, + -6, + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "weight": [ + 0.0374768661320173, + 0.670573719925972, + 0.751079580505861, + 0.795496607032696, + 0.862122146822949, + 0.906539173349784, + 0.912091301665638, + 0.942319555829735, + 0.969463294262801, + 0.959901295496607, + 1.0, + 0.970080197409007, + 1.0308451573103, + 1.0410240592227, + 1.0407156076496, + 1.04380012338063, + 1.03917334978408, + 1.0613818630475, + 1.01357186921653, + 0.898519432449105, + 0.0378470080197409 + ] + }, + "70": { + "distance": [ + -10, + -9, + -8, + -7, + -6, + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "weight": [ + 0.0465753424657534, + 0.629144331943617, + 0.756204089735954, + 0.79630732578916, + 0.840182648401826, + 0.881080007941235, + 0.912249354774668, + 0.937661306333135, + 0.965455628350208, + 0.984117530275958, + 1.0, + 1.01290450665078, + 1.03434584077824, + 1.03911058169545, + 1.04625769307127, + 1.04744887830058, + 1.03911058169545, + 1.01111772880683, + 1.01608100059559, + 0.808616239825293, + 0.0480643240023824 + ] + }, + "80": { + "distance": [ + -10, + -9, + -8, + -7, + -6, + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "weight": [ + 0.0441979872663791, + 0.647360854384884, + 0.75374820291641, + 0.786609159991785, + 0.83651673855001, + 0.873279934278086, + 0.90798932018895, + 0.945163277880468, + 0.957896898747176, + 0.951735469295543, + 1.0, + 1.0145820497022, + 1.03388786198398, + 1.04066543438078, + 1.03470938591087, + 1.04805914972274, + 1.04210310125282, + 1.02752105155063, + 1.01109057301294, + 1.0262887656603, + 0.046991168617786 + ] + }, + "90": { + "distance": [ + -10, + -9, + -8, + -7, + -6, + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "weight": [ + 0.060656574247321, + 0.635652321823439, + 0.747576118387481, + 0.795713556727335, + 0.84504167375404, + 0.887906106480694, + 0.920734818846743, + 0.946419459091682, + 0.967171287633951, + 0.969892838918183, + 1.0, + 1.00408232692635, + 1.04643646878721, + 1.05290015308726, + 1.06072461302943, + 1.0580030617452, + 1.05409083177411, + 1.05443102568464, + 0.986052049668311, + 1.09627487667971, + 0.0656574247320973 + ] + }, + "100": { + "distance": [ + -10, + -9, + -8, + -7, + -6, + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "weight": [ + 0.0898376184032476, + 0.644925575101489, + 0.719891745602165, + 0.790527740189445, + 0.843031123139378, + 0.887821380243572, + 0.922733423545332, + 0.951556156968877, + 0.979296346414073, + 0.990933694181326, + 1.0, + 1.04208389715832, + 1.0553450608931, + 1.06887686062246, + 1.07510148849797, + 1.07861975642761, + 1.07307171853857, + 1.06657645466847, + 1.05439783491204, + 0.985926928281461, + 0.102692828146143 + ] + }, + "110": { + "distance": [ + -10, + -9, + -8, + -7, + -6, + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "weight": [ + 0.117010596765198, + 0.596319018404908, + 0.680981595092024, + 0.765755716675962, + 0.81840490797546, + 0.857557166759621, + 0.896151701059676, + 0.925153374233129, + 0.955493586168433, + 0.971556051310653, + 1.0, + 1.0228667038483, + 1.02163970998327, + 1.04138315672058, + 1.05142219743447, + 1.05543781372002, + 1.0532069157836, + 1.0499721137758, + 1.01940881204685, + 0.815393195761294, + 0.144562186279978 + ] + }, + "120": { + "distance": [ + -10, + -9, + -8, + -7, + -6, + -5, + -4, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + "weight": [ + 0.119681149657573, + 0.617716402829235, + 0.691366341080049, + 0.77500842034355, + 0.82519366790165, + 0.867070843157067, + 0.904120354777141, + 0.934770405299203, + 0.960368249691254, + 0.975861681823285, + 1.0, + 1.02234197821938, + 1.04064219153475, + 1.05029751880543, + 1.05883013360278, + 1.06264735601213, + 1.05838104861345, + 1.0511956887841, + 1.02627147187605, + 0.771977096665544, + 0.145728079038958 + ] + } } \ No newline at end of file diff --git a/opengate/tests/src/test075_siemens_cios_alpha.py b/opengate/tests/src/test075_siemens_cios_alpha.py index eaa4d1820..93caadb1d 100755 --- a/opengate/tests/src/test075_siemens_cios_alpha.py +++ b/opengate/tests/src/test075_siemens_cios_alpha.py @@ -14,7 +14,9 @@ if __name__ == "__main__": # paths - paths = utl.get_default_test_paths(__file__, "gate_test075_siemens_cios_alpha", "test075") + paths = utl.get_default_test_paths( + __file__, "gate_test075_siemens_cios_alpha", "test075" + ) # create the simulation sim = gate.Simulation() @@ -78,7 +80,7 @@ def get_normalized_profile(img, axis="z", nb_points=200): """ Get evenly spaced values from the profile and normalize them by the middle value. - + Parameters: ----------- img : itk.Image @@ -87,7 +89,7 @@ def get_normalized_profile(img, axis="z", nb_points=200): The axis along which to get the profile ('x', 'y', or 'z') nb_points : int Number of points to sample (default=200) - + Returns: -------- tuple: (positions, normalized_values) @@ -95,7 +97,7 @@ def get_normalized_profile(img, axis="z", nb_points=200): """ # Get data in numpy array data = itk.GetArrayViewFromImage(img) - + if axis == "z": y = np.nansum(data, 2) y = np.nansum(y, 1) @@ -104,41 +106,44 @@ def get_normalized_profile(img, axis="z", nb_points=200): y = np.nansum(data, 2) y = np.nansum(y, 0) x = np.arange(len(y)) * img.GetSpacing()[1] - else: # axis == "x" + else: # axis == "x" y = np.nansum(data, 1) y = np.nansum(y, 0) x = np.arange(len(y)) * img.GetSpacing()[0] - + # Get middle value for normalization mid_idx = len(x) // 2 mid_val = y[mid_idx] - + # Interpolate to get evenly spaced points from scipy.interpolate import interp1d - f = interp1d(x, y, kind='linear') - + + f = interp1d(x, y, kind="linear") + # Create new x points evenly spaced x_new = np.linspace(x[0], x[-1], nb_points) y_new = f(x_new) - + # Normalize by middle value y_normalized = y_new / mid_val - + return x_new, y_normalized # Load experimental and simulation data # Simulation data img_mhd_out = itk.imread(paths.gate_output / detector_actor.output_filename) positions, weights = get_normalized_profile(img_mhd_out, axis="z", nb_points=200) - positions = [pos -100 for pos in positions] + positions = [pos - 100 for pos in positions] # Experimental data current_dir = pathlib.Path(__file__).parent - exp_file_path = current_dir.parent.parent / "contrib" / "carm" / "experimental_values.json" - with open(exp_file_path, 'r') as f: + exp_file_path = ( + current_dir.parent.parent / "contrib" / "carm" / "experimental_values.json" + ) + with open(exp_file_path, "r") as f: exp_data = json.load(f) - exp_positions = [pos*10.0 for pos in exp_data[str(kvp)]['distance']] - exp_weights = list(reversed(exp_data[str(kvp)]['weight'])) + exp_positions = [pos * 10.0 for pos in exp_data[str(kvp)]["distance"]] + exp_weights = list(reversed(exp_data[str(kvp)]["weight"])) # Calculate differences differences = [] @@ -146,22 +151,25 @@ def get_normalized_profile(img, axis="z", nb_points=200): print(f"\nAnalysis for {kvp} kV:") print("Position (mm) | Simulation | Experimental | Difference (%)") print("-" * 75) - + # Interpolate simulation data to match experimental positions from scipy.interpolate import interp1d - f = interp1d(positions, weights, kind='linear') + + f = interp1d(positions, weights, kind="linear") sim_weights_interp = f(exp_positions) # excluding first/last 2 values exp_positions_trimmed = exp_positions[2:-2] sim_weights_interp_trimmed = sim_weights_interp[2:-2] exp_weights_trimmed = exp_weights[2:-2] - - for pos, sim_w, exp_w in zip(exp_positions_trimmed, sim_weights_interp_trimmed, exp_weights_trimmed): + + for pos, sim_w, exp_w in zip( + exp_positions_trimmed, sim_weights_interp_trimmed, exp_weights_trimmed + ): diff_percent = ((sim_w - exp_w) / exp_w) * 100 differences.append(diff_percent) print(f"{pos:13.1f} | {sim_w:10.4f} | {exp_w:12.4f} | {diff_percent:11.2f}%") - + # results max_difference = max(abs(d) for d in differences) avg_abs_difference = sum(abs(d) for d in differences) / len(differences) @@ -170,11 +178,11 @@ def get_normalized_profile(img, axis="z", nb_points=200): # Create plot with updated title fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(25, 10)) - ax.plot(positions, weights, 'b-', label='Simulation') - ax.plot(exp_positions, exp_weights, 'ro', label=f'Experimental ({kvp} kV)') - ax.set_xlabel('Position (mm)') - ax.set_ylabel('Weight (normalized to middle value)') - ax.set_title(f'Anode Heel Effect Profile Comparison - Siemens Cios Alpha {kvp} kV') + ax.plot(positions, weights, "b-", label="Simulation") + ax.plot(exp_positions, exp_weights, "ro", label=f"Experimental ({kvp} kV)") + ax.set_xlabel("Position (mm)") + ax.set_ylabel("Weight (normalized to middle value)") + ax.set_title(f"Anode Heel Effect Profile Comparison - Siemens Cios Alpha {kvp} kV") ax.grid(True) ax.legend() @@ -183,4 +191,4 @@ def get_normalized_profile(img, axis="z", nb_points=200): plt.show() is_ok = max_difference < 5.0 and avg_abs_difference < 2.0 - utl.test_ok(is_ok) \ No newline at end of file + utl.test_ok(is_ok)