// This file contains function that are generic Javascript for TrimSP // This is an object that contains all GUI ids and values var All = new Object(); function isObject(item) { // simple object check // https://stackoverflow.com/a/34749873 return (item && typeof item === 'object' && !Array.isArray(item)); } function mergeDeep(target, ...sources) { // function for deep-merging objects // https://stackoverflow.com/a/34749873 if (!sources.length) { return target; } const source = sources.shift(); if (isObject(target) && isObject(source)) { for (const key in source) { if (isObject(source[key])) { if (!target[key]) Object.assign(target, { [key]: {} }); mergeDeep(target[key], source[key]); } else { Object.assign(target, { [key]: source[key] }); } } } return mergeDeep(target, ...sources); } // element data const elements = { "H": { "Z": 1, "A": 1.008, "rho": 0.08, "Elast": 0.1 }, "He": { "Z": 2, "A": 4.003, "rho": 0.12, "Elast": 0.1 }, "Li": { "Z": 3, "A": 6.939, "rho": 0.53, "Elast": 1.63 }, "Be": { "Z": 4, "A": 9.012, "rho": 1.85, "Elast": 3.32 }, "B": { "Z": 5, "A": 10.811, "rho": 2.34, "Elast": 5.77 }, "C": { "Z": 6, "A": 12.011, "rho": 2.26, "Elast": 7.37 }, "N": { "Z": 7, "A": 14.007, "rho": 1.03, "Elast": 4.92 }, "O": { "Z": 8, "A": 15.999, "rho": 2, "Elast": 2.6 }, "F": { "Z": 9, "A": 18.998, "rho": 1.11, "Elast": 0.84 }, "Ne": { "Z": 10, "A": 20.183, "rho": 1.5, "Elast": 0.02 }, "Na": { "Z": 11, "A": 22.99, "rho": 0.97, "Elast": 1.11 }, "Mg": { "Z": 12, "A": 24.312, "rho": 1.74, "Elast": 1.51 }, "Al": { "Z": 13, "A": 26.982, "rho": 2.7, "Elast": 3.39 }, "Si": { "Z": 14, "A": 28.086, "rho": 2.33, "Elast": 4.63 }, "P": { "Z": 15, "A": 30.974, "rho": 1, "Elast": 3.43 }, "S": { "Z": 16, "A": 32.064, "rho": 2.07, "Elast": 2.85 }, "Cl": { "Z": 17, "A": 35.453, "rho": 2.03, "Elast": 1.4 }, "Ar": { "Z": 18, "A": 39.948, "rho": 1.77, "Elast": 0.08 }, "K": { "Z": 19, "A": 39.102, "rho": 0.86, "Elast": 0.93 }, "Ca": { "Z": 20, "A": 40.08, "rho": 1.55, "Elast": 1.84 }, "Sc": { "Z": 21, "A": 44.956, "rho": 2.99, "Elast": 3.9 }, "Ti": { "Z": 22, "A": 47.9, "rho": 4.54, "Elast": 4.85 }, "V": { "Z": 23, "A": 50.942, "rho": 6.11, "Elast": 5.31 }, "Cr": { "Z": 24, "A": 51.996, "rho": 7.19, "Elast": 4.1 }, "Mn": { "Z": 25, "A": 54.938, "rho": 7.43, "Elast": 2.92 }, "Fe": { "Z": 26, "A": 55.847, "rho": 7.87, "Elast": 4.28 }, "Co": { "Z": 27, "A": 58.933, "rho": 8.9, "Elast": 4.39 }, "Ni": { "Z": 28, "A": 58.71, "rho": 8.9, "Elast": 4.44 }, "Cu": { "Z": 29, "A": 63.54, "rho": 8.96, "Elast": 3.49 }, "Zn": { "Z": 30, "A": 65.37, "rho": 7.13, "Elast": 1.35 }, "Ga": { "Z": 31, "A": 69.72, "rho": 5.91, "Elast": 2.81 }, "Ge": { "Z": 32, "A": 72.59, "rho": 5.32, "Elast": 3.85 }, "As": { "Z": 33, "A": 74.922, "rho": 5.72, "Elast": 2.96 }, "Se": { "Z": 34, "A": 78.96, "rho": 4.79, "Elast": 2.25 }, "Br": { "Z": 35, "A": 79.909, "rho": 3.14, "Elast": 1.22 }, "Kr": { "Z": 36, "A": 83.8, "rho": 3.1, "Elast": 0.12 }, "Rb": { "Z": 37, "A": 85.47, "rho": 1.53, "Elast": 0.85 }, "Sr": { "Z": 38, "A": 87.62, "rho": 2.54, "Elast": 1.72 }, "Y": { "Z": 39, "A": 88.905, "rho": 4.47, "Elast": 4.37 }, "Zr": { "Z": 40, "A": 91.22, "rho": 6.51, "Elast": 6.25 }, "Nb": { "Z": 41, "A": 92.906, "rho": 8.57, "Elast": 7.57 }, "Mo": { "Z": 42, "A": 95.94, "rho": 10.22, "Elast": 6.82 }, "Tc": { "Z": 43, "A": 98, "rho": 11.5, "Elast": 6.85 }, "Ru": { "Z": 44, "A": 101.07, "rho": 12.37, "Elast": 6.74 }, "Rh": { "Z": 45, "A": 102.905, "rho": 12.41, "Elast": 5.75 }, "Pd": { "Z": 46, "A": 106.4, "rho": 12.02, "Elast": 3.89 }, "Ag": { "Z": 47, "A": 107.87, "rho": 10.5, "Elast": 2.95 }, "Cd": { "Z": 48, "A": 112.4, "rho": 8.65, "Elast": 1.16 }, "In": { "Z": 49, "A": 114.82, "rho": 7.31, "Elast": 2.52 }, "Sn": { "Z": 50, "A": 118.69, "rho": 7.31, "Elast": 3.14 }, "Sb": { "Z": 51, "A": 121.75, "rho": 6.68, "Elast": 2.75 }, "Te": { "Z": 52, "A": 127.6, "rho": 6.24, "Elast": 2.23 }, "I": { "Z": 53, "A": 126.904, "rho": 4.93, "Elast": 1.11 }, "Xe": { "Z": 54, "A": 131.3, "rho": 3.8, "Elast": 0.16 }, "Cs": { "Z": 55, "A": 132.905, "rho": 1.9, "Elast": 0.8 }, "Ba": { "Z": 56, "A": 137.34, "rho": 3.59, "Elast": 1.9 }, "La": { "Z": 57, "A": 138.91, "rho": 6.15, "Elast": 4.47 }, "Ce": { "Z": 58, "A": 140.12, "rho": 6.77, "Elast": 4.32 }, "Pr": { "Z": 59, "A": 140.907, "rho": 6.77, "Elast": 3.7 }, "Nd": { "Z": 60, "A": 144.24001, "rho": 7.01, "Elast": 3.4 }, "Pm": { "Z": 61, "A": 147, "rho": 7.22, "Elast": 0.1 }, "Sm": { "Z": 62, "A": 150.35001, "rho": 7.52, "Elast": 2.14 }, "Eu": { "Z": 63, "A": 151.96001, "rho": 5.24, "Elast": 1.86 }, "Gd": { "Z": 64, "A": 157.25, "rho": 7.9, "Elast": 4.14 }, "Tb": { "Z": 65, "A": 158.924, "rho": 8.23, "Elast": 4.05 }, "Dy": { "Z": 66, "A": 162.5, "rho": 8.55, "Elast": 3.04 }, "Ho": { "Z": 67, "A": 164.92999, "rho": 8.8, "Elast": 3.14 }, "Er": { "Z": 68, "A": 167.25999, "rho": 9.07, "Elast": 3.29 }, "Tm": { "Z": 69, "A": 168.93401, "rho": 9.32, "Elast": 2.42 }, "Yb": { "Z": 70, "A": 173.03999, "rho": 6.9, "Elast": 1.6 }, "Lu": { "Z": 71, "A": 174.97, "rho": 9.84, "Elast": 4.43 }, "Hf": { "Z": 72, "A": 178.49001, "rho": 13.31, "Elast": 6.44 }, "Ta": { "Z": 73, "A": 180.948, "rho": 16.65, "Elast": 8.1 }, "W": { "Z": 74, "A": 183.85001, "rho": 19.35, "Elast": 8.9 }, "Re": { "Z": 75, "A": 186.2, "rho": 21.04, "Elast": 8.03 }, "Os": { "Z": 76, "A": 190.2, "rho": 22.6, "Elast": 8.17 }, "Ir": { "Z": 77, "A": 192.2, "rho": 22.4, "Elast": 6.94 }, "Pt": { "Z": 78, "A": 195.09, "rho": 21.45, "Elast": 5.84 }, "Au": { "Z": 79, "A": 196.967, "rho": 19.32, "Elast": 3.81 }, "Hg": { "Z": 80, "A": 200.59, "rho": 13.55, "Elast": 0.67 }, "Tl": { "Z": 81, "A": 204.37, "rho": 11.85, "Elast": 1.88 }, "Pb": { "Z": 82, "A": 207.19, "rho": 11.35, "Elast": 2.03 }, "Bi": { "Z": 83, "A": 208.98, "rho": 9.75, "Elast": 2.18 }, "Po": { "Z": 84, "A": 210, "rho": 9.3, "Elast": 1.5 }, "At": { "Z": 85, "A": 210, "rho": 0, "Elast": 0.1 }, "Rn": { "Z": 86, "A": 222, "rho": 0, "Elast": 0.2 }, "Fr": { "Z": 87, "A": 223, "rho": 0, "Elast": 0.1 }, "Ra": { "Z": 88, "A": 226, "rho": 0, "Elast": 1.66 }, "Ac": { "Z": 89, "A": 227, "rho": 0, "Elast": 4.25 }, "Th": { "Z": 90, "A": 232.03799, "rho": 11.72, "Elast": 6.2 }, "Pa": { "Z": 91, "A": 231, "rho": 15.4, "Elast": 0.1 }, "U": { "Z": 92, "A": 238.03, "rho": 18.95, "Elast": 5.55 }, "": { "Z": 0, "A": 0, "rho": 0, "Elast": 0 } } // projectile data const projectiles = { "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": [] } } // electronic stopping coefficients from Anderson & Zeigler (1977). const az_table = { "H": { "AZ": [ 1.262, 1.44, 242.6, 12000.0, 0.1159 ] }, "He": { "AZ": [ 1.229, 1.397, 484.5, 5873.0, 0.05225 ] }, "Li": { "AZ": [ 1.411, 1.6, 725.6, 3013.0, 0.04578 ] }, "Be": { "AZ": [ 2.248, 2.59, 966.0, 153.8, 0.03475 ] }, "B": { "AZ": [ 2.474, 2.815, 1206.0, 1060.0, 0.02855 ] }, "C": { "AZ": [ 2.631, 2.989, 1445.0, 957.2, 0.02819 ] }, "N": { "AZ": [ 2.954, 3.35, 1683.0, 1900.0, 0.02513 ] }, "O": { "AZ": [ 2.652, 3.0, 1920.0, 2000.0, 0.0223 ] }, "F": { "AZ": [ 2.085, 2.352, 2157.0, 2634.0, 0.01816 ] }, "Ne": { "AZ": [ 1.951, 2.199, 2393.0, 2699.0, 0.01568 ] }, "Na": { "AZ": [ 2.542, 2.869, 2628.0, 1854.0, 0.01472 ] }, "Mg": { "AZ": [ 3.792, 4.293, 2862.0, 1009.0, 0.01397 ] }, "Al": { "AZ": [ 4.154, 4.739, 2766.0, 164.5, 0.01397 ] }, "Si": { "AZ": [ 4.15, 4.7, 3329.0, 550.0, 0.01321 ] }, "P": { "AZ": [ 3.232, 3.647, 3561.0, 1560.0, 0.01267 ] }, "S": { "AZ": [ 3.447, 3.891, 3792.0, 1219.0, 0.01211 ] }, "Cl": { "AZ": [ 5.047, 5.714, 4023.0, 878.6, 0.01178 ] }, "Ar": { "AZ": [ 5.731, 6.5, 4253.0, 530.0, 0.01123 ] }, "K": { "AZ": [ 5.151, 5.833, 4482.0, 545.7, 0.01129 ] }, "Ca": { "AZ": [ 5.521, 6.252, 4710.0, 553.3, 0.01112 ] }, "Sc": { "AZ": [ 5.201, 5.884, 4938.0, 560.9, 0.009995 ] }, "Ti": { "AZ": [ 4.862, 5.496, 5165.0, 568.5, 0.009474 ] }, "V": { "AZ": [ 4.48, 5.055, 5391.0, 952.3, 0.009117 ] }, "Cr": { "AZ": [ 3.983, 4.489, 5616.0, 1336.0, 0.008413 ] }, "Mn": { "AZ": [ 3.469, 3.907, 5725.0, 1461.0, 0.008829 ] }, "Fe": { "AZ": [ 3.519, 3.963, 6065.0, 1243.0, 0.007782 ] }, "Co": { "AZ": [ 3.14, 3.535, 6288.0, 1372.0, 0.007361 ] }, "Ni": { "AZ": [ 3.553, 4.004, 6205.0, 555.1, 0.008763 ] }, "Cu": { "AZ": [ 3.696, 4.175, 4673.0, 387.8, 0.02188 ] }, "Zn": { "AZ": [ 4.21, 4.75, 6953.0, 295.2, 0.006809 ] }, "Ga": { "AZ": [ 5.041, 5.697, 7173.0, 202.6, 0.006725 ] }, "Ge": { "AZ": [ 5.554, 6.3, 6496.0, 110.0, 0.009689 ] }, "As": { "AZ": [ 5.323, 6.012, 7611.0, 292.5, 0.006447 ] }, "Se": { "AZ": [ 5.874, 6.656, 7395.0, 117.5, 0.007684 ] }, "Br": { "AZ": [ 5.611, 6.335, 8046.0, 365.2, 0.006244 ] }, "Kr": { "AZ": [ 6.411, 7.25, 8262.0, 220.0, 0.006087 ] }, "Rb": { "AZ": [ 5.694, 6.429, 8478.0, 292.9, 0.006087 ] }, "Sr": { "AZ": [ 6.339, 7.159, 8693.0, 330.3, 0.006003 ] }, "Y": { "AZ": [ 6.407, 7.234, 8907.0, 367.8, 0.005889 ] }, "Zr": { "AZ": [ 6.734, 7.603, 9120.0, 405.2, 0.005765 ] }, "Nb": { "AZ": [ 6.902, 7.791, 9333.0, 442.7, 0.005587 ] }, "Mo": { "AZ": [ 6.425, 7.248, 9545.0, 480.2, 0.005367 ] }, "Tc": { "AZ": [ 6.799, 7.671, 9756.0, 517.6, 0.005315 ] }, "Ru": { "AZ": [ 6.108, 6.887, 9966.0, 555.1, 0.005151 ] }, "Rh": { "AZ": [ 5.924, 6.677, 10180.0, 592.5, 0.004919 ] }, "Pd": { "AZ": [ 5.238, 5.9, 10380.0, 630.0, 0.004758 ] }, "Ag": { "AZ": [ 5.623, 6.354, 7160.0, 337.6, 0.01394 ] }, "Cd": { "AZ": [ 5.814, 6.554, 10800.0, 355.5, 0.004626 ] }, "In": { "AZ": [ 6.23, 7.024, 11010.0, 370.9, 0.00454 ] }, "Sn": { "AZ": [ 6.41, 7.227, 11210.0, 386.4, 0.004474 ] }, "Sb": { "AZ": [ 7.5, 8.48, 8608.0, 348.0, 0.009074 ] }, "Te": { "AZ": [ 6.979, 7.871, 11620.0, 392.4, 0.004402 ] }, "I": { "AZ": [ 7.725, 8.716, 11830.0, 394.8, 0.004376 ] }, "Xe": { "AZ": [ 8.231, 9.289, 12030.0, 397.3, 0.004384 ] }, "Cs": { "AZ": [ 7.287, 8.218, 12230.0, 399.7, 0.004447 ] }, "Ba": { "AZ": [ 7.899, 8.911, 12430.0, 402.1, 0.004511 ] }, "La": { "AZ": [ 8.041, 9.071, 12630.0, 404.5, 0.00454 ] }, "Ce": { "AZ": [ 7.489, 8.444, 12830.0, 406.9, 0.00442 ] }, "Pr": { "AZ": [ 7.291, 8.219, 13030.0, 409.3, 0.004298 ] }, "Nd": { "AZ": [ 7.098, 8.0, 13230.0, 411.8, 0.004182 ] }, "Pm": { "AZ": [ 6.91, 7.786, 13430.0, 414.2, 0.004058 ] }, "Sm": { "AZ": [ 6.728, 7.58, 13620.0, 416.6, 0.003976 ] }, "Eu": { "AZ": [ 6.551, 7.38, 13820.0, 419.0, 0.003877 ] }, "Gd": { "AZ": [ 6.739, 7.592, 14020.0, 421.4, 0.003863 ] }, "Tb": { "AZ": [ 6.212, 6.996, 14210.0, 423.9, 0.003725 ] }, "Dy": { "AZ": [ 5.517, 6.21, 14400.0, 426.3, 0.003632 ] }, "Ho": { "AZ": [ 5.219, 5.874, 14600.0, 428.7, 0.003498 ] }, "Er": { "AZ": [ 5.071, 5.706, 14790.0, 433.0, 0.003405 ] }, "Tm": { "AZ": [ 4.926, 5.542, 14980.0, 433.5, 0.003342 ] }, "Yb": { "AZ": [ 4.787, 5.386, 15170.0, 435.9, 0.003292 ] }, "Lu": { "AZ": [ 4.893, 5.505, 15360.0, 438.4, 0.003243 ] }, "Hf": { "AZ": [ 5.028, 5.657, 15550.0, 440.8, 0.003195 ] }, "Ta": { "AZ": [ 4.738, 5.329, 15740.0, 443.2, 0.003186 ] }, "W": { "AZ": [ 4.574, 5.144, 15930.0, 442.4, 0.003144 ] }, "Re": { "AZ": [ 5.2, 5.851, 16120.0, 441.6, 0.003122 ] }, "Os": { "AZ": [ 5.07, 5.704, 16300.0, 440.9, 0.003082 ] }, "Ir": { "AZ": [ 4.945, 5.563, 16490.0, 440.1, 0.002965 ] }, "Pt": { "AZ": [ 4.476, 5.034, 16670.0, 439.3, 0.002871 ] }, "Au": { "AZ": [ 4.856, 5.46, 18320.0, 438.5, 0.002542 ] }, "Hg": { "AZ": [ 4.308, 4.843, 17040.0, 487.8, 0.002882 ] }, "Tl": { "AZ": [ 4.723, 5.311, 17220.0, 537.0, 0.002913 ] }, "Pb": { "AZ": [ 5.319, 5.982, 17400.0, 586.3, 0.002871 ] }, "Bi": { "AZ": [ 5.956, 6.7, 17800.0, 677.0, 0.00266 ] }, "Po": { "AZ": [ 6.158, 6.928, 17770.0, 586.3, 0.002812 ] }, "At": { "AZ": [ 6.204, 6.979, 17950.0, 586.3, 0.002776 ] }, "Rn": { "AZ": [ 6.181, 6.954, 18120.0, 586.3, 0.002748 ] }, "Fr": { "AZ": [ 6.949, 7.82, 18300.0, 586.3, 0.002737 ] }, "Ra": { "AZ": [ 7.506, 8.448, 18480.0, 586.3, 0.002727 ] }, "Ac": { "AZ": [ 7.649, 8.609, 18660.0, 586.3, 0.002697 ] }, "Th": { "AZ": [ 7.71, 8.679, 18830.0, 586.3, 0.002641 ] }, "Pa": { "AZ": [ 7.407, 8.336, 19010.0, 586.3, 0.002603 ] }, "U": { "AZ": [ 7.29, 8.204, 19180.0, 586.3, 0.002573 ] } } // electronic stopping coefficients from Berger et al. (1991) const icru_table = { "H": { "ICRU": [ 1.254, 1.44, 242.6, 12000.0, 0.1159 ] }, "He": { "ICRU": [ 1.229, 1.397, 484.5, 5873.0, 0.05225 ] }, "Li": { "ICRU": [ 1.411, 1.6, 725.6, 3013.0, 0.04578 ] }, "Be": { "ICRU": [ 2.248, 2.59, 966.0, 153.8, 0.03475 ] }, "B": { "ICRU": [ 2.474, 2.815, 1206.0, 1060.0, 0.02855 ] }, "C": { "ICRU": [ 2.2977695717982596, 2.601, 1701.0, 1279.0, 0.01638 ] }, "N": { "ICRU": [ 2.954, 3.35, 1683.0, 1900.0, 0.02513 ] }, "O": { "ICRU": [ 2.652, 3.0, 1920.0, 2000.0, 0.0223 ] }, "F": { "ICRU": [ 2.085, 2.352, 2157.0, 2634.0, 0.01816 ] }, "Ne": { "ICRU": [ 1.951, 2.199, 2393.0, 2699.0, 0.01568 ] }, "Na": { "ICRU": [ 2.542, 2.869, 2628.0, 1854.0, 0.01472 ] }, "Mg": { "ICRU": [ 3.791, 4.293, 2862.0, 1009.0, 0.01397 ] }, "Al": { "ICRU": [ 4.154, 4.739, 2766.0, 164.5, 0.02023 ] }, "Si": { "ICRU": [ 4.914, 5.598, 3193.0, 232.7, 0.01419 ] }, "P": { "ICRU": [ 3.232, 3.647, 3561.0, 1560.0, 0.01267 ] }, "S": { "ICRU": [ 3.447, 3.891, 3792.0, 1219.0, 0.01211 ] }, "Cl": { "ICRU": [ 5.301, 6.008, 3969.0, 645.1, 0.01183 ] }, "Ar": { "ICRU": [ 5.731, 6.5, 4253.0, 530.0, 0.01123 ] }, "K": { "ICRU": [ 5.152, 5.833, 4482.0, 545.7, 0.01129 ] }, "Ca": { "ICRU": [ 5.521, 6.252, 4710.0, 553.3, 0.01112 ] }, "Sc": { "ICRU": [ 5.201, 5.884, 4938.0, 560.9, 0.009995 ] }, "Ti": { "ICRU": [ 4.858, 5.489, 5260.0, 651.1, 0.00893 ] }, "V": { "ICRU": [ 4.479, 5.055, 5391.0, 952.3, 0.009117 ] }, "Cr": { "ICRU": [ 3.983, 4.489, 5616.0, 1336.0, 0.008413 ] }, "Mn": { "ICRU": [ 3.469, 3.907, 5725.0, 1461.0, 0.008829 ] }, "Fe": { "ICRU": [ 3.519, 3.963, 6065.0, 1243.0, 0.007782 ] }, "Co": { "ICRU": [ 3.14, 3.535, 6288.0, 1372.0, 0.007361 ] }, "Ni": { "ICRU": [ 3.553, 4.004, 6205.0, 555.1, 0.008763 ] }, "Cu": { "ICRU": [ 3.696, 4.194, 4649.0, 81.13, 0.02242 ] }, "Zn": { "ICRU": [ 4.21, 4.75, 6953.0, 295.2, 0.006809 ] }, "Ga": { "ICRU": [ 5.041, 5.697, 7173.0, 202.6, 0.006725 ] }, "Ge": { "ICRU": [ 5.554, 6.3, 6496.0, 110.0, 0.009689 ] }, "As": { "ICRU": [ 5.323, 6.012, 7611.0, 292.5, 0.006447 ] }, "Se": { "ICRU": [ 5.874, 6.656, 7395.0, 117.5, 0.007684 ] }, "Br": { "ICRU": [ 6.658, 7.536, 7694.0, 222.3, 0.006509 ] }, "Kr": { "ICRU": [ 6.413, 7.24, 11850.0, 153.7, 0.00288 ] }, "Rb": { "ICRU": [ 5.694, 6.429, 8478.0, 292.9, 0.006087 ] }, "Sr": { "ICRU": [ 6.339, 7.159, 8693.0, 330.3, 0.006003 ] }, "Y": { "ICRU": [ 6.407, 7.234, 8907.0, 367.8, 0.005889 ] }, "Zr": { "ICRU": [ 6.734, 7.603, 9120.0, 405.2, 0.005765 ] }, "Nb": { "ICRU": [ 6.901, 7.791, 9333.0, 442.7, 0.005587 ] }, "Mo": { "ICRU": [ 6.424, 7.248, 9545.0, 480.2, 0.005376 ] }, "Tc": { "ICRU": [ 6.799, 7.671, 9756.0, 517.6, 0.005315 ] }, "Ru": { "ICRU": [ 6.109, 6.887, 9966.0, 555.1, 0.005151 ] }, "Rh": { "ICRU": [ 5.924, 6.677, 10180.0, 592.5, 0.004919 ] }, "Pd": { "ICRU": [ 5.238, 5.9, 10380.0, 630.0, 0.004758 ] }, "Ag": { "ICRU": [ 5.345, 6.038, 6790.0, 397.8, 0.01676 ] }, "Cd": { "ICRU": [ 5.814, 6.554, 10800.0, 355.5, 0.004626 ] }, "In": { "ICRU": [ 6.229, 7.024, 11010.0, 370.9, 0.00454 ] }, "Sn": { "ICRU": [ 6.409, 7.227, 11210.0, 386.4, 0.004474 ] }, "Sb": { "ICRU": [ 7.5, 8.48, 8608.0, 348.0, 0.009074 ] }, "Te": { "ICRU": [ 6.979, 7.871, 11620.0, 392.4, 0.004402 ] }, "I": { "ICRU": [ 7.725, 8.716, 11830.0, 394.8, 0.004376 ] }, "Xe": { "ICRU": [ 8.337, 9.425, 10510.0, 269.6, 0.006206 ] }, "Cs": { "ICRU": [ 7.287, 8.218, 12230.0, 399.7, 0.004447 ] }, "Ba": { "ICRU": [ 7.899, 8.911, 12430.0, 402.1, 0.004511 ] }, "La": { "ICRU": [ 8.041, 9.071, 12630.0, 404.5, 0.00454 ] }, "Ce": { "ICRU": [ 7.488, 8.444, 12830.0, 406.9, 0.00442 ] }, "Pr": { "ICRU": [ 7.291, 8.219, 13030.0, 409.3, 0.004298 ] }, "Nd": { "ICRU": [ 7.098, 8.0, 13230.0, 411.8, 0.004182 ] }, "Pm": { "ICRU": [ 6.909, 7.786, 13430.0, 414.2, 0.004058 ] }, "Sm": { "ICRU": [ 6.728, 7.58, 13620.0, 416.6, 0.003976 ] }, "Eu": { "ICRU": [ 6.551, 7.38, 13820.0, 419.0, 0.003877 ] }, "Gd": { "ICRU": [ 6.739, 7.592, 14020.0, 421.4, 0.003863 ] }, "Tb": { "ICRU": [ 6.212, 6.996, 14210.0, 423.9, 0.003725 ] }, "Dy": { "ICRU": [ 5.517, 6.21, 14400.0, 426.3, 0.003632 ] }, "Ho": { "ICRU": [ 5.22, 5.874, 14600.0, 428.7, 0.003498 ] }, "Er": { "ICRU": [ 5.071, 5.706, 14790.0, 433.0, 0.003405 ] }, "Tm": { "ICRU": [ 4.926, 5.542, 14980.0, 433.5, 0.003342 ] }, "Yb": { "ICRU": [ 4.788, 5.386, 15170.0, 435.9, 0.003292 ] }, "Lu": { "ICRU": [ 4.893, 5.505, 15360.0, 438.4, 0.003243 ] }, "Hf": { "ICRU": [ 5.028, 5.657, 15550.0, 440.8, 0.003195 ] }, "Ta": { "ICRU": [ 4.738, 5.329, 15740.0, 443.2, 0.003186 ] }, "W": { "ICRU": [ 4.587, 5.16, 15410.0, 415.3, 0.003406 ] }, "Re": { "ICRU": [ 5.201, 5.851, 16120.0, 441.6, 0.003122 ] }, "Os": { "ICRU": [ 5.071, 5.704, 16300.0, 440.9, 0.003082 ] }, "Ir": { "ICRU": [ 4.946, 5.563, 16490.0, 440.1, 0.002965 ] }, "Pt": { "ICRU": [ 4.477, 5.034, 16670.0, 439.3, 0.002871 ] }, "Au": { "ICRU": [ 4.844, 5.458, 7852.0, 975.8, 0.02077 ] }, "Hg": { "ICRU": [ 4.307, 4.843, 17040.0, 487.8, 0.002882 ] }, "Tl": { "ICRU": [ 4.723, 5.311, 17220.0, 537.0, 0.002913 ] }, "Pb": { "ICRU": [ 5.319, 5.982, 17400.0, 586.3, 0.002871 ] }, "Bi": { "ICRU": [ 5.956, 6.7, 17800.0, 677.0, 0.00266 ] }, "Po": { "ICRU": [ 6.158, 6.928, 17770.0, 586.3, 0.002812 ] }, "At": { "ICRU": [ 6.203, 6.979, 17950.0, 586.3, 0.002776 ] }, "Rn": { "ICRU": [ 6.181, 6.954, 18120.0, 586.3, 0.002748 ] }, "Fr": { "ICRU": [ 6.949, 7.82, 18300.0, 586.3, 0.002737 ] }, "Ra": { "ICRU": [ 7.506, 8.448, 18480.0, 586.3, 0.002727 ] }, "Ac": { "ICRU": [ 7.648, 8.609, 18660.0, 586.3, 0.002697 ] }, "Th": { "ICRU": [ 7.711, 8.679, 18830.0, 586.3, 0.002641 ] }, "Pa": { "ICRU": [ 7.407, 8.336, 19010.0, 586.3, 0.002603 ] }, "U": { "ICRU": [ 7.29, 8.204, 19180.0, 586.3, 0.002673 ] } } // Electronic stopping coefficients derived from analyzing the IAEA database // https://www-nds.iaea.org/stopping/ // 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) { // Select which tabulation to use for the Varelas-Biersack parameterization // of electronic stopping cross sections for proton-like projectiles // implanted in elemental targets. // flag = 1: use coefficients from Anderson & Ziegler (1977). if (flag == 1) { return elemPars[Element].AZ; } // flag = 2: use coefficients from ICRU Report 49 (1973). if (flag == 2) { return elemPars[Element].ICRU; } // flag = 3: use coefficients from McFadden et al. (2023) and McFadden et al. (unpublished). // // NOTE: these values were derived from up-to-date stopping data found inthe // IAEA's database of electronic stopping cross sections // (https://www-nds.iaea.org/stopping/). // For further details on their determination, see, e.g.: // Appendix A in McFadden at al., Phys. Rev. Applied 19, 044018 (2023). // https://doi.org/10.1103/PhysRevApplied.19.044018 if (flag == 3 && elemPars[Element].IAEA.length == 5) { return elemPars[Element].IAEA; // in the event that updated coefficients are unavailable for given element // fall back to using values from ICRU Report 49 } else { return elemPars[Element].ICRU; } } let transientWarningTimeout = null; function showTransientWarning(message, targetElement, duration = 4000) { let warning = document.getElementById('transientWarning'); if (!warning) { warning = document.createElement('div'); warning.id = 'transientWarning'; warning.className = 'transient-warning'; document.body.appendChild(warning); } warning.textContent = message; if (targetElement) { const rect = targetElement.getBoundingClientRect(); warning.style.left = `${Math.max(12, rect.left + window.scrollX)}px`; warning.style.top = `${rect.bottom + window.scrollY + 8}px`; } warning.classList.add('visible'); if (transientWarningTimeout) { clearTimeout(transientWarningTimeout); } transientWarningTimeout = setTimeout(() => { warning.classList.remove('visible'); }, duration); } 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 (const key of Object.keys(layer_formula)) { const amount = Number(layer_formula[key]); if (isFinite(amount) && amount > 0) { stoichiometry_sum += amount; } } // estimate the density from additive elemental molar volumes: // rho ~= total molar mass / total molar volume let total_molar_mass = 0; let total_molar_volume = 0; for (const key of Object.keys(layer_formula)) { const amount = Number(layer_formula[key]); if (!isFinite(amount) || amount <= 0) { continue; } if (!elemPars[key] || !isFinite(elemPars[key].rho) || !isFinite(elemPars[key].A) || elemPars[key].rho <= 0) { continue; } total_molar_mass += amount * elemPars[key].A; total_molar_volume += amount * (elemPars[key].A / elemPars[key].rho); } rho = 0; if (total_molar_volume > 0) { rho = total_molar_mass / total_molar_volume; } if (rho > 0) { showTransientWarning("Warning: Estimated density from additive elemental molar volumes; please verify manually.", document.getElementById(rhoLi)); } } } // 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; } // Get the stopping power coefficient (SPC) flag All["flagSPC"] = document.getElementById("flagSPC").value; // 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 { 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'); win.document.write('
'); win.document.write(''); 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'); win.document.write('
'); win.document.write(''); 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'); win.document.write('
'); win.document.write(''); 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