Files
TRIMSP/TrimSPlib.js

1592 lines
43 KiB
JavaScript

// This is an object that contains all GUI ids and values
var All = new Object();
// This is an object that contains all elements and their parameters
// To replace all other functions
const elemPars = {
muon : {
Z : 1 ,
A : 0.1134289259 ,
rho : 0 ,
Elast : 0 ,
ICRU : [] ,
IAEA : []
},
"Li-8" : {
Z : 3 ,
A : 8.02248624 ,
rho : 0 ,
Elast : 0 ,
ICRU : [] ,
IAEA : []
},
"B-12" : {
Z : 5 ,
A : 12.0143526 ,
rho : 0 ,
Elast : 0 ,
ICRU : [] ,
IAEA : []
},
"Mg-31" : {
Z : 12 ,
A : 30.996648 ,
rho : 0 ,
Elast : 0 ,
ICRU : [] ,
IAEA : []
},
H : {
Z : 1 ,
A : 1.008 ,
rho : 0.08 ,
Elast : 0.1 ,
ICRU : [1.25400,1.44000,242.60001,12000.00000,0.11590],
IAEA : [1.21941306,1.39705253,316.72610292,3622.08960714,0.03609996]
},
He : {
Z : 2 ,
A : 4.003 ,
rho : 0.12 ,
Elast : 0.1 ,
ICRU : [1.22900,1.39700,484.50000,5873.00000,0.05225] ,
IAEA : []
},
Li : {
Z : 3 ,
A : 6.939 ,
rho : 0.53 ,
Elast : 1.63 ,
ICRU : [1.41100,1.60000,725.59998,3013.00000,0.04578] ,
IAEA : [2.55867734,2.98398784,672.22623329,223.63937274,0.05756479]
},
Be : {
Z : 4 ,
A : 9.012 ,
rho : 1.85 ,
Elast : 3.32 ,
ICRU : [2.24800,2.59000,966.00000,153.80000,0.03475] ,
IAEA : [2.13846776,2.43024550,1353.80005691,500.78353377,0.01143076]
},
B : {
Z : 5 ,
A : 10.811 ,
rho : 2.34 ,
Elast : 5.77 ,
ICRU : [2.47400,2.81500,1206.00000,1060.00000,0.02855] ,
IAEA : [2.92598306,3.33271910,1523.83401267,574.31712932,0.01671298]
},
C : {
Z : 6 ,
A : 12.011 ,
rho : 2.26 ,
Elast : 7.37 ,
ICRU : [2.60100,2.60100,1701.00000,1279.00000,0.01638] ,
IAEA : [2.51057212,2.84874359,1325.63086028,2111.57332043,0.03815981]
},
N : {
Z : 7 ,
A : 14.007 ,
rho : 1.03 ,
Elast : 4.92 ,
ICRU : [2.95400,3.35000,1683.00000,1900.00000,0.02513] ,
IAEA : [3.03231463,3.44621744,1287.27189959,3445.25706665,0.06909550]
},
O : {
Z : 8 ,
A : 15.999 ,
rho : 2 ,
Elast : 2.6 ,
ICRU : [2.65200,3.00000,1920.00000,2000.00000,0.02230] ,
IAEA : [2.58218404,2.91913321,2066.69556610,1937.28839450,0.01708201]
},
F : {
Z : 9 ,
A : 18.998 ,
rho : 1.11 ,
Elast : 0.84 ,
ICRU : [2.08500,2.35200,2157.00000,2634.00000,0.01816] ,
IAEA : []
},
Ne : {
Z : 10 ,
A : 20.183 ,
rho : 1.5 ,
Elast : 0.02 ,
ICRU : [1.95100,2.19900,2393.00000,2699.00000,0.01568] ,
IAEA : []
},
Na : {
Z : 11 ,
A : 22.99 ,
rho : 0.97 ,
Elast : 1.11 ,
ICRU : [2.54200,2.86900,2628.00000,1854.00000,0.01472] ,
IAEA : []
},
Mg : {
Z : 12 ,
A : 24.312 ,
rho : 1.74 ,
Elast : 1.51 ,
ICRU : [3.79100,4.29300,2862.00000,1009.00000,0.01397] ,
IAEA : [4.32219620,4.95332934,2711.05757349,99.32422512,0.01692829]
},
Al : {
Z : 13 ,
A : 26.982 ,
rho : 2.7 ,
Elast : 3.39 ,
ICRU : [4.15400,4.73900,2766.00000,164.50000,0.02023] ,
IAEA : [4.16266645,4.73942640,3007.21967155,192.15430476,0.01478852]
},
Si : {
Z : 14 ,
A : 28.086 ,
rho : 2.33 ,
Elast : 4.63 ,
ICRU : [4.91400,5.59800,3193.00000,232.70000,0.01419] ,
IAEA : [4.56277193,5.17964542,3812.93366288,249.45105835,0.00951865]
},
P : {
Z : 15 ,
A : 30.974 ,
rho : 1 ,
Elast : 3.43 ,
ICRU : [3.23200,3.64700,3561.00000,1560.00000,0.01267] ,
IAEA : []
},
S : {
Z : 16 ,
A : 32.064 ,
rho : 2.07 ,
Elast : 2.85 ,
ICRU : [3.44700,3.89100,3792.00000,1219.00000,0.01211] ,
IAEA : []
},
Cl : {
Z : 17 ,
A : 35.453 ,
rho : 2.03 ,
Elast : 1.4 ,
ICRU : [5.30100,6.00800,3969.00000,645.09998,0.01183] ,
IAEA : [5.18954121,5.87010049,5726.20198003,338.90592713,0.00527894]
},
Ar : {
Z : 18 ,
A : 39.948 ,
rho : 1.77 ,
Elast : 0.08 ,
ICRU : [5.73100,6.50000,4253.00000,530.00000,0.01123] ,
IAEA : []
},
K : {
Z : 19 ,
A : 39.102 ,
rho : 0.86 ,
Elast : 0.93 ,
ICRU : [5.15200,5.83300,4482.00000,545.70001,0.01129] ,
IAEA : []
},
Ca : {
Z : 20 ,
A : 40.08 ,
rho : 1.55 ,
Elast : 1.84 ,
ICRU : [5.52100,6.25200,4710.00000,553.29999,0.01120] ,
IAEA : [7.38419020,8.41800474,4257.94547049,311.84732092,0.01482602]
},
Sc : {
Z : 21 ,
A : 44.956 ,
rho : 2.99 ,
Elast : 3.9 ,
ICRU : [5.20100,5.88400,4938.00000,560.90002,0.01000] ,
IAEA : [6.27366940,7.11486087,5202.32117316,349.64931132,0.00808596]
},
Ti : {
Z : 22 ,
A : 47.9 ,
rho : 4.54 ,
Elast : 4.85 ,
ICRU : [4.85800,5.48900,5260.00000,651.09998,0.00893] ,
IAEA : [4.89215322,5.52996090,4733.05002706,821.54929980,0.01141794]
},
V : {
Z : 23 ,
A : 50.942 ,
rho : 6.11 ,
Elast : 5.31 ,
ICRU : [4.47900,5.05500,5391.00000,952.29999,0.00912] ,
IAEA : [4.39418898,4.95984106,5216.28902299,873.00768319,0.00982301]
},
Cr : {
Z : 24 ,
A : 51.996 ,
rho : 7.19 ,
Elast : 4.1 ,
ICRU : [3.98300,4.48900,5616.00000,1336.00000,0.00841] ,
IAEA : [4.22355616,4.76724205,4805.40719904,1062.25237873,0.01508696]
},
Mn : {
Z : 25 ,
A : 54.938 ,
rho : 7.43 ,
Elast : 2.92 ,
ICRU : [3.46900,3.90700,5725.00000,1461.00000,0.00883] ,
IAEA : [3.45870888,3.89580224,5452.18588822,1778.16054656,0.01057380]
},
Fe : {
Z : 26 ,
A : 55.847 ,
rho : 7.87 ,
Elast : 4.28 ,
ICRU : [3.51900,3.96300,6065.00000,1243.00000,0.00778] ,
IAEA : [3.69846643,4.16916938,5392.90710239,1040.38447053,0.01152298]
},
Co : {
Z : 27 ,
A : 58.933 ,
rho : 8.9 ,
Elast : 4.39 ,
ICRU : [3.14000,3.53500,6288.00000,1372.00000,0.00736] ,
IAEA : [3.55890909,4.00775461,6796.04145497,933.86447935,0.00558368]
},
Ni : {
Z : 28 ,
A : 58.71 ,
rho : 8.9 ,
Elast : 4.44 ,
ICRU : [3.55300,4.00400,6205.00000,555.09998,0.00876] ,
IAEA : [3.42262695,3.86234880,4759.65515188,520.18934465,0.02026669]
},
Cu : {
Z : 29 ,
A : 63.54 ,
rho : 8.96 ,
Elast : 3.49 ,
ICRU : [3.69600,4.19400,4649.00000,81.13000,0.02242] ,
IAEA : [3.54912421,4.02142201,4344.22605325,128.32905834,0.02886218]
},
Zn : {
Z : 30 ,
A : 65.37 ,
rho : 7.13 ,
Elast : 1.35 ,
ICRU : [4.21000,4.75000,6953.00000,295.20001,0.00681] ,
IAEA : [4.31895518,4.91763977,5346.03925560,46.16548699,0.01518164]
},
Ga : {
Z : 31 ,
A : 69.72 ,
rho : 5.91 ,
Elast : 2.81 ,
ICRU : [5.04100,5.69700,7137.00000,202.60001,0.00673] ,
IAEA : [4.11015447,4.63998531,7681.41419449,149.38563152,0.00628772]
},
Ge : {
Z : 32 ,
A : 72.59 ,
rho : 5.32 ,
Elast : 3.85 ,
ICRU : [5.55400,6.30000,6496.00000,110.00000,0.00969] ,
IAEA : [5.80984815,6.60667983,6039.04808738,87.19744473,0.01158192]
},
As : {
Z : 33 ,
A : 74.922 ,
rho : 5.72 ,
Elast : 2.96 ,
ICRU : [5.32300,6.01200,7611.00000,292.50000,0.00645] ,
IAEA : []
},
Se : {
Z : 34 ,
A : 78.96 ,
rho : 4.79 ,
Elast : 2.25 ,
ICRU : [5.87400,6.65600,7395.00000,117.50000,0.00768] ,
IAEA : [5.58734301,6.31119973,8423.01872583,221.61559131,0.00530434]
},
Br : {
Z : 35 ,
A : 79.909 ,
rho : 3.14 ,
Elast : 1.22 ,
ICRU : [6.65800,7.53600,7694.00000,222.30000,0.00651] ,
IAEA : [6.28480648,7.09489448,11732.76411988,150.96205589,0.00281298]
},
Kr : {
Z : 36 ,
A : 83.8 ,
rho : 3.1 ,
Elast : 0.12 ,
ICRU : [6.41300,7.24000,11850.00000,153.70000,0.00288] ,
IAEA : [6.47378266,7.31581518,9199.06183849,216.98680923,0.00437111]
},
Rb : {
Z : 37 ,
A : 85.47 ,
rho : 1.53 ,
Elast : 0.85 ,
ICRU : [5.69400,6.42900,8478.00000,292.89999,0.00609] ,
IAEA : [8.48759187,9.62951209,7271.11124671,272.67996745,0.00818815]
},
Sr : {
Z : 38 ,
A : 87.62 ,
rho : 2.54 ,
Elast : 1.72 ,
ICRU : [6.33900,7.15900,8693.00000,330.29999,0.00600] ,
IAEA : [8.66447838,9.84912713,5979.31960977,334.15705556,0.01184544]
},
Y : {
Z : 39 ,
A : 88.905 ,
rho : 4.47 ,
Elast : 4.37 ,
ICRU : [6.40700,7.23400,8907.00000,367.79999,0.00589] ,
IAEA : [7.54854264,8.54789357,6885.34110669,429.53252110,0.00930644]
},
Zr : {
Z : 40 ,
A : 91.22 ,
rho : 6.51 ,
Elast : 6.25 ,
ICRU : [6.73400,7.60300,9120.00000,405.20001,0.00576] ,
IAEA : [6.24168401,7.04236496,10674.06252597,269.66181445,0.00339805]
},
Nb : {
Z : 41 ,
A : 92.906 ,
rho : 8.57 ,
Elast : 7.57 ,
ICRU : [6.90100,7.79100,9333.00000,442.70001,0.00559] ,
IAEA : [5.96194954,6.72632300,10250.57513827,275.25886405,0.00386599]
},
Mo : {
Z : 42 ,
A : 95.94 ,
rho : 10.22 ,
Elast : 6.82 ,
ICRU : [6.42400,7.24800,9545.00000,480.20001,0.00538] ,
IAEA : [5.58867862,6.29983727,9573.16605660,523.57577519,0.00473082]
},
Tc : {
Z : 43 ,
A : 98 ,
rho : 11.5 ,
Elast : 6.85 ,
ICRU : [6.79900,7.67100,9756.00000,517.59998,0.00532] ,
IAEA : []
},
Ru : {
Z : 44 ,
A : 101.07 ,
rho : 12.37 ,
Elast : 6.74 ,
ICRU : [6.10900,6.88700,9966.00000,555.09998,0.00515] ,
IAEA : []
},
Rh : {
Z : 45 ,
A : 102.905 ,
rho : 12.41 ,
Elast : 5.75 ,
ICRU : [5.92400,6.67700,10180.00000,592.50000,0.00492] ,
IAEA : []
},
Pd : {
Z : 46 ,
A : 106.4 ,
rho : 12.02 ,
Elast : 3.89 ,
ICRU : [5.23800,5.90000,10380.00000,630.00000,0.00476] ,
IAEA : [4.74762031,5.34871025,8086.17802763,942.05721488,0.00842671]
},
Ag : {
Z : 47 ,
A : 107.87 ,
rho : 10.5 ,
Elast : 2.95 ,
ICRU : [5.34500,6.03800,6790.00000,397.79999,0.01676] ,
IAEA : [5.42052240,6.17824432,4642.18214950,90.75350922,0.06061521]
},
Cd : {
Z : 48 ,
A : 112.4 ,
rho : 8.65 ,
Elast : 1.16 ,
ICRU : [5.81400,6.55400,10800.00000,355.50000,0.00463] ,
IAEA : [4.89128643,5.50754704,11831.77188508,396.06905848,0.00412049]
},
In : {
Z : 49 ,
A : 114.82 ,
rho : 7.31 ,
Elast : 2.52 ,
ICRU : [6.22900,7.02400,11010.00000,370.89999,0.00454] ,
IAEA : [5.98978289,6.77050040,6343.54720062,564.65410792,0.02270520]
},
Sn : {
Z : 50 ,
A : 118.69 ,
rho : 7.31 ,
Elast : 3.14 ,
ICRU : [6.40900,7.22700,11210.00000,386.39999,0.00447] ,
IAEA : [6.73191335,7.61854414,6946.18830598,347.19391310,0.01677246]
},
Sb : {
Z : 51 ,
A : 121.75 ,
rho : 6.68 ,
Elast : 2.75 ,
ICRU : [7.50000,8.48000,8608.00000,348.00000,0.00907] ,
IAEA : [7.92400389,8.99628409,5736.29881090,403.11722206,0.02973016]
},
Te : {
Z : 52 ,
A : 127.6 ,
rho : 6.24 ,
Elast : 2.23 ,
ICRU : [6.97900,7.87100,11620.00000,392.39999,0.00440] ,
IAEA : []
},
I : {
Z : 53 ,
A : 126.904 ,
rho : 4.93 ,
Elast : 1.11 ,
ICRU : [7.72500,8.71600,11830.00000,394.79999,0.00438] ,
IAEA : []
},
Xe : {
Z : 54 ,
A : 131.3 ,
rho : 3.8 ,
Elast : 0.16 ,
ICRU : [8.33700,9.42500,10510.00000,269.60001,0.00621] ,
IAEA : [8.96826400,10.16224223,8543.27304860,283.90067433,0.01019984]
},
Cs : {
Z : 55 ,
A : 132.905 ,
rho : 1.9 ,
Elast : 0.8 ,
ICRU : [7.28700,8.21800,12230.00000,399.70001,0.00445] ,
IAEA : []
},
Ba : {
Z : 56 ,
A : 137.34 ,
rho : 3.59 ,
Elast : 1.9 ,
ICRU : [7.89900,8.91100,12430.00000,402.10001,0.00451] ,
IAEA : []
},
La : {
Z : 57 ,
A : 138.91 ,
rho : 6.15 ,
Elast : 4.47 ,
ICRU : [8.04100,9.07100,12630.00000,404.50000,0.00454] ,
IAEA : [8.16949326,9.21144395,13933.96869212,429.99442382,0.00347440]
},
Ce : {
Z : 58 ,
A : 140.12 ,
rho : 6.77 ,
Elast : 4.32 ,
ICRU : [7.48800,8.44400,12830.00000,406.89999,0.00442] ,
IAEA : []
},
Pr : {
Z : 59 ,
A : 140.907 ,
rho : 6.77 ,
Elast : 3.7 ,
ICRU : [7.29100,8.21900,13030.00000,409.29999,0.00430] ,
IAEA : []
},
Nd : {
Z : 60 ,
A : 144.24001 ,
rho : 7.01 ,
Elast : 3.4 ,
ICRU : [7.09800,8.00000,13230.00000,411.79999,0.00418] ,
IAEA : [8.60801371,10.26060598,6798.65217629,7.06731816,0.02713704]
},
Pm : {
Z : 61 ,
A : 147 ,
rho : 7.22 ,
Elast : 0.1 ,
ICRU : [6.90900,7.78600,13430.00000,414.20001,0.00406] ,
IAEA : []
},
Sm : {
Z : 62 ,
A : 150.35001 ,
rho : 7.52 ,
Elast : 2.14 ,
ICRU : [6.72800,7.58000,13620.00000,416.60001,0.00398] ,
IAEA : []
},
Eu : {
Z : 63 ,
A : 151.96001 ,
rho : 5.24 ,
Elast : 1.86 ,
ICRU : [6.55100,7.38000,13820.00000,419.00000,0.00388] ,
IAEA : []
},
Gd : {
Z : 64 ,
A : 157.25 ,
rho : 7.9 ,
Elast : 4.14 ,
ICRU : [6.73900,7.59200,14020.00000,421.39999,0.00386] ,
IAEA : [8.38379061,9.50012183,10804.38767518,110.71066098,0.00761735]
},
Tb : {
Z : 65 ,
A : 158.924 ,
rho : 8.23 ,
Elast : 4.05 ,
ICRU : [6.21200,6.99600,14210.00000,423.89999,0.00372] ,
IAEA : [8.69907359,10.36476708,5985.09307671,7.76175759,0.04237031]
},
Dy : {
Z : 66 ,
A : 162.5 ,
rho : 8.55 ,
Elast : 3.04 ,
ICRU : [5.51700,6.21000,14400.00000,426.29999,0.00363] ,
IAEA : [6.69350026,7.81543484,5289.65107666,12.11560717,0.05746489]
},
Ho : {
Z : 67 ,
A : 164.92999 ,
rho : 8.8 ,
Elast : 3.14 ,
ICRU : [5.22000,5.87400,14600.00000,428.70001,0.00350] ,
IAEA : []
},
Er : {
Z : 68 ,
A : 167.25999 ,
rho : 9.07 ,
Elast : 3.29 ,
ICRU : [5.07100,5.70600,14790.00000,433.00000,0.00341] ,
IAEA : [4.31497049,4.85346547,12995.54504003,691.00380321,0.00499022]
},
Tm : {
Z : 69 ,
A : 168.93401 ,
rho : 9.32 ,
Elast : 2.42 ,
ICRU : [4.92600,5.54200,14980.00000,433.50000,0.00334] ,
IAEA : []
},
Yb : {
Z : 70 ,
A : 173.03999 ,
rho : 6.9 ,
Elast : 1.6 ,
ICRU : [4.78800,5.38600,15170.00000,435.89999,0.00329] ,
IAEA : [6.38304258,7.21491284,12327.74719685,82.30064162,0.00516845]
},
Lu : {
Z : 71 ,
A : 174.97 ,
rho : 9.84 ,
Elast : 4.43 ,
ICRU : [4.89300,5.50500,15360.00000,438.29999,0.00324] ,
IAEA : [7.00205766,8.09268611,4589.67801229,31.06321362,0.11142124]
},
Hf : {
Z : 72 ,
A : 178.49001 ,
rho : 13.31 ,
Elast : 6.44 ,
ICRU : [5.02800,5.65700,15550.00000,440.79999,0.00320] ,
IAEA : [5.32763157,6.00140558,13853.49562768,206.93150053,0.00411522]
},
Ta : {
Z : 73 ,
A : 180.948 ,
rho : 16.65 ,
Elast : 8.1 ,
ICRU : [4.73800,5.32900,15740.00000,443.20001,0.00319] ,
IAEA : [5.15280708,5.80545310,12417.25115167,231.48549646,0.00530723]
},
W : {
Z : 74 ,
A : 183.85001 ,
rho : 19.35 ,
Elast : 8.9 ,
ICRU : [4.58700,5.16000,15410.00000,415.29999,0.00341] ,
IAEA : [4.81261962,5.41579909,15245.84079976,286.09077182,0.00344862]
},
Re : {
Z : 75 ,
A : 186.2 ,
rho : 21.04 ,
Elast : 8.03 ,
ICRU : [5.20100,5.85100,16120.00000,441.60001,0.00312] ,
IAEA : [4.26021967,4.80273372,3191.05524918,76051.48730893,0.00003161]
},
Os : {
Z : 76 ,
A : 190.2 ,
rho : 22.6 ,
Elast : 8.17 ,
ICRU : [5.07100,5.70400,16300.00000,440.89999,0.00308] ,
IAEA : []
},
Ir : {
Z : 77 ,
A : 192.2 ,
rho : 22.4 ,
Elast : 6.94 ,
ICRU : [4.94600,5.56300,16490.00000,440.10001,0.00296] ,
IAEA : [4.16543126,4.68849191,6887.94139926,4263.90641919,0.00000004]
},
Pt : {
Z : 78 ,
A : 195.09 ,
rho : 21.45 ,
Elast : 5.84 ,
ICRU : [4.47700,5.03400,16670.00000,439.29999,0.00287] ,
IAEA : [4.62228847,5.20033612,16308.49878855,266.02263275,0.00309560]
},
Au : {
Z : 79 ,
A : 196.967 ,
rho : 19.32 ,
Elast : 3.81 ,
ICRU : [4.84400,5.45800,7852.00000,975.79999,0.02077] ,
IAEA : [4.84253074,5.44769072,15602.21662947,412.25485588,0.00331383]
},
Hg : {
Z : 80 ,
A : 200.59 ,
rho : 13.55 ,
Elast : 0.67 ,
ICRU : [4.30700,4.84300,17040.00000,487.79999,0.00288] ,
IAEA : []
},
Tl : {
Z : 81 ,
A : 204.37 ,
rho : 11.85 ,
Elast : 1.88 ,
ICRU : [4.72300,5.31100,17220.00000,537.00000,0.00291] ,
IAEA : []
},
Pb : {
Z : 82 ,
A : 207.19 ,
rho : 11.35 ,
Elast : 2.03 ,
ICRU : [5.31900,5.98200,17400.00000,586.29999,0.00287] ,
IAEA : [9.42473604,17.46235676,11946.86905435,0.00000001,0.00652912]
},
Bi : {
Z : 83 ,
A : 208.98 ,
rho : 9.75 ,
Elast : 2.18 ,
ICRU : [5.95600,6.70000,17800.00000,677.00000,0.00266] ,
IAEA : [10.25823796,12.26670424,7765.05387481,7.37274504,0.02310050]
},
Po : {
Z : 84 ,
A : 210 ,
rho : 9.3 ,
Elast : 1.5 ,
ICRU : [6.15800,6.92800,17770.00000,586.29999,0.00281] ,
IAEA : []
},
At : {
Z : 85 ,
A : 210 ,
rho : 0 ,
Elast : 0.1 ,
ICRU : [6.20300,6.97900,17950.00000,586.29999,0.00278] ,
IAEA : []
},
Rn : {
Z : 86 ,
A : 222 ,
rho : 0 ,
Elast : 0.2 ,
ICRU : [6.18100,6.95400,18120.00000,586.29999,0.00275] ,
IAEA : []
},
Fr : {
Z : 87 ,
A : 223 ,
rho : 0 ,
Elast : 0.1 ,
ICRU : [6.94900,7.82000,18300.00000,586.29999,0.00274] ,
IAEA : []
},
Ra : {
Z : 88 ,
A : 226 ,
rho : 0 ,
Elast : 1.66 ,
ICRU : [7.50600,8.44800,18480.00000,586.29999,0.00273] ,
IAEA : []
},
Ac : {
Z : 89 ,
A : 227 ,
rho : 0 ,
Elast : 4.25 ,
ICRU : [7.64800,8.60900,18660.00000,586.29999,0.00270] ,
IAEA : []
},
Th : {
Z : 90 ,
A : 232.03799 ,
rho : 11.72 ,
Elast : 6.2 ,
ICRU : [7.71100,8.67900,18830.00000,586.29999,0.00264] ,
IAEA : []
},
Pa : {
Z : 91 ,
A : 231 ,
rho : 15.4 ,
Elast : 0.1 ,
ICRU : [7.40700,8.33600,19010.00000,586.29999,0.00260] ,
IAEA : []
},
U : {
Z : 92 ,
A : 238.03 ,
rho : 18.95 ,
Elast : 5.55 ,
ICRU : [7.29000,8.20400,19180.00000,586.29999,0.00267] ,
IAEA : []
},
"" : {
Z : 0 ,
A : 0.0 ,
rho : 0 ,
Elast : 0 ,
ICRU : [0,0,0,0,0] ,
IAEA : []
}
};
// Extra densities
var rhos = {
"NbN":8.47,
"Bi2Se3":7.51,
"La2CuO4": 7.08,
"La1.84Sr0.16CuO4": 6.94,
"N2":1.145,
"ZnO":5.61,
"ZnSe":5.26,
"ZnS":4.09,
"ZrO":6.0,
"Gd3Ga5O12":7.08,
"MgAl2O4":3.60,
"NdGaO3":7.57,
"YAlO3":4.88,
"Y3Al5O12":4.55,
"LiF":2.60,
"CaF2":3.18,
"BaFe":4.83,
"MgF2":3.18,
"SiO2":2.65,
"TiO2":4.26,
"KTaO3":6.967,
"LaAlO3":6.70,
"Al2O3":3.98,
"SrTiO3":5.12,
"SrLaGaO4":6.389,
"SrLaAlO4":5.924,
"NbSe2":6.30,
"MgO":3.58,
"YBa2Cu3O7":6.54,
"GaAs":5.32,
"C60":1.65
}
// This file contains function that are generic Javascript for TrimSP
function parse_formula (mf) {
// This function takes a chemical formula and returns
// an object that contains the atoms and their number
// replace all types of brackets into ()
var mf = mf.replace(/\[/g,"(").replace(/\]/g,")").replace(/\{/g,"(").replace(/\}/g,")").replace(/\s+/g,"");
if(/^\d+/.test(mf)) throw new SyntaxError("Molecular formula should not start with a number!");
var mol = {};
// go into brackets and collect info
while(mf.includes("(")){
var x = mf.lastIndexOf("(");
var y = mf.indexOf(")", mf.lastIndexOf("("));
var z = mf.substr(x+1, y-x-1);
var c = mf.substr(y+1);
c = /^\d+/.exec(c);
c=(c!= null)?Number(c[0]):1;
// recursive
var a = this.parse_formula(z);
var b = "";
for(var k in a){
b+=k+""+a[k]*c;
}
mf = mf.substr(0, x)+ b + mf.substr(y+1+((c>1)?(c+'').length:0));
}
var m = "";
// Separate element name from stoichiometry
// while(m = /([A-Z]{1}[a-z]{0,}[0-9]{0,})/.exec(mf)){
while(m = /([A-Z]{1}[a-z]{0,}[0-9]{0,}\.?[0-9]{0,})/.exec(mf)){
// Element
var m1 = /([A-Z]{1,}[a-z]{0,})/.exec(m[0]);
// Stoichiometry
//var m2 = /\d+/.exec(m[0]);
var m2 = /\d+\.?\d{0,}/.exec(m[0]);
if(typeof mol[m1[0]] == 'undefined') mol[m1[0]]=(m2!=null)?Number(m2[0]):1;
else mol[m1[0]] += (m2!=null)?Number(m2[0]):1;
mf = mf.replace(m[0], "");
}
return mol;
}
function StoppingCoefficients(Element,flag)
{
// flag = 1 prefer ICRU otherwise prefer IAEA
// Updated Anderson-Ziegler table values for hydrogen projectiles using
// up-to-date stopping data from the IAEA database (https://www-nds.iaea.org/stopping/).
// For further details on their determination, see e.g.:
// R. M. L. McFadden at al., arXiv:2212.11081 [cond-mat.supr-con]
// https://doi.org/10.48550/arXiv.2212.11081
if (flag || elemPars[Element].IAEA.length < 5) {
// Using stopping coefficients derived from ICRU Report 49
//return StoppingCoefficientsICRU[Element];
return elemPars[Element].ICRU;
} else {
// Using stopping coefficients derived from data in the IAEA database;
// however, if they are unavailable, return those from ICRU Report 49
//return (Element in StoppingCoefficientsIAEA) ? StoppingCoefficientsIAEA[Element] : StoppingCoefficientsICRU[Element];
return elemPars[Element].IAEA;
}
}
function rho_fun()
{
var irow = this.parentNode.parentNode.rowIndex;
var caller = this.id;
var chem = document.getElementById(caller).value;
var rhoLi = "L"+irow+"rho";
var rho = 0;
if (elemPars[chem]) {
rho = elemPars[chem].rho;
} else {
// Did not find density in elements list
if (isFinite(rhos[chem])) {
// Found in densities list of compositions
rho = rhos[chem];
} else {
// suggest a material density based on composition (when it's undefined)
let layer_formula = parse_formula(chem);
// determine the stoichiometry sum (for normalization)
let stoichiometry_sum = 0;
for (key of Object.keys(layer_formula)) {
stoichiometry_sum = stoichiometry_sum + layer_formula[key];
}
// determine the density using on a weighted average of the elemental densities
let density_estimate = 0;
for (key of Object.keys(layer_formula)) {
if (layer_formula[key] != null) {
density_estimate = density_estimate + (layer_formula[key] / stoichiometry_sum) * elemPars[key].rho;
}
}
rho = density_estimate;
alert("Warning: The density for this layer is only an estimate!")
}
}
// Set value in appropriate cell
document.getElementById(rhoLi).value = rho;
}
function openTab(event, tabName) {
// Declare all variables
var i, tabcontent, tablinks;
// Get all elements with class="tabcontent" and hide them
tabcontent = document.getElementsByClassName("tabcontent");
for (i = 0; i < tabcontent.length; i++) {
tabcontent[i].style.display = "none";
}
// Get all elements with class="tablinks" and remove the class "active"
tablinks = document.getElementsByClassName("tablinks");
for (i = 0; i < tablinks.length; i++) {
tablinks[i].className = tablinks[i].className.replace(" active", "");
}
// Show the current tab, and add an "active" class to the button that opened the tab
document.getElementById(tabName).style.display = "block";
if (event) event.currentTarget.className += " active";
}
function adjust_table()
{
var numLayer = document.getElementById("numLayer").value;
var LTable = document.getElementById("LTable");
var Nrows = LTable.rows.length;
var Comps = [];
var Rhos = [];
var Ds = [];
// Need to loop to get the right number of rows when reloading
if (numLayer >= Nrows) {
for (i = Nrows;i<=numLayer;i++) {
var row = LTable.insertRow(i);
var Li = row.insertCell(0);
Li.innerHTML = i;
var compL = row.insertCell(1);
var compCell = document.createElement("input");
compCell.id = "L"+i+"Comp";
compCell.name = "L"+i+"Comp";
compCell.size = 15;
compCell.onchange = rho_fun;
if (Comps[i-1]) {compCell.value = Comps[i-1];}else{compCell.value = 'SrTiO3';}
compL.appendChild(compCell);
var rhoL = row.insertCell(2);
var rhoCell = document.createElement("input");
rhoCell.id = "L"+i+"rho";
rhoCell.name = "L"+i+"rho";
rhoCell.size = 5;
rhoL.appendChild(rhoCell);
if (Rhos[i-1]) {rhoCell.value = Rhos[i-1];}else{rhoCell.value = '5.12';}
var thickL = row.insertCell(3);
var thickCell = document.createElement("input");
thickCell.id = "L"+i+"d";
thickCell.name = "L"+i+"d";
thickCell.size = 7;
thickL.appendChild(thickCell);
if (Ds[i-1]) {thickCell.value = Ds[i-1];}else{thickCell.value = '10000';}
}
} else {
for (i = Nrows-1;i>numLayer;i--) {
LTable.deleteRow(i);
}
}
}
function adjust_scans()
{
// Deal with scans checkbox and type
var scanSeq = document.getElementById("scanSeq").checked;
var sender = document.getElementById("scanSeq");
var scanType = document.getElementById("scanType").value;
// consider only if scans checkbox is checked
if (scanSeq) {
// Which type of scan
if (scanType == "scanLoop") {
ShowHide(1,'ScansTable');
ShowHide(0,'ScansLine');
} else {
ShowHide(1,'ScansLine');
ShowHide(0,'ScansTable');
}
} else {
// Hide both
ShowHide(0,'ScansTable');
ShowHide(0,'ScansLine');
}
}
function ProjSmartDefaults()
{
var Proj = document.getElementById("ProjType").value;
var sigEnergy = document.getElementById("sigEnergy");
var sigAngle = document.getElementById("sigAngle");
if (Proj == "muon") {
sigEnergy.value = "450";
sigAngle.value = "15";
} else {
sigEnergy.value = "0";
sigAngle.value = "0";
}
}
function ProjNumberLimit()
{
var numberProj = document.getElementById("numberProj").value;
if (numberProj > 5000) {
alert("Maximum number is 5000");
document.getElementById("numberProj").value = 5000;
}
}
function ShowHide(onoff,item) {
// this function can switch item to visible/hidden onoff=1/0
if(onoff){
// document.getElementById(item).style.display = 'block';
document.getElementById(item).style.visibility = "visible";
} else {
// document.getElementById(item).style.display = 'none';
document.getElementById(item).style.visibility = "hidden";
}
}
function prep_cfg(toggle) {
// This function collects various values and returns
// toggle=1 : returns object with all values
// toggle!=1 : returns string containing cfg file
let TrimSPcfg = "";
let strtmp = "";
let valtmp = "";
All['trimPath']=document.getElementById("trimPath").value;
// Prepare Layers section
let LayersSec = "[Layers]\n";
let numLayer = document.getElementById("numLayer").value;
All['numLayer']=numLayer;
LayersSec = LayersSec + "numLayer="+numLayer+"\n";
for (i = 1;i<=numLayer;i++) {
strtmp = "L"+i+"Comp";
valtmp = document.getElementById(strtmp).value;
All[strtmp]=valtmp;
LayersSec = LayersSec + strtmp +"="+ valtmp+"\n";
strtmp = "L"+i+"rho";
valtmp = document.getElementById(strtmp).value;
All[strtmp]=valtmp;
LayersSec = LayersSec + strtmp +"="+ valtmp+"\n";
strtmp = "L"+i+"d";
valtmp = document.getElementById(strtmp).value;
All[strtmp]=valtmp;
LayersSec = LayersSec + strtmp +"="+ valtmp+"\n";
}
// Prepare projectile parameters section
let parProj = ["workPath","fileNamePrefix","ProjType","numberProj","z0","dz","valEnergy","sigEnergy","valAngle","sigAngle","ranSeed"];
let ProjSec = "[ProjectileParameters]\n";
for (key of parProj) {
All[key]= document.getElementById(key).value;
ProjSec = ProjSec + key + "=" + All[key] + "\n";
}
// Prepare Files section
let FilesSec = "[Files]\n";
FilesSec = FilesSec + "fileNamePrefix="+All["fileNamePrefix"]+"\nworkPath="+All["workPath"]+"\n";
// Prepare ScanSequence section
let ScanSec = "[ScanSequence]\n";
strtmp = "scanSeq";
valtmp = 1*(document.getElementById(strtmp).checked);
All[strtmp]=valtmp;
ScanSec = ScanSec + strtmp +"="+ valtmp+"\n";
let parScan = ["comboScan","scanType","scanFrom","scanStep","scanTo","scanList","scanListdz"];
for (key of parScan) {
All[key]= document.getElementById(key).value;
ScanSec = ScanSec + key + "=" + All[key] + "\n";
}
// Collect other parameters
let parOther = ["parEF", "parESB", "parSHEATH", "parERC", "parRD", "parCA", "parKK0", "parKK0R", "parKDEE1", "parKDEE2", "parIPOT", "parIPOTR", "parIRL"];
for (key of parOther) {
All[key]= document.getElementById(key).value;
}
// Check ICRU flag, if checked use it
All["flagICRU"] = document.getElementById("flagICRU").checked;
// Construct full content of cfg file
TrimSPcfg = FilesSec + LayersSec + ProjSec + ScanSec;
if (toggle) {
return All;
} else {
return TrimSPcfg;
}
}
function setValues(content) {
// This function takes cfg file content and substitutes values in the GUI
// Split file content into lines
var event = new Event('change');
var lines = content.toString().split('\n');
// Remove comment lines, empty lines and those starting with "["
var PATTERN= /^(?!\[)(?!\#)(\S)/,
flines = lines.filter(function (str) {return PATTERN.test(str);});
for (var i=0; i<flines.length; i++) {
// Loop over parameters, set appropriate values and trigger associated onChange
var param=flines[i].replace(/\s+/,'').split('=');
if (param[0] == 'scanSeq') {
// This is a checkbox
var seqChecked = true;
if (param[1] == 0) {seqChecked = false;}
document.getElementById(param[0]).checked = seqChecked;
document.getElementById(param[0]).dispatchEvent(event);
} else {
document.getElementById(param[0]).value = param[1];
document.getElementById(param[0]).dispatchEvent(event);
}
}
}
function CreateInpFile() {
// Create and return input file for the Trim.SP simulation binary
// Takes object All as input for all relevant parameters
// This is the form of the begining of the input file:
var TemplateFile = "ProjZ ProjAM valEnergy sigEnergy valAngle sigAngle parEF parESB parSHEATH parERC\n"
TemplateFile += "numberProj ranSeed ranSeed ranSeed z0 parRD dz parCA parKK0 parKK0R parKDEE1 parKDEE2 parIPOT parIPOTR parIRL";
// Then comes the number of layers (new format) for example 4 layers:
// N_Layers=4
TemplateFile=TemplateFile+"\n"+"N_Layers=numLayer";
// Then loop over the layers and for each give the following structure
// chemical formula, thickness, density, correction factor, number of elements
var TemplateLayer = "L1Comp L1d L1rho L1CK L1Elem\n";
// Z number of elements
TemplateLayer += "L1ELZ1 L1ELZ2 L1ELZ3 L1ELZ4 L1ELZ5\n";
// A number of elements
TemplateLayer += "L1ELW1 L1ELW2 L1ELW3 L1ELW4 L1ELW5\n";
// Weigth of element in composition
TemplateLayer += "L1ELC1 L1ELC2 L1ELC3 L1ELC4 L1ELC5\n";
// Surface binding energy of elements
TemplateLayer += "L1ELE1 L1ELE2 L1ELE3 L1ELE4 L1ELE5\n";
// Displacement energy of elements, always 30 eV??
TemplateLayer += "L10301 L10302 L10303 L10304 L10305\n";
// Bulk binding energy of elements, usually zero
TemplateLayer += "0 0 0 0 0\n";
// value A-1 of the ziegler tables
TemplateLayer += "L1ELST11 L1ELST21 L1ELST31 L1ELST41 L1ELST51\n";
// value A-2 of the ziegler tables
TemplateLayer += "L1ELST12 L1ELST22 L1ELST32 L1ELST42 L1ELST52\n";
// value A-3 of the ziegler tables
TemplateLayer += "L1ELST13 L1ELST23 L1ELST33 L1ELST43 L1ELST53\n";
// value A-4 of the ziegler tables
TemplateLayer += "L1ELST14 L1ELST24 L1ELST34 L1ELST44 L1ELST54\n";
// value A-5 of the ziegler tables
TemplateLayer += "L1ELST15 L1ELST25 L1ELST35 L1ELST45 L1ELST55";
let projectile = All['ProjType'];
All['ProjZ'] = elemPars[projectile].Z;
All['ProjAM'] = elemPars[projectile].A;
// This is the flag for checking layers
let Check=0;
let Layer='';
// Loop over layers an create appropriate values
for (var i=1; i<=All['numLayer'];i++){
// Arry containing 12 lines for each layer
let newLayer = ["","","","","","","","","","","",""];
Check=0;
// Composition of layers
let LComp="L"+i+"Comp";
let Comp = All[LComp];
if (Comp == "" || typeof Comp == 'undefined') {Check++;}
let LElComp=parse_formula(Comp);
for (key of Object.keys(LElComp)) {
// Check if composition is understood
if (key=="" || elemPars[key].Z =="") {
Check++;
}
}
// Number of elements
let LElem = "L"+i+"Elem";
All[LElem] = Object.keys(LElComp).length;
let nEl = All[LElem];
// Densities of layers
let Lrho="L"+i+"rho";
let rho = 1*All[Lrho];
if (rho==0) {Check++;}
// Thickness of layers
let Ld ="L"+i+"d";
let d = All[Ld];
if (d=="") {Check++;}
// Sanity check, is the layer supposed to have value? are they all there?
if (Check!=0) {
ErrMsg="Error: Bad chemical formula in Layer $i.\nPlease check!\n";
console.log($ErrMsg);
return ErrMsg;
}
let Sum = 0;
for (key of Object.keys(LElComp)) {
Sum=Sum+LElComp[key];
}
if (Sum==0) {Sum=1;}
let Els = Object.keys(LElComp);
// first line: chemical formula, thickness, density, correction factor, number of elements
newLayer[0] += Comp + " " + d + " " + rho + " 1 " + nEl;
for (var j=0;j<Els.length;j++) {
let El = Els[j];
let ElSTs = StoppingCoefficients(El,All["flagICRU"]);
// Next 11 lines depend on number of elements
newLayer[1] += elemPars[El].Z + " " ;
newLayer[2] += elemPars[El].A + " " ;
newLayer[3] += LElComp[El]/Sum + " " ;
newLayer[4] += elemPars[El].Elast + " " ;
newLayer[5] += "30 " ;
newLayer[6] += "0 " ;
newLayer[7] += ElSTs[0] + " " ;
newLayer[8] += ElSTs[1] + " " ;
newLayer[9] += ElSTs[2] + " " ;
newLayer[10] += ElSTs[3] + " " ;
newLayer[11] += ElSTs[4] + " " ;
}
TemplateFile += "\n" + newLayer.join("\n");
}
for (let key of Object.keys(All)) {
if (All[key]!=null){
if (key=="ranSeed") {
// Seed repeats three times
TemplateFile = TemplateFile.replace(/ranSeed/g,All[key]);
} else {
TemplateFile = TemplateFile.replace(key,All[key]);
}
}
}
return TemplateFile;
}
function sum(array){
// Takes and array and returns the sum of its elements
let sum_array = array.reduce(function(a, b){
return a + b;
}, 0);
return sum_array;
}
function startSequence() {
let cmd = '';
let trimBin = All['trimPath']+"/trimspNL";
let randStr = '';
let webOrApp = amIWeb();
// Only for Node.js
if (!webOrApp) {
// Check if the trimspNL binary is found
if (!fileExists(trimBin)) {
// check if it is in rpm
trimBin = "/usr/lib/TrimSP/resources/app/trimspNL";
if (!fileExists(trimBin)) {
// if not found, try in PATH and hope for the best
trimBin = "trimspNL";
}
}
// Check if workPath exists otherwise create it
checkDir(All['workPath']); // from TrimSPelec.js, Electron/Node specific
} else {
// Add random string (5 char) to file names
randStr = (Math.random() + 1).toString(36).substring(7);
All["fileNamePrefix"] = randStr;
All["workPath"] = "/tmp/" + randStr;
}
let Progress =0;
document.getElementById("pBar").style.width = Progress + "%";
document.getElementById("pBar").innerHTML = Progress + "%";
// This is a flag to indicate whether the lists of values and inclements are the same size
All["SdzFlag"]=0;
var SValues = [];
let ScanName = "E";
let ScanAttrib = "valEnergy";
// Generate an arry of scanned values (one element for a single run)
if (All["scanSeq"]) {
// For multiple runs or a scan
if (All["scanType"]=="scanVals") {
var SValues=All["scanList"].split(/,/);
var SdzValues=All["scanListdz"].split(/,/);
if (SValues.length == SdzValues.length) {All["SdzFlag"]=1;}
} else {
for (let Val=parseInt(All["scanFrom"]);Val<=parseInt(All["scanTo"]);Val=Val+parseInt(All["scanStep"])) {
SValues.push(Val);
}
}
if (All["comboScan"]==1) {
ScanName = "SigE";
ScanAttrib = "sigEnergy";
} else if (All["comboScan"]==2) {
ScanName = "Angle";
ScanAttrib = "valAngle";
} else if (All["comboScan"]==3) {
ScanName = "SigAngle";
ScanAttrib = "sigAngle";
} else if (All["comboScan"]==4) {
ScanName = "N";
ScanAttrib = "numberProj";
} else if (All["comboScan"]==5) {
ScanName = "Ld"+All["scandL"];
ScanAttrib = "L"+All["scandL"]+"d";
}
} else {
// For single run, array with single value of valEnergy
SValues.push(parseInt(All["valEnergy"]));
}
// Now start the actual simulation
//setInterval(() => {
let iScan=0;
for (var SValue of SValues) {
// Update value in GUI
document.getElementById(ScanAttrib).value = SValue;
All[ScanAttrib]=SValue;
if ( All["SdzFlag"] == 1) {
if (All["comboScan"]=="Energy") {
document.getElementById(ScanAttrib).value = SdzValues[iScan];
} else if (All["comboScan"]=="") {
document.getElementById(ScanAttrib).value = SdzValues[iScan];
}
}
// Update GUI progress bar
Progress=Math.round(Progress+90/SValues.length);
document.getElementById("pBar").style.width = Progress + "%";
document.getElementById("pBar").innerHTML = Progress + "%";
// Single run: Start
let eingabe1=CreateInpFile();
if (eingabe1=="ERROR") {return(0);}
let FILENAME=All["fileNamePrefix"]+"_"+ScanName+SValue;
writeAsciiFile(All["workPath"]+"/"+FILENAME+".inp",eingabe1);
if (!webOrApp) {
// Prepare command and execute
cmd = "cd " + All["workPath"];
//cmd += ";cp " + FILENAME + ".inp eingabe1.inp";
cmd += ";" + trimBin + ' ' + FILENAME;
//cmd += "; mv -f ausgabe1.rge " + FILENAME + ".rge";
//cmd += "; mv -f ausgabe1.out " + FILENAME + ".out";
//cmd += "; mv -f ausgabe1.err " + FILENAME + ".err";
execute(cmd);
}
// Single run: End
// Read stopping profiels
let [cols,data]= readDatFile(All["workPath"]+"/"+FILENAME+".rge");
// convert depth to nm and normalize stopping profile
let depth=data[0];
let nmuons=data[1];
let dz = (depth[1]-depth[0])/10;
let norm = dz*sum(nmuons)/100;
for (let i=0; i<depth.length; i++) {
depth[i]=depth[i]/10;
nmuons[i]=nmuons[i]/norm;
}
Plot_xy("plotRge",depth,nmuons,['Depth (nm)','Stopped muons (%/nm)',ScanName+'='+Number(SValue)/1000+'keV']);
// Read the sequence data
let [cfort,cdata]= readDatFile(All["workPath"]+"/fort.33");
let lyrs = [6]; // back scattered muons
for (let ilayer=18;ilayer<cdata.length;ilayer++){lyrs.push(ilayer);} // the rest of the layers
// Now loop over all
Plotly.purge("plotFrac")
for (let ilayer of lyrs) {
// Normalize
let idata = cdata[ilayer];
for (let i=0; i<idata.length; i++) {
idata[i]=100*idata[i]/cdata[4][i];
}
let chem = cfort[ilayer];
if (ilayer != 6) {
let LComp = "L"+(ilayer-17)+"Comp";
chem = All[LComp];
}
Plot_xy("plotFrac",cdata[0],cdata[ilayer],['E (keV)','Fraction of muons (%)',chem]);
}
iScan++;
}
let data = readAsciiFile(All["workPath"]+"/"+"fort.33");
let LComp = "";
let chem_formula = "";
let place_holder = "";
let re = new RegExp(place_holder,"g");
for (let i=1;i<=All["numLayer"];i++) {
LComp = "L"+i+"Comp";
chem_formula = All[LComp];
place_holder = "impL"+i;
re = new RegExp(place_holder,"g");
data = data.replace(re, chem_formula);
}
let seq_file = All["workPath"]+"/"+All["fileNamePrefix"]+"_Seq_Results.dat";
writeAsciiFile(seq_file, data);
// Remove redundant files and change the name fort.33
if (!webOrApp) {
// cmd="cd " + All["workPath"] + ";rm -f eingabe1.inp; mv -f fort.33 " + seq_file;
cmd="cd " + All["workPath"] + "; mv -f fort.33 " + seq_file;
execute(cmd);
}
Progress=100;
document.getElementById("pBar").style.width = Progress + "%";
document.getElementById("pBar").innerHTML = Progress + "%";
return(0);
}
function readDatFile(filename) {
// Read column data file and return
// cols - labels of columns
// data - 2D array with the columns
let lines = "";
lines = readAsciiFile(filename);
let data = [];
let i=0; // line counter
for (let line of lines.trim().split('\n')) {
// take labels from the first row
if (i==0) {
var cols = line.trim().split(/[#\s]+/g);
} else {
let words = line.trim().split(/[#\s]+/g);
for (let j=0; j<cols.length;j++) {
if (data[j] == null) {data[j]=[];}
data[j].push(parseFloat(words[j]));
}
}
i++;
}
return [cols,data];
}
function plotProfiles(filenames) {
// Plot rge files filenames
var win = window.open("", "_blank", "toolbar=no, menubar=no");
win.document.open();
win.document.write('<html><head><link rel="stylesheet" href="plotly.css"></head><body>');
win.document.write('<table style="width: 100%"><tr><td><div id="newPlot"><!-- Plotly chart will be drawn inside this DIV --></div></td></tr></table>');
win.document.write('</body></html>');
win.addEventListener('resize', sizePlot);
win.document.close();
var plotDiv=win.document.getElementById("newPlot");
// Extract energies from run files if available
var Es = [];
for (let i=0;i<filenames.length;i++) {
Es[i]=Number(filenames[i].substring(filenames[i].indexOf('_')+2,filenames[i].indexOf('.')));
}
// loop on sorted values and plot
for (let i=0;i<Es.length;i++) {
let [cols,data]= readDatFile(filenames[i]);
// convert depth to nm and normalize profile
let depth=data[0];
let nmuons=data[1];
let dz = (depth[1]-depth[0])/10;
let norm = dz*sum(nmuons)/100;
for (let i=0; i<depth.length; i++) {
depth[i]=depth[i]/10;
nmuons[i]=nmuons[i]/norm;
}
Plot_xy(plotDiv,depth,nmuons,['Depth (nm)','Stopped muons (%/nm)','E='+(Es[i]/1000)+'keV']);
}
}
function plotFractions(filename) {
// Plot fractions stopped in layers from sequence file
var win = window.open("", "_blank", "toolbar=no, menubar=no");
win.document.open();
win.document.write('<html><head><link rel="stylesheet" href="plotly.css"></head><body>');
win.document.write('<table style="width: 100%"><tr><td><div id="newPlot"><!-- Plotly chart will be drawn inside this DIV --></div></td></tr></table>');
win.document.write('</body></html>');
win.addEventListener('resize', sizePlot);
win.document.close();
var plotDiv=win.document.getElementById("newPlot");
var [cfort,cdata]= readDatFile(filename);
let lyrs = [6]; // back scattered muons
for (let ilayer=18;ilayer<cdata.length;ilayer++){lyrs.push(ilayer);} // the rest of the layers
// Now loop over all
for (let ilayer of lyrs) {
// Normalize
let idata = cdata[ilayer];
for (let i=0; i<idata.length; i++) {
idata[i]=100*idata[i]/cdata[4][i];
}
Plot_xy(plotDiv,cdata[0],cdata[ilayer],['E (keV)','Fraction of muons (%)',cfort[ilayer]]);
}
plotDiv=win.document.getElementById("newPlot");
}
function plotMean(filename) {
// Plot mean and straggeling from sequence file
var win = window.open("", "_blank", "toolbar=no, menubar=no");
win.document.open();
win.document.write('<html><head><link rel="stylesheet" href="plotly.css"></head><body>');
win.document.write('<table style="width: 100%"><tr><td><div id="newPlot" style="width: 500px; height: 400px;"><!-- Plotly chart will be drawn inside this DIV --></div></td></tr></table>');
win.document.write('</body></html>');
win.addEventListener('resize', sizePlot);
win.document.close();
var plotDiv=win.document.getElementById("newPlot");
let [cfort,cdata]= readDatFile(filename);
let mean = cdata[10];
let strag = cdata[11];
for (let i=0; i<mean.length; i++) {
mean[i]=mean[i]/10;
strag[i]=strag[i]/10;
}
Plot_xy(plotDiv,cdata[0],mean,['E (keV)','Mean Depth/Stragg. (nm)',cfort[10]]);
Plot_xy(plotDiv,cdata[0],strag,['E (keV)','Mean Depth/Stragg. (nm)',cfort[11]]);
}
function startSim() {
// Collect data from GUI
All=prep_cfg(1);
// Switch to plots tab
document.getElementById("btnPlots").click();
// Clear plots first
Plotly.purge("plotFrac");
Plotly.purge("plotRge");
// start simulation sequence
startSequence();
//CreateInpFile();
// document.location =
//
// "http://musruser.psi.ch/cgi-bin/TrimSP.cgi?TrimSPcfg="+TrimSPcfg+'go=start';
}
function amIWeb() {
if (typeof module !== 'undefined' && module.exports) {
// Run as standalone app
return 0;
} else {
// Run as a web app
return 1;
}
}