modified: TrackRecon.C
new folder: cross_section, this folder allows for cross section calculations for the ANASEN data, a readme and some example files are provided modified: run_tr.sh
This commit is contained in:
parent
8c231120d8
commit
d63a422a41
125
TrackRecon.C
125
TrackRecon.C
|
|
@ -24,6 +24,8 @@ Int_t colors[40] = {
|
|||
#include <TRandom3.h>
|
||||
#include <TSpline.h>
|
||||
#include <TSystem.h> // gSystem->mkdir for the pc_calib_raw/ output directory
|
||||
#include <TCutG.h> // p/alpha graphical cuts (classifySiPc)
|
||||
#include <TFile.h>
|
||||
|
||||
#include <cmath> // std::floor/fabs/lround for vertexZSliceTag()
|
||||
#include <fstream>
|
||||
|
|
@ -102,29 +104,39 @@ inline bool siPcCoincident(double t_si, double t_pc)
|
|||
return dt > kSiPcDtMin && dt < kSiPcDtMax;
|
||||
}
|
||||
|
||||
// PC anode dE gate, gas-region proton/alpha separation for the p(a,a)p elastic
|
||||
// branches (protonAlphaElastic_core, formerly protonMiscHistograms /
|
||||
// protonMiscHistograms_sx3). Rough,
|
||||
// energy-independent threshold read off Calib_dE_AnodeE_vs_QQQE (calibrated
|
||||
// anode dE, MeV, vs QQQ/SX3 E): proton and alpha loci are well separated below
|
||||
// ~5-6 MeV Si energy but converge at high Si energy/high dE (the bright
|
||||
// corner near the top of the plot) -- events there are NOT reliably
|
||||
// classified by a flat cut. Revisit with a TCutG/polygon if that corner
|
||||
// matters. anodeE_MeV < 0 means no valid per-wire calibration was available
|
||||
// for this hit, not "low dE" -- kUnknown must be handled as its own case,
|
||||
// never silently folded into kProton.
|
||||
constexpr double kProtonAlphaAnodeDeGate_MeV = 0.045;
|
||||
// |Ex| window that counts a p + 4He hit as elastic, for the _exgate vertex-z / theta_cm histograms.
|
||||
constexpr double kElasticExGate_MeV = 1.0;
|
||||
enum class SiPcPid
|
||||
{
|
||||
kUnknown = -1,
|
||||
kProton = 0,
|
||||
kAlpha = 1
|
||||
kAlpha = 1,
|
||||
kMaybeProton = 2 // graphical cuts only: the proton band below E_Si 5 MeV
|
||||
};
|
||||
inline SiPcPid classifyByAnodeDe(double anodeE_MeV)
|
||||
struct PidCuts
|
||||
{
|
||||
TCutG *alpha = nullptr;
|
||||
TCutG *proton = nullptr;
|
||||
TCutG *maybep = nullptr;
|
||||
};
|
||||
PidCuts pidCutsQQQ, pidCutsSX3;
|
||||
bool pidUseCuts = false; // true once Begin() has found all six pid_* cuts in CUTLIST
|
||||
|
||||
inline SiPcPid classifySiPc(double siE_MeV, double anodeE_MeV, bool isQQQ)
|
||||
{
|
||||
if (anodeE_MeV < 0.0)
|
||||
return SiPcPid::kUnknown;
|
||||
return (anodeE_MeV < kProtonAlphaAnodeDeGate_MeV) ? SiPcPid::kProton : SiPcPid::kAlpha;
|
||||
if (!pidUseCuts)
|
||||
return (anodeE_MeV < kProtonAlphaAnodeDeGate_MeV) ? SiPcPid::kProton : SiPcPid::kAlpha;
|
||||
const PidCuts &cuts = isQQQ ? pidCutsQQQ : pidCutsSX3;
|
||||
if (cuts.alpha->IsInside(siE_MeV, anodeE_MeV))
|
||||
return SiPcPid::kAlpha;
|
||||
if (cuts.proton->IsInside(siE_MeV, anodeE_MeV))
|
||||
return SiPcPid::kProton;
|
||||
if (cuts.maybep->IsInside(siE_MeV, anodeE_MeV))
|
||||
return SiPcPid::kMaybeProton;
|
||||
return SiPcPid::kUnknown;
|
||||
}
|
||||
|
||||
inline TVector3 beamAxisOrigin()
|
||||
|
|
@ -588,7 +600,39 @@ void TrackRecon::Begin(TTree * /*tree*/)
|
|||
std::cerr << "CUTLIST=" << getenv("CUTLIST")
|
||||
<< " set but no cut named 'simcprfgate2' found in it -- Gate2 Si-MCP/RF gating disabled" << std::endl;
|
||||
}
|
||||
|
||||
const char *pidNames[6] = {"pid_alpha_qqq", "pid_proton_qqq", "pid_maybep_qqq",
|
||||
"pid_alpha_sx3", "pid_proton_sx3", "pid_maybep_sx3"};
|
||||
TCutG *pidFound[6] = {};
|
||||
int pidListed = 0;
|
||||
for (int i = 0; i < 6; ++i)
|
||||
{
|
||||
try
|
||||
{
|
||||
pidFound[i] = plotter->FindCut(pidNames[i]);
|
||||
++pidListed;
|
||||
}
|
||||
catch (const std::out_of_range &)
|
||||
{
|
||||
}
|
||||
}
|
||||
if (pidListed > 0)
|
||||
{
|
||||
if (pidListed < 6 || std::find(pidFound, pidFound + 6, nullptr) != pidFound + 6)
|
||||
{
|
||||
std::cerr << "CUTLIST=" << getenv("CUTLIST") << ": needs all six pid_{alpha,proton,maybep}_{qqq,sx3}, each a "
|
||||
<< "file with a TCutG named CUTG -- stopping" << std::endl;
|
||||
gSystem->Exit(1);
|
||||
}
|
||||
pidCutsQQQ = {pidFound[0], pidFound[1], pidFound[2]};
|
||||
pidCutsSX3 = {pidFound[3], pidFound[4], pidFound[5]};
|
||||
pidUseCuts = true;
|
||||
}
|
||||
}
|
||||
if (pidUseCuts)
|
||||
std::cout << "p/alpha PID: graphical cuts pid_{alpha,proton,maybep}_{qqq,sx3} from CUTLIST=" << getenv("CUTLIST") << std::endl;
|
||||
else
|
||||
std::cout << "p/alpha PID: flat anode gate " << kProtonAlphaAnodeDeGate_MeV << " MeV (no pid_* cuts in CUTLIST)" << std::endl;
|
||||
|
||||
if (getenv("reactiondata"))
|
||||
{
|
||||
|
|
@ -1084,9 +1128,8 @@ inline void pcEnergyCalibrationAccumulateProton(const std::vector<Event> &PC_Eve
|
|||
if (!(pcevent.multi1 >= 1 && pcevent.multi2 >= 1))
|
||||
return;
|
||||
if (!(pcevent.Energy2 > 1400)) // cathode-tagged alpha; intentionally NOT anode-dE
|
||||
return; // PID (classifyByAnodeDe) -- this function derives the
|
||||
// anode calibration those thresholds depend on, so it
|
||||
// needs a selection that doesn't presuppose it.
|
||||
return;
|
||||
|
||||
if (TMath::Abs(sievent.pos.DeltaPhi(pcevent.pos)) > phi_win)
|
||||
return;
|
||||
|
||||
|
|
@ -4158,7 +4201,9 @@ void protonAlphaElastic_core(HistPlotter *plotter, const std::vector<Event> &Si_
|
|||
{
|
||||
// const std::string ejtag = (alphaHyp && sievent.Energy1 < 5) ? "_a" : "_p";
|
||||
std::string ejtag;
|
||||
if (alphaHyp && sievent.Energy1 < 5)
|
||||
if (pidUseCuts)
|
||||
ejtag = alphaHyp ? "_a" : (pid == SiPcPid::kMaybeProton ? "_maybep" : "_p");
|
||||
else if (alphaHyp && sievent.Energy1 < 5)
|
||||
ejtag = "_a";
|
||||
else if (sievent.Energy1 >= 5.0 && sievent.Energy1 < 7.0)
|
||||
ejtag = "_p";
|
||||
|
|
@ -4185,6 +4230,25 @@ void protonAlphaElastic_core(HistPlotter *plotter, const std::vector<Event> &Si_
|
|||
plotter->Fill2D(rx + "_Ex_vs_X" + ejtag + sfx, 100, -100, 120, 800, -6, 15, sievent.pos.X(), Ex, pmlabel);
|
||||
plotter->Fill2D(rx + "_Ex_vs_Y" + ejtag + sfx, 100, -100, 120, 800, -6, 15, sievent.pos.Y(), Ex, pmlabel);
|
||||
|
||||
{
|
||||
const double thetaCM = alphaHyp ? 180.0 - 2.0 * theta * 180 / M_PI
|
||||
: (theta + TMath::ASin(TMath::Sin(theta) * mass_1H / mass_4He)) * 180 / M_PI;
|
||||
const bool exGate = TMath::Abs(Ex) < kElasticExGate_MeV;
|
||||
auto fillZTheta = [&](const std::string &variant)
|
||||
{
|
||||
plotter->Fill2D(rx + "_VertexZ_vs_ThetaCM" + variant + ejtag + sfx, 800, -400, 400, 180, 0, 180, vertex_z, thetaCM, pmlabel);
|
||||
};
|
||||
fillZTheta("");
|
||||
if (exGate)
|
||||
fillZTheta("_exgate");
|
||||
if (hasCathode)
|
||||
{
|
||||
fillZTheta("_cath");
|
||||
if (exGate)
|
||||
fillZTheta("_cath_exgate");
|
||||
}
|
||||
}
|
||||
|
||||
if (isQQQ)
|
||||
{
|
||||
const std::string qtag = "_q" + std::to_string(sievent.ch1 / 16);
|
||||
|
|
@ -4276,10 +4340,23 @@ void protonAlphaElastic_core(HistPlotter *plotter, const std::vector<Event> &Si_
|
|||
}
|
||||
};
|
||||
|
||||
if (pid != SiPcPid::kAlpha)
|
||||
fillHypothesis(false); // proton, or PID unavailable (legacy default)
|
||||
if (pid == SiPcPid::kAlpha && sievent.Energy1 < 6.2)
|
||||
fillHypothesis(true);
|
||||
if (pidUseCuts)
|
||||
{
|
||||
// Graphical cuts: each hit as what the cuts call it (p and maybe-p both with proton kinematics, filed apart);
|
||||
// kUnknown (in no gate, or no anode calibration) is filled as nothing -- counted in elastic_pidUnknown.
|
||||
if (pid == SiPcPid::kProton || pid == SiPcPid::kMaybeProton)
|
||||
fillHypothesis(false);
|
||||
else if (pid == SiPcPid::kAlpha)
|
||||
fillHypothesis(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Old flat gate, kept as it was: kUnknown is filled as a proton (legacy default).
|
||||
if (pid != SiPcPid::kAlpha)
|
||||
fillHypothesis(false);
|
||||
if (pid == SiPcPid::kAlpha && sievent.Energy1 < 6.2)
|
||||
fillHypothesis(true);
|
||||
}
|
||||
};
|
||||
|
||||
// --- a1c1/a1c2 (multi1==1) and a2c1/a2c2 (multi1==2), from PC_Events. The
|
||||
|
|
@ -4306,7 +4383,7 @@ void protonAlphaElastic_core(HistPlotter *plotter, const std::vector<Event> &Si_
|
|||
plotter->Fill1D(rx + "_dt_Cathode" + sfx, 600, -2000, 2000, pcevent.Time2 - sievent.Time1, misclabel);
|
||||
|
||||
double anodeE_MeV = (pcevent.Anodech >= 0 && pcevent.Anodech < 24) ? pcevent.Energy1MeV : -1.0;
|
||||
SiPcPid pid = classifyByAnodeDe(anodeE_MeV);
|
||||
SiPcPid pid = classifySiPc(sievent.Energy1, anodeE_MeV, isQQQ);
|
||||
if (pid == SiPcPid::kUnknown)
|
||||
plotter->Fill1D(rx + "_pidUnknown" + sfx, 2, 0, 2, 1.0, misclabel);
|
||||
|
||||
|
|
@ -4448,7 +4525,7 @@ void protonAlphaElastic_core(HistPlotter *plotter, const std::vector<Event> &Si_
|
|||
if (!anyValidWire)
|
||||
anodeE_MeV_a0 = -1.0;
|
||||
|
||||
SiPcPid pid = classifyByAnodeDe(anodeE_MeV_a0);
|
||||
SiPcPid pid = classifySiPc(sievent.Energy1, anodeE_MeV_a0, isQQQ);
|
||||
if (pid == SiPcPid::kUnknown)
|
||||
plotter->Fill1D(rx + "_pidUnknown" + sfx, 2, 0, 2, 1.0, misclabel);
|
||||
|
||||
|
|
|
|||
197
cross_section/README.md
Executable file
197
cross_section/README.md
Executable file
|
|
@ -0,0 +1,197 @@
|
|||
# Cross-section pipeline (ANASEN active target)
|
||||
|
||||
This folder turns data into a cross section for any reaction in the ANASEN active target. There are three steps,
|
||||
one script each, and one config file per study shared by all three:
|
||||
|
||||
```
|
||||
root -l -b -q 'extract_yields.C+("examples/27Al_ap_runA.toml")' # 1. ROOT -> yields_<det>.csv
|
||||
~/myenv/bin/python -B geometric_efficiency.py examples/27Al_ap_runA.toml # 2. detectors.py -> eps_<det>.csv ~10 s
|
||||
~/myenv/bin/python -B cross_section.py examples/27Al_ap_runA.toml # 3. -> xs_<det>.csv, xs.png ~3 s
|
||||
```
|
||||
|
||||
Run them in WSL from this folder (`~/ANASEN_analysis/cross_section`). Step 1 needs ROOT; steps 2 and 3 need
|
||||
`~/myenv/bin/python`, not ROOT.
|
||||
|
||||
| file | what it does |
|
||||
|---|---|
|
||||
| `extract_yields.C` | **Step 1, the only step that reads the data.** It reads a TH1/TH2, or fills a histogram from a TTree with a cut, and writes a plain CSV histogram. |
|
||||
| `geometric_efficiency.py` | Step 2: geometric efficiency per bin, a toy Monte Carlo of the reaction, with every hit rule taken from `detectors.py`. |
|
||||
| `detectors.py` | **The detectors as they are now** (Run A): QQQ3, the four analysed SX3s, the counter, the beam tube and the PCB hole, plus the hit rules. To change the geometry, edit this file. |
|
||||
| `cross_section.py` | Step 3: reads only CSVs (the yields and an efficiency) and computes σ(E_cm) or dσ/dΩ(θ_cm). |
|
||||
| `common.py` | What the three scripts share: the config, the beam track E(z), the bins. |
|
||||
| `examples/` | One commented config per study: `27Al_ap_runA.toml` and `paap_ta_runs_hist.toml`. |
|
||||
| `examples/reference/` | Barnard 1964 (EXFOR A1113) for p + ⁴He. |
|
||||
| `inputs/` | The beam track (`beam_tracks.csv`) and the TALYS states (`talys_27Al_ap.csv`). The p + ⁴He track is read from `../eloss_calculations/`. |
|
||||
| `out/<study>/` | Each study's outputs: `yields_<det>.csv`, `eps_<det>.csv`, `xs_<det>.csv`, `xs.png`. |
|
||||
|
||||
## Starting a new study
|
||||
|
||||
1. Copy the closest example in `examples/` (excitation function: `27Al_ap_runA.toml`; angular distribution:
|
||||
`paap_ta_runs_hist.toml`) and give it its own `out_dir`.
|
||||
2. Fill in `[extract]` for your histogram or tree, then run step 1 and look at `yields_<det>.csv`.
|
||||
3. Fill in `[reaction]`, `[beam]` and `[bins]`, then run step 2. Check that `eps_<det>.csv` is non-zero where you
|
||||
expect events.
|
||||
4. Fill in `[target]`, `[acceptance]` and any `[[reference]]`, then run step 3.
|
||||
|
||||
If the detectors have changed, edit `detectors.py`, not the configs.
|
||||
|
||||

|
||||
|
||||
## The formula
|
||||
|
||||
| mode | result | formula |
|
||||
|---|---|---|
|
||||
| `excitation` | σ(E_cm), mb | Y / (N_b · n · dz · ε) |
|
||||
| `angular` | dσ/dΩ(θ_cm) in one E_cm (or z) window, mb/sr | Y / (N_b · n · dz · ε · ΔΩ) |
|
||||
|
||||
- **Y:** the yield in the bin.
|
||||
- **N_b:** the number of beam particles.
|
||||
- **n:** target atoms per cm² per mm of path.
|
||||
- **dz:** the length of beam path over which the beam's E_cm lies in the bin, read off the beam track E(z).
|
||||
- **ε:** the efficiency of the bin.
|
||||
|
||||
## Step 1: `extract_yields.C`, data to CSV
|
||||
|
||||
`[extract] source` says where the events are:
|
||||
- `"hist"`: a TH1 or TH2 in a ROOT file. A TH2 is projected on the axis that holds `variable`, or kept 2D with
|
||||
`angle_axis` for the angular mode.
|
||||
- `"tree"`: a ROOT TTree (`file` may be a glob or a list of runs), filled into `bins` after `cut`.
|
||||
|
||||
Cuts use `and` / `or` (the macro turns them into `&&` / `||`) and ROOT's TTree::Draw syntax.
|
||||
|
||||
**Histogram paths** are `"folder/name"`.
|
||||
- **They are case-sensitive.** Production files of different vintages spell the detector differently: the 27Al
|
||||
outputs use `_m27Alax+misc_qqq/...`, the proton runs' `Output_p/Al_protons.root` uses `elastic+misc_QQQ_a/...`.
|
||||
Put the spelling in `[det_vars]`:
|
||||
```toml
|
||||
dets = ["qqq", "sx3"] # the names detectors.py knows
|
||||
[det_vars.qqq]
|
||||
DET = "QQQ"
|
||||
[det_vars.sx3]
|
||||
DET = "SX3"
|
||||
[extract]
|
||||
hist = "elastic+misc_{DET}_a/elastic_VertexReconZ_a_{DET}"
|
||||
```
|
||||
- **A name that itself contains `/`** (e.g. `dE3_E_AnodeQQQR_A1C2_(vertex_fix_z/100)=0.000000`) is found too.
|
||||
- **If the path doesn't exist,** the macro stops and names the closest histogram paths in the file.
|
||||
|
||||
The CSV it writes, `<out_dir>/yields_<det>.csv`, is the hand-off between the steps. `cross_section.py` reads nothing
|
||||
else, so a yield made any other way works too as long as it is in this format:
|
||||
|
||||
```
|
||||
1D: <var>_lo, <var>_hi, counts, variance
|
||||
2D: <var>_lo, <var>_hi, theta_cm_lo, theta_cm_hi, counts, variance (angular mode)
|
||||
```
|
||||
|
||||
`<var>` is `z` (vertex z, mm), `e_beam` (MeV) or `ecm` (MeV). The bins may be finer than the analysis bins and need
|
||||
not line up with them. Step 3 shares each one out by overlap.
|
||||
|
||||
It is run like this:
|
||||
|
||||
```
|
||||
root -l -b -q 'extract_yields.C+("examples/27Al_ap_runA.toml")'
|
||||
root -l -b -q 'extract_yields.C+("examples/27Al_ap_runA.toml", "out/elsewhere")' # optional output folder
|
||||
```
|
||||
|
||||
- **Trees:** it fills the histogram with `TTree::Draw` on a `TChain`, so `file` may be a glob or a list of runs.
|
||||
- **Cuts:** write them with `and` / `or` (e.g. `"det == 1 and e_si > 0.5"`). The macro turns them into `&&` / `||`.
|
||||
- **TOML:** the macro has a small reader that handles only what these configs use: strings, numbers, one-line lists
|
||||
and `{start, stop, step}` tables. It stops with an error on anything else.
|
||||
- **Errors:** a missing file or tree, or a tree with no entries, stops it with exit code 1 rather than writing zeros.
|
||||
- **One edge case:** an entry exactly on a tree histogram's last upper edge goes to ROOT's overflow.
|
||||
|
||||
## Step 2: `geometric_efficiency.py`, ε from the detector geometry
|
||||
|
||||
The toy runs once per bin:
|
||||
- vertices uniform over the bin's path (angular mode: over the window);
|
||||
- beam energy at each vertex from the nominal track;
|
||||
- the residual state drawn from fixed weights, or from TALYS state cross sections at the bin's E_cm;
|
||||
- isotropic CM emission (angular mode: inside the θ_cm bin);
|
||||
- relativistic two-body kinematics and straight tracks.
|
||||
|
||||
The particle the silicon sees can be the ejectile or the recoil (`detect`). θ_cm is always the ejectile's, so with
|
||||
`detect = "recoil"` the bins are still in the ejectile's CM angle. For p + ⁴He that is the proton's angle, Barnard's
|
||||
convention, which TrackRecon's `elastic_VertexZ_vs_ThetaCM` histograms also use. The output has one column per
|
||||
condition, each times the azimuthal coverage:
|
||||
|
||||
| column | the particle... |
|
||||
|---|---|
|
||||
| `eps_si` | reaches the analysed silicon (solid angle) |
|
||||
| `eps_si_thr` | ...and has a vertex energy above the Si threshold. This is the ch5 "solid angle" convention: a kinematic cut, not geometry. |
|
||||
| `eps_counter` | `eps_si`, and it crosses the guard, anode and cathode radii inside the counter |
|
||||
| **`eps_geometric`** | `eps_counter`, and it clears the beam tube and the PCB hole. **This is the geometric efficiency.** |
|
||||
|
||||
Each column has a Monte Carlo error, `<column>_rel_err`. Gas energy loss, Si thresholds after the gas and the counter's
|
||||
deposit threshold are **not** included, because they are not geometry. That is why the adopted `eps_tube` of
|
||||
`../scratch/xs_27Al_lowE_2026-10-15` is lower than `eps_geometric`; to use it instead, see the commented
|
||||
`[acceptance]` block in the example. The angular distribution is isotropic.
|
||||
|
||||
## Step 3: `cross_section.py`
|
||||
|
||||
`[acceptance] source` picks ε:
|
||||
- `"geometric"`: step 2's file; `column` chooses which efficiency.
|
||||
- `"csv"`: any file, matched on a bin edge or interpolated.
|
||||
- `"value"`: one number for every bin.
|
||||
- `"none"`: ε = 1, which gives σ_app.
|
||||
|
||||
`[[acceptance.extra]]` multiplies in further factors, such as an intrinsic efficiency. The output `xs_<det>.csv` keeps
|
||||
every intermediate number: the bins, z ranges, dz, counts, σ_app, ε, σ and its errors (stat, ε, total), and the
|
||||
references. The header lines record every input. The N_b and n uncertainties are a common scale, so the header gives
|
||||
them as a percentage and they stay out of the error columns.
|
||||
|
||||
## The config (TOML)
|
||||
|
||||
Paths are relative to the config file, and `~` is the home folder. `{det}` is replaced by each entry of `dets`, and
|
||||
so is every key of `[det_vars.<det>]`. Commented templates in `examples/`:
|
||||
- `27Al_ap_runA.toml`: a TH2 from the merged Run A production file, all three steps.
|
||||
- `paap_ta_runs_hist.toml`: p + ⁴He elastic **straight from a TrackRecon.C production file**, as for 27Al. It reads
|
||||
the TH2 `elastic_VertexZ_vs_ThetaCM_cath_exgate_a_<DET>` (vertex z × proton θ_cm). `protonAlphaElastic_core` fills
|
||||
that histogram since 2026-10-16 in every species folder, in four variants: all, `_cath`, `_exgate`, `_cath_exgate`.
|
||||
- Input: `~/ANASEN_analysis/Output_p/results_run022.root` (run 22 alone, run_tr.sh block 5 with CUTLIST),
|
||||
N_b = 1.35 pA × 672.65 s = 5.67 × 10⁹, vertex window z = −170 to −53 mm.
|
||||
- On 2026-10-16 the merged runs 18–22 agreed with a per-hit route to 2–4% in QQQ3 counts and about 3% in dσ/dΩ.
|
||||
|
||||
| section | used by | keys |
|
||||
|---|---|---|
|
||||
| top | all | `title`, `mode` (`excitation` / `angular`), `dets` (names in `detectors.py`: `qqq`, `sx3`), `out_dir` |
|
||||
| `[extract]` histogram | 1 | `source = "hist"`, `file`, `hist`, `variable`, `axis` (the axis holding `variable`), `angle_axis` (keep it 2D), `other_range` |
|
||||
| `[extract]` tree | 1 | `source = "tree"`, `file` (glob or list), `tree`, `variable`, `branch`, `bins`, `cut`, `weight_branch`, `angle_branch` + `angle_bins` |
|
||||
| `[reaction]` | 2, 3 | `beam_mass_u`, `target_mass_u`; for step 2 also `ejectile_mass_u`, `recoil_mass_u`, `detect`, and `states` *or* `states_csv`; optional `ecm_per_ebeam` |
|
||||
| `[beam]` | 2, 3 | track: `track_csv` + `track_e_col` (+ `nominal_e_col`, `track_z_col`), *or* `eloss_table` + `e_entrance_mev` + `z_entrance_mm`. N_b: `n_beam` *or* `charge_c` *or* `current_a` + `time_s`; `charge_state`, `n_beam_rel_err`. For Run A runs, `../runlog/beam_exposure.py` gives `n_beam` for any set of runs from the elog's cup readings |
|
||||
| `[bins]` | 2, 3 | `ecm_edges` (a list or `{start, stop, step}`); angular: `theta_edges_deg` and `window_ecm` *or* `window_z_mm` |
|
||||
| `[efficiency]` | 2 | `n_per_bin` (default 400 000), `seed` |
|
||||
| `[target]` | 3 | `pressure_torr`, `temperature_k`, `mole_fraction`, `atoms_per_molecule`, `rel_err`; *or* `n_per_cm2_per_mm` |
|
||||
| `[yield]` | 3 | `csv`: only to read yields from somewhere other than step 1's output |
|
||||
| `[acceptance]` | 3 | `source` and its keys (see above), `[[acceptance.extra]]` |
|
||||
| `[[reference]]` | 3 | `csv`, `x_col`, `y_col`, `label`, `scale`, `dets` |
|
||||
| `[plot]` | 3 | `yscale`, `xlim`, `ylim`, `xlabel`, `ylabel` |
|
||||
|
||||
## Example: p + ⁴He elastic scattering, Ta run 22 (`examples/paap_ta_runs_hist.toml`)
|
||||
|
||||
```
|
||||
root -l -b -q 'extract_yields.C+("examples/paap_ta_runs_hist.toml")'
|
||||
~/myenv/bin/python -B geometric_efficiency.py examples/paap_ta_runs_hist.toml
|
||||
~/myenv/bin/python -B cross_section.py examples/paap_ta_runs_hist.toml
|
||||
```
|
||||
|
||||
dσ/dΩ(θ_cm) from the α recoils (`detect = "recoil"`, bins in the proton's θ_cm, Barnard's convention), against
|
||||
Barnard, Jones & Weil (1964). Histogram: `elastic_VertexZ_vs_ThetaCM_cath_exgate_a_<DET>` (cathode topologies,
|
||||
graphical α cut, |E_x| < 1 MeV). The merged runs 18–22 gave QQQ3 0.44–0.54 × Barnard at 132–156°; SX3 is at 1–3%.
|
||||
Not in `detectors.py`: the Ta holder rod (~28% of the azimuth downstream of each foil) and Si thresholds after the gas.
|
||||
|
||||
## Checks (run in the Windows repo, `/mnt/c/Users/sengi/ANASEN_analysis/cross_section`; the scripts are not in this copy)
|
||||
|
||||
- 27Al(α,p), Run A: yields, dz and nominal E_cm equal the earlier study's in every bin; ε_si_thr agrees with its
|
||||
independent toy within the MC errors.
|
||||
- Synthetic events with a known σ, ε and dσ/dΩ are returned with unit-Gaussian pulls.
|
||||
- `extract_yields.C` and the Python version gave byte-identical yields on every example.
|
||||
|
||||
**Not verified:** the physics inputs are whatever the config and `detectors.py` say. The checks show the arithmetic and
|
||||
the bookkeeping are right, and that `detectors.py` reproduces the geometry of `anasen_detectability.py`. They cannot
|
||||
show that the geometry, a track or an N_b is right. In particular:
|
||||
- The dE/dx scale of a `.dat` table is not written in the file. The live 250 Torr / 3% tables were regenerated on
|
||||
2026-10-16 and match the 0.962 track to 3 keV.
|
||||
- `detectors.py` gives QQQ3 0.967 of the azimuth, but TrackRecon drops QQQ pixels without a calibration, which leaves
|
||||
about 0.675. QQQ3 ε is therefore about 1.4× too high, and its cross sections about 1.4× too low.
|
||||
- Where only a sliver of solid angle is open, ε is tiny and σ explodes. Example: QQQ3 at E_cm 5.4 MeV, ε = 1.5 × 10⁻⁵,
|
||||
behind the beam tube. The error bar shows it; no ε cut is applied.
|
||||
183
cross_section/common.py
Executable file
183
cross_section/common.py
Executable file
|
|
@ -0,0 +1,183 @@
|
|||
"""Shared by extract_yields.py, geometric_efficiency.py and cross_section.py: the config, the beam track, the bins.
|
||||
|
||||
The cross section in this active target:
|
||||
sigma(E_cm) = Y / (N_b * n * dz * eps) mode = "excitation"
|
||||
dsigma/dOmega(th) = Y / (N_b * n * dz * eps * dOmega) mode = "angular"
|
||||
The beam loses energy along z, so a vertex at z means the reaction happened at the beam energy E(z) there.
|
||||
An E_cm bin is the stretch of beam path dz over which the beam's E_cm lies in the bin.
|
||||
"""
|
||||
import os
|
||||
import tomllib
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
|
||||
# ============================================================ config
|
||||
|
||||
def read_config(config_file):
|
||||
"""Read the TOML config. Returns the config and a function that turns paths in it into absolute paths
|
||||
(relative paths are relative to the config file's folder)."""
|
||||
config_file = Path(config_file).resolve()
|
||||
with open(config_file, "rb") as f:
|
||||
config = tomllib.load(f)
|
||||
|
||||
def full_path(p):
|
||||
p = os.path.expanduser(str(p)) # "~/..." is the home folder, as in a shell
|
||||
if p.startswith("/") or Path(p).is_absolute():
|
||||
return p
|
||||
return str((config_file.parent / p).resolve())
|
||||
|
||||
return config, full_path
|
||||
|
||||
|
||||
def config_for_detector(config, det):
|
||||
"""Copy of the config with "{det}" (and any key of [det_vars.<det>]) replaced in every string.
|
||||
This lets one config serve several detectors, e.g. hist = "..._{det}"."""
|
||||
replacements = {"det": det}
|
||||
replacements.update(config.get("det_vars", {}).get(det, {}))
|
||||
|
||||
def replace(value):
|
||||
if isinstance(value, str):
|
||||
for key, new in replacements.items():
|
||||
value = value.replace("{" + key + "}", str(new))
|
||||
return value
|
||||
if isinstance(value, dict):
|
||||
return {k: replace(v) for k, v in value.items()}
|
||||
if isinstance(value, list):
|
||||
return [replace(v) for v in value]
|
||||
return value
|
||||
|
||||
return replace(config)
|
||||
|
||||
|
||||
def output_file(config, full_path, kind, det):
|
||||
"""Where each step writes for one detector: <out_dir>/<kind>_<det>.csv, kind = yields, eps or xs."""
|
||||
out_dir = Path(full_path(config.get("out_dir", "out")))
|
||||
out_dir.mkdir(parents=True, exist_ok=True)
|
||||
return out_dir / (f"{kind}_{det}.csv" if det else f"{kind}.csv")
|
||||
|
||||
|
||||
def make_edges(spec):
|
||||
"""Bin edges from a list [e0, e1, ...] or from {start = .., stop = .., step = ..} (stop included)."""
|
||||
if isinstance(spec, dict):
|
||||
n_bins = int(round((spec["stop"] - spec["start"]) / spec["step"]))
|
||||
return spec["start"] + spec["step"] * np.arange(n_bins + 1)
|
||||
return np.array(spec, dtype=float)
|
||||
|
||||
|
||||
def write_csv(table, header_lines, out_file):
|
||||
with open(out_file, "w", newline="\n") as f:
|
||||
for line in header_lines:
|
||||
f.write(f"# {line}\n")
|
||||
table.to_csv(f, index=False, float_format="%.6g")
|
||||
|
||||
|
||||
# ============================================================ beam track
|
||||
|
||||
class BeamTrack:
|
||||
"""Beam energy (MeV, lab) along z (mm). The energy falls with z and is 0 past the stopping point.
|
||||
|
||||
`energy` is the track used to define the bins (the one the data were reconstructed with). `nominal` is an
|
||||
optional second track (e.g. another stopping-power scale): it gives each bin's nominal E_cm and the beam
|
||||
energy in the efficiency toy. It defaults to the same track."""
|
||||
|
||||
def __init__(self, z, energy, nominal=None, description=""):
|
||||
self.z = np.asarray(z, dtype=float)
|
||||
self.energy = np.asarray(energy, dtype=float)
|
||||
self.nominal = self.energy if nominal is None else np.asarray(nominal, dtype=float)
|
||||
self.description = description
|
||||
|
||||
def energy_at(self, z, nominal=False):
|
||||
return np.interp(z, self.z, self.nominal if nominal else self.energy)
|
||||
|
||||
def z_where_energy_is(self, e):
|
||||
"""The z where the beam has energy e.
|
||||
e <= 0 gives the stopping point; e above the entrance energy gives the entrance z."""
|
||||
if e <= 0:
|
||||
stopped = np.flatnonzero(self.energy <= 0)
|
||||
return float(self.z[stopped[0]]) if len(stopped) else float(self.z[-1])
|
||||
# np.interp needs increasing x: energy decreases along z, so interpolate in -energy
|
||||
return float(np.interp(-e, -self.energy, self.z))
|
||||
|
||||
|
||||
def load_beam_track(beam, full_path):
|
||||
"""Either a CSV with columns z and E (e.g. beam_tracks.csv), or an energy-loss table from
|
||||
eloss_calculations/ plus the beam energy at the entrance."""
|
||||
if "track_csv" in beam:
|
||||
table = pd.read_csv(full_path(beam["track_csv"]), comment="#")
|
||||
z = table[beam.get("track_z_col", "z_mm")]
|
||||
energy = table[beam["track_e_col"]]
|
||||
nominal = table[beam["nominal_e_col"]] if "nominal_e_col" in beam else None
|
||||
text = f"{beam['track_csv']}, column {beam['track_e_col']}"
|
||||
if nominal is not None:
|
||||
text += f" (nominal E_cm from {beam['nominal_e_col']})"
|
||||
return BeamTrack(z, energy, nominal, text)
|
||||
|
||||
if "eloss_table" in beam:
|
||||
# Table columns: energy (MeV), thickness (mg/cm2), distance along the path (cm)
|
||||
table = np.loadtxt(full_path(beam["eloss_table"]), comments="#")
|
||||
table_energy, table_cm = table[:, 0], table[:, 2]
|
||||
e_entrance, z_entrance = float(beam["e_entrance_mev"]), float(beam["z_entrance_mm"])
|
||||
if e_entrance > table_energy[0]:
|
||||
raise ValueError(f"e_entrance_mev = {e_entrance} is above the table's start energy {table_energy[0]}")
|
||||
# Where in the table the beam starts, then walk along it in 0.1 mm steps
|
||||
start_cm = np.interp(-e_entrance, -table_energy, table_cm)
|
||||
z = np.arange(z_entrance, beam.get("z_max_mm", 400.0) + 0.05, 0.1)
|
||||
path_cm = start_cm + (z - z_entrance) / 10.0
|
||||
energy = np.interp(path_cm, table_cm, table_energy, right=0.0)
|
||||
return BeamTrack(z, energy, None, f"{beam['eloss_table']}, {e_entrance} MeV at z = {z_entrance} mm")
|
||||
|
||||
raise KeyError("[beam] needs either track_csv or eloss_table")
|
||||
|
||||
|
||||
def ecm_per_beam_energy(reaction):
|
||||
"""E_cm = E_beam x m_target / (m_beam + m_target) (non-relativistic; or give ecm_per_ebeam directly)."""
|
||||
if "ecm_per_ebeam" in reaction:
|
||||
return float(reaction["ecm_per_ebeam"])
|
||||
return reaction["target_mass_u"] / (reaction["beam_mass_u"] + reaction["target_mass_u"])
|
||||
|
||||
|
||||
# ============================================================ bins
|
||||
|
||||
def energy_bins(bins, track, k):
|
||||
"""E_cm bins and, for each, the stretch of beam path [z_up, z_down] where the beam's E_cm is inside it.
|
||||
The higher energy is upstream, so z_up belongs to the bin's top edge."""
|
||||
ecm_edges = make_edges(bins["ecm_edges"])
|
||||
t = pd.DataFrame({"ecm_lo_mev": ecm_edges[:-1], "ecm_hi_mev": ecm_edges[1:]})
|
||||
t["ecm_c_mev"] = 0.5 * (t["ecm_lo_mev"] + t["ecm_hi_mev"])
|
||||
t["z_up_mm"] = [track.z_where_energy_is(e / k) for e in t["ecm_hi_mev"]]
|
||||
t["z_c_mm"] = [track.z_where_energy_is(e / k) for e in t["ecm_c_mev"]]
|
||||
t["z_down_mm"] = [track.z_where_energy_is(e / k) for e in t["ecm_lo_mev"]]
|
||||
t["dz_mm"] = t["z_down_mm"] - t["z_up_mm"]
|
||||
t["ecm_nominal_mev"] = k * track.energy_at(t["z_c_mm"], nominal=True)
|
||||
# True if the beam enters the chamber already inside this bin (dz then starts at the entrance)
|
||||
t["partial_top"] = t["ecm_hi_mev"] / k > track.energy[0]
|
||||
t["d_omega_sr"] = 1.0 # not used in excitation mode
|
||||
return t
|
||||
|
||||
|
||||
def angle_bins(bins, track, k):
|
||||
"""theta_cm bins inside one window, given in E_cm (window_ecm) or in vertex z (window_z_mm).
|
||||
Returns the bins and the window as (ecm_lo, ecm_hi, z_up, z_down)."""
|
||||
if "window_ecm" in bins:
|
||||
ecm_lo, ecm_hi = bins["window_ecm"]
|
||||
z_up, z_down = track.z_where_energy_is(ecm_hi / k), track.z_where_energy_is(ecm_lo / k)
|
||||
else:
|
||||
z_up, z_down = bins["window_z_mm"]
|
||||
ecm_lo, ecm_hi = k * track.energy_at(z_down), k * track.energy_at(z_up)
|
||||
theta_edges = make_edges(bins["theta_edges_deg"])
|
||||
t = pd.DataFrame({"theta_lo_deg": theta_edges[:-1], "theta_hi_deg": theta_edges[1:]})
|
||||
t["theta_c_deg"] = 0.5 * (t["theta_lo_deg"] + t["theta_hi_deg"])
|
||||
t["d_omega_sr"] = 2 * np.pi * (np.cos(np.radians(t["theta_lo_deg"])) - np.cos(np.radians(t["theta_hi_deg"])))
|
||||
t["z_up_mm"], t["z_down_mm"] = z_up, z_down
|
||||
t["dz_mm"] = z_down - z_up
|
||||
return t, (ecm_lo, ecm_hi, z_up, z_down)
|
||||
|
||||
|
||||
def make_bins(config, track, k):
|
||||
"""The bins of the config's mode. Returns (table, window or None)."""
|
||||
if config.get("mode", "excitation") == "excitation":
|
||||
return energy_bins(config["bins"], track, k), None
|
||||
return angle_bins(config["bins"], track, k)
|
||||
332
cross_section/cross_section.py
Executable file
332
cross_section/cross_section.py
Executable file
|
|
@ -0,0 +1,332 @@
|
|||
"""Step 3: the cross section, from the yields CSV (step 1) and an efficiency (step 2, or any other).
|
||||
|
||||
~/myenv/bin/python -B cross_section.py examples/27Al_ap_runA.toml # no ROOT needed; any python with pandas
|
||||
|
||||
sigma(E_cm) = Y / (N_b * n * dz * eps) mode = "excitation"
|
||||
dsigma/dOmega(th) = Y / (N_b * n * dz * eps * dOmega) mode = "angular"
|
||||
|
||||
Y yield in the bin, from <out_dir>/yields_<det>.csv (or [yield] csv); see extract_yields.py for the format
|
||||
N_b number of beam particles [beam]
|
||||
n target atoms per cm^2 per mm of beam path [target]
|
||||
dz length of beam path (mm) over which the beam's E_cm lies in the bin, from the beam track E(z)
|
||||
eps efficiency of the bin [acceptance]
|
||||
dOmega solid angle of the theta_cm bin (angular mode)
|
||||
|
||||
Writes <out_dir>/xs_<det>.csv (every intermediate number; the header records every input) and <out_dir>/xs.png.
|
||||
|
||||
WHAT IT DOES, STEP BY STEP (see analyse_detector())
|
||||
1. beam track: beam energy E at every z
|
||||
2. normalisation: N_b and n
|
||||
3. bins: E_cm bins -> their z ranges and dz (or theta_cm bins inside one energy window)
|
||||
4. yields: share the yield histogram's bins into those bins
|
||||
5. efficiency: eps for each bin
|
||||
6. cross section: the formula, with statistical and efficiency errors
|
||||
"""
|
||||
import argparse
|
||||
import datetime
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
import common
|
||||
|
||||
BOLTZMANN = 1.380649e-23 # J/K
|
||||
PASCAL_PER_TORR = 133.322368
|
||||
ELEMENTARY_CHARGE = 1.602176634e-19 # C
|
||||
CM2_PER_MB = 1e-27
|
||||
YIELD_VARIABLES = ("z", "e_beam", "ecm")
|
||||
|
||||
|
||||
# ============================================================ normalisation
|
||||
|
||||
def number_of_beam_particles(beam):
|
||||
"""N_b from: n_beam directly, or integrated charge, or current x time. Returns (N_b, relative error, text)."""
|
||||
charge_state = beam.get("charge_state", 1)
|
||||
if "n_beam" in beam:
|
||||
n_b, text = beam["n_beam"], "given"
|
||||
elif "charge_c" in beam:
|
||||
n_b = beam["charge_c"] / (charge_state * ELEMENTARY_CHARGE)
|
||||
text = f"{beam['charge_c']} C / ({charge_state} e)"
|
||||
elif "current_a" in beam:
|
||||
n_b = beam["current_a"] * beam["time_s"] / (charge_state * ELEMENTARY_CHARGE)
|
||||
text = f"{beam['current_a']} A x {beam['time_s']} s / ({charge_state} e)"
|
||||
else:
|
||||
raise KeyError("[beam] needs n_beam, charge_c, or current_a and time_s")
|
||||
return float(n_b), float(beam.get("n_beam_rel_err", 0.0)), text
|
||||
|
||||
|
||||
def target_atoms_per_cm2_per_mm(target):
|
||||
"""n = (gas molecules per cm^3) x (mole fraction of the target molecule) x (target atoms per molecule) x 0.1 cm/mm.
|
||||
E.g. He in 250 Torr He + 3% CO2 at 293.15 K: mole_fraction 0.97, atoms_per_molecule 1 -> 7.988e17.
|
||||
Returns (n, relative error, text)."""
|
||||
if "n_per_cm2_per_mm" in target:
|
||||
return float(target["n_per_cm2_per_mm"]), float(target.get("rel_err", 0.0)), "given"
|
||||
pressure_pa = target["pressure_torr"] * PASCAL_PER_TORR
|
||||
molecules_per_cm3 = pressure_pa / (BOLTZMANN * target["temperature_k"]) * 1e-6
|
||||
fraction = target.get("mole_fraction", 1.0)
|
||||
atoms = target.get("atoms_per_molecule", 1)
|
||||
n = molecules_per_cm3 * fraction * atoms * 0.1
|
||||
text = f"{target['pressure_torr']} Torr, {target['temperature_k']} K, mole fraction {fraction}, {atoms} atom(s)/molecule"
|
||||
return n, float(target.get("rel_err", 0.0)), text
|
||||
|
||||
|
||||
# ============================================================ yields
|
||||
|
||||
def read_yields(file):
|
||||
"""The yields CSV of extract_yields.py. Returns (table, variable), variable = z, e_beam or ecm."""
|
||||
table = pd.read_csv(file, comment="#")
|
||||
for variable in YIELD_VARIABLES:
|
||||
if f"{variable}_lo" in table.columns:
|
||||
return table, variable
|
||||
raise ValueError(f"{file}: no column z_lo, e_beam_lo or ecm_lo (see extract_yields.py for the format)")
|
||||
|
||||
|
||||
def in_yield_units(variable, k, ecm_range, z_range):
|
||||
"""Convert a bin, given both as an E_cm range and a z range, into the units of the yield's variable."""
|
||||
if variable == "ecm":
|
||||
return ecm_range
|
||||
if variable == "e_beam":
|
||||
return ecm_range[0] / k, ecm_range[1] / k
|
||||
return z_range
|
||||
|
||||
|
||||
def fraction_inside(src_lo, src_hi, lo, hi):
|
||||
"""Fraction of each yield bin [src_lo, src_hi) that lies inside [lo, hi). Used to share the yield's bins
|
||||
between the analysis bins when their edges do not line up."""
|
||||
return np.clip(np.minimum(src_hi, hi) - np.maximum(src_lo, lo), 0, None) / (src_hi - src_lo)
|
||||
|
||||
|
||||
def yields_excitation(table, variable, t, k):
|
||||
"""Yield and its error in each E_cm bin."""
|
||||
if "theta_cm_lo" in table.columns: # a 2D yield: add up the theta bins first
|
||||
table = table.groupby([f"{variable}_lo", f"{variable}_hi"], as_index=False)[["counts", "variance"]].sum()
|
||||
src_lo, src_hi = table[f"{variable}_lo"].to_numpy(), table[f"{variable}_hi"].to_numpy()
|
||||
lo, hi = in_yield_units(variable, k, (t["ecm_lo_mev"], t["ecm_hi_mev"]), (t["z_up_mm"], t["z_down_mm"]))
|
||||
counts, errors = [], []
|
||||
for a, b in zip(lo, hi):
|
||||
f = fraction_inside(src_lo, src_hi, a, b)
|
||||
counts.append(np.sum(f * table["counts"]))
|
||||
errors.append(np.sqrt(np.sum(f ** 2 * table["variance"])))
|
||||
return np.array(counts), np.array(errors)
|
||||
|
||||
|
||||
def yields_angular(table, variable, t, window, k):
|
||||
"""Yield and its error in each theta_cm bin, for the part of the yield inside the energy (or z) window."""
|
||||
if "theta_cm_lo" not in table.columns:
|
||||
raise ValueError("angular mode needs a 2D yield (theta_cm_lo/hi columns): set angle_axis or angle_branch in [extract]")
|
||||
ecm_lo, ecm_hi, z_up, z_down = window
|
||||
w_lo, w_hi = in_yield_units(variable, k, (ecm_lo, ecm_hi), (z_up, z_down))
|
||||
in_window = fraction_inside(table[f"{variable}_lo"].to_numpy(), table[f"{variable}_hi"].to_numpy(), w_lo, w_hi)
|
||||
th_lo, th_hi = table["theta_cm_lo"].to_numpy(), table["theta_cm_hi"].to_numpy()
|
||||
counts, errors = [], []
|
||||
for a, b in zip(t["theta_lo_deg"], t["theta_hi_deg"]):
|
||||
f = in_window * fraction_inside(th_lo, th_hi, a, b)
|
||||
counts.append(np.sum(f * table["counts"]))
|
||||
errors.append(np.sqrt(np.sum(f ** 2 * table["variance"])))
|
||||
return np.array(counts), np.array(errors)
|
||||
|
||||
|
||||
# ============================================================ efficiency
|
||||
|
||||
def efficiency(config, det, t, full_path):
|
||||
"""eps and its relative error for every bin. [acceptance] source =
|
||||
"geometric": <out_dir>/eps_<det>.csv from geometric_efficiency.py; `column` picks the efficiency
|
||||
(default eps_geometric), its Monte Carlo error comes with it
|
||||
"csv": any file: csv, x_col, eps_col, match = "bin" (same bin edge: our column `key` = their x_col)
|
||||
or "interp" (interpolate at our column `key`; NaN outside the file's range), rel_err_col or rel_err
|
||||
"value": one number for every bin (value, rel_err)
|
||||
"none": eps = 1, the apparent cross section (the default)
|
||||
[[acceptance.extra]] name, value, rel_err: further factors, multiplied in (e.g. an intrinsic efficiency)."""
|
||||
eff = config.get("acceptance", {})
|
||||
mode = config.get("mode", "excitation")
|
||||
source = eff.get("source", "none")
|
||||
n_bins = len(t)
|
||||
eps, rel_err = np.ones(n_bins), np.zeros(n_bins)
|
||||
text = "none (eps = 1: apparent cross section)"
|
||||
|
||||
if source == "geometric":
|
||||
column = eff.get("column", "eps_geometric")
|
||||
file = common.output_file(config, full_path, "eps", det)
|
||||
eff = {"csv": str(file), "match": "bin", "eps_col": column, "rel_err_col": f"{column}_rel_err",
|
||||
"x_col": "ecm_lo_mev" if mode == "excitation" else "theta_lo_deg", "extra": eff.get("extra", [])}
|
||||
source = "csv"
|
||||
if source == "csv":
|
||||
table = pd.read_csv(full_path(eff["csv"]), comment="#")
|
||||
match = eff.get("match", "interp")
|
||||
default_key = {("excitation", "bin"): "ecm_lo_mev", ("excitation", "interp"): "ecm_nominal_mev",
|
||||
("angular", "bin"): "theta_lo_deg", ("angular", "interp"): "theta_c_deg"}[(mode, match)]
|
||||
key = eff.get("key", default_key)
|
||||
their_x = table[eff["x_col"]].to_numpy(float)
|
||||
their_eps = table[eff["eps_col"]].to_numpy(float)
|
||||
if "rel_err_col" in eff:
|
||||
their_err = table[eff["rel_err_col"]].to_numpy(float)
|
||||
else:
|
||||
their_err = np.full(len(table), eff.get("rel_err", 0.0))
|
||||
|
||||
ours = t[key].to_numpy(float)
|
||||
if match == "bin":
|
||||
for i, x in enumerate(ours):
|
||||
same = np.flatnonzero(np.isclose(their_x, x, rtol=1e-6, atol=1e-9))
|
||||
eps[i] = their_eps[same[0]] if len(same) else np.nan
|
||||
rel_err[i] = their_err[same[0]] if len(same) else np.nan
|
||||
else:
|
||||
order = np.argsort(their_x)
|
||||
eps = np.interp(ours, their_x[order], their_eps[order], left=np.nan, right=np.nan)
|
||||
rel_err = np.interp(ours, their_x[order], their_err[order], left=np.nan, right=np.nan)
|
||||
text = f"{eff['csv']}, column {eff['eps_col']} ({match} on {eff['x_col']} = our {key})"
|
||||
elif source == "value":
|
||||
eps = np.full(n_bins, float(eff["value"]))
|
||||
rel_err = np.full(n_bins, float(eff.get("rel_err", 0.0)))
|
||||
text = f"constant {eff['value']}"
|
||||
elif source != "none":
|
||||
raise ValueError(f"[acceptance] source must be geometric, csv, value or none, not {source!r}")
|
||||
|
||||
for extra in eff.get("extra", []):
|
||||
eps = eps * extra["value"]
|
||||
rel_err = np.hypot(rel_err, extra.get("rel_err", 0.0))
|
||||
text += f" x {extra.get('name', 'extra factor')} {extra['value']}"
|
||||
return eps, rel_err, text
|
||||
|
||||
|
||||
# ============================================================ cross section
|
||||
|
||||
def cross_section(t, n_b, n, eps, eps_rel_err, name):
|
||||
"""The formula. `name` is "sigma_mb" (excitation) or "dsdo_mb_sr" (angular). Adds columns to t:
|
||||
<name>_app, <name>_app_err apparent cross section (eps = 1), statistical error
|
||||
<name>, <name>_err_stat divided by eps
|
||||
<name>_err_eps, <name>_err error from eps; total (stat and eps in quadrature)
|
||||
The N_b and n uncertainties are a common scale for all bins and are NOT in these columns."""
|
||||
exposure = n_b * n * t["dz_mm"] * t["d_omega_sr"] * CM2_PER_MB # events per mb (per mb/sr)
|
||||
exposure = exposure.where(exposure > 0) # dz = 0 (past the stopping point) -> NaN
|
||||
eps = pd.Series(eps, index=t.index).where(lambda e: e > 0) # eps = 0 -> NaN
|
||||
t[f"{name}_app"] = t["counts"] / exposure
|
||||
t[f"{name}_app_err"] = t["stat_err"] / exposure
|
||||
t["eps"] = eps
|
||||
t["eps_rel_err"] = eps_rel_err
|
||||
t[name] = t[f"{name}_app"] / eps
|
||||
t[f"{name}_err_stat"] = t[f"{name}_app_err"] / eps
|
||||
t[f"{name}_err_eps"] = t[name] * t["eps_rel_err"]
|
||||
t[f"{name}_err"] = np.hypot(t[f"{name}_err_stat"], t[f"{name}_err_eps"])
|
||||
return t
|
||||
|
||||
|
||||
def add_references(t, references, det, x_col, full_path):
|
||||
"""Reference curves ([[reference]]: csv, x_col, y_col, label, optional scale and dets) interpolated at our x
|
||||
(NaN outside their range). Returns the curves for the plot."""
|
||||
curves = []
|
||||
for ref in references or []:
|
||||
if "dets" in ref and det not in ref["dets"]:
|
||||
continue
|
||||
table = pd.read_csv(full_path(ref["csv"]), comment="#").sort_values(ref["x_col"])
|
||||
x = table[ref["x_col"]].to_numpy(float)
|
||||
y = ref.get("scale", 1.0) * table[ref["y_col"]].to_numpy(float)
|
||||
label = ref.get("label", Path(ref["csv"]).stem)
|
||||
column = "ref_" + re.sub(r"\W+", "_", label).strip("_").lower()
|
||||
t[column] = np.interp(t[x_col], x, y, left=np.nan, right=np.nan)
|
||||
curves.append((label, x, y))
|
||||
return curves
|
||||
|
||||
|
||||
def analyse_detector(config, det, full_path):
|
||||
"""Steps 1-6 for one detector. Returns the result table, its header lines, the x column, the cross-section
|
||||
column name and the reference curves."""
|
||||
mode = config.get("mode", "excitation")
|
||||
k = common.ecm_per_beam_energy(config["reaction"])
|
||||
|
||||
# 1. beam track
|
||||
track = common.load_beam_track(config["beam"], full_path)
|
||||
|
||||
# 2. normalisation
|
||||
n_b, n_b_rel_err, n_b_text = number_of_beam_particles(config["beam"])
|
||||
n, n_rel_err, n_text = target_atoms_per_cm2_per_mm(config["target"])
|
||||
|
||||
# 3. bins and 4. yields
|
||||
yield_file = full_path(config["yield"]["csv"]) if "csv" in config.get("yield", {}) \
|
||||
else common.output_file(config, full_path, "yields", det)
|
||||
yields, variable = read_yields(yield_file)
|
||||
t, window = common.make_bins(config, track, k)
|
||||
if mode == "excitation":
|
||||
t["counts"], t["stat_err"] = yields_excitation(yields, variable, t, k)
|
||||
name, x_col, window_text = "sigma_mb", "ecm_nominal_mev", ""
|
||||
else:
|
||||
t["counts"], t["stat_err"] = yields_angular(yields, variable, t, window, k)
|
||||
name, x_col = "dsdo_mb_sr", "theta_c_deg"
|
||||
ecm_lo, ecm_hi, z_up, z_down = window
|
||||
window_text = f"; window E_cm {ecm_lo:.4g} to {ecm_hi:.4g} MeV, z {z_up:.2f} to {z_down:.2f} mm"
|
||||
|
||||
# 5. efficiency and 6. cross section
|
||||
eps, eps_rel_err, eps_text = efficiency(config, det, t, full_path)
|
||||
t = cross_section(t, n_b, n, eps, eps_rel_err, name)
|
||||
curves = add_references(t, config.get("reference"), det, x_col, full_path)
|
||||
|
||||
header = [
|
||||
f"{config.get('title', '')} {det.upper()}: {mode} mode{window_text}",
|
||||
f"yield: {yield_file} (binned in {variable})",
|
||||
f"beam track: {track.description}; E_cm = {k:.6g} x E_beam",
|
||||
f"N_b = {n_b:.6g} ({n_b_text}); n = {n:.6g} target atoms per cm2 per mm ({n_text})",
|
||||
f"eps: {eps_text}",
|
||||
f"common scale uncertainty from N_b and n: {100 * np.hypot(n_b_rel_err, n_rel_err):.3g} % (not in the error columns)",
|
||||
f"written by cross_section.py on {datetime.date.today().isoformat()}",
|
||||
]
|
||||
return t, header, x_col, name, curves
|
||||
|
||||
|
||||
def make_plot(results, config, out_file):
|
||||
import matplotlib
|
||||
matplotlib.use("Agg")
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
opts = config.get("plot", {})
|
||||
excitation = config.get("mode", "excitation") == "excitation"
|
||||
fig, ax = plt.subplots(figsize=opts.get("figsize", (9, 6)))
|
||||
plotted_refs = set()
|
||||
for det, (t, x_col, name, curves) in results.items():
|
||||
ok = np.isfinite(t[name]) & (t[name] > 0)
|
||||
ax.errorbar(t.loc[ok, x_col], t.loc[ok, name], yerr=t.loc[ok, f"{name}_err"],
|
||||
fmt="o", ms=4, capsize=2, label=det.upper() or "data")
|
||||
for label, x, y in curves:
|
||||
if label not in plotted_refs:
|
||||
ax.plot(x, y, "-", lw=1.2, label=label)
|
||||
plotted_refs.add(label)
|
||||
ax.set_xlabel(opts.get("xlabel", "E$_\\mathrm{cm}$ (MeV)" if excitation else "$\\theta_\\mathrm{cm}$ (deg)"))
|
||||
ax.set_ylabel(opts.get("ylabel", "$\\sigma$ (mb)" if excitation else "d$\\sigma$/d$\\Omega$ (mb/sr)"))
|
||||
ax.set_yscale(opts.get("yscale", "log"))
|
||||
if "xlim" in opts:
|
||||
ax.set_xlim(*opts["xlim"])
|
||||
if "ylim" in opts:
|
||||
ax.set_ylim(*opts["ylim"])
|
||||
ax.set_title(config.get("title", ""))
|
||||
ax.legend(fontsize=8)
|
||||
fig.tight_layout()
|
||||
fig.savefig(out_file, dpi=110)
|
||||
plt.close(fig)
|
||||
|
||||
|
||||
def main(argv=None):
|
||||
parser = argparse.ArgumentParser(description="Step 3: cross section from the yields CSV and an efficiency.")
|
||||
parser.add_argument("config", help="TOML config file")
|
||||
args = parser.parse_args(argv)
|
||||
config, full_path = common.read_config(args.config)
|
||||
|
||||
results = {}
|
||||
for det in config.get("dets", [""]):
|
||||
print(f"--- {det or 'data'}")
|
||||
det_config = common.config_for_detector(config, det)
|
||||
t, header, x_col, name, curves = analyse_detector(det_config, det, full_path)
|
||||
common.write_csv(t, header, common.output_file(config, full_path, "xs", det))
|
||||
results[det] = (t, x_col, name, curves)
|
||||
print("\n".join(header[:-1]))
|
||||
show = [x_col, "dz_mm" if name == "sigma_mb" else "d_omega_sr", "counts", f"{name}_app", "eps", name,
|
||||
f"{name}_err"] + [c for c in t.columns if c.startswith("ref_")]
|
||||
print(t[show].to_string(index=False, float_format=lambda v: f"{v:.4g}"), "\n")
|
||||
|
||||
out_png = common.output_file(config, full_path, "xs", "").with_suffix(".png")
|
||||
make_plot(results, config, out_png)
|
||||
print(f"written to {out_png.parent}")
|
||||
return results
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
80
cross_section/detectors.py
Executable file
80
cross_section/detectors.py
Executable file
|
|
@ -0,0 +1,80 @@
|
|||
"""The ANASEN detectors as they are now (Run A, 27Al campaign), for the geometric efficiency.
|
||||
|
||||
geometric_efficiency.py reads everything about the detectors from here. Change a number here and every efficiency
|
||||
computed afterwards follows it.
|
||||
|
||||
Sources:
|
||||
- Si and counter: anasen_detectability.py of ~/TALYS/al027_a_scripts_stoichgas_dedx0962_2026-10-08
|
||||
("detector geometry as used by TrackRecon.C"; counter radii from ClassPW.h)
|
||||
- beam tube and PCB hole: the author, 2026-10-15 (../scratch/reaction_efficiency_tube_2026-10-15)
|
||||
Geometry only: straight tracks from the vertex, no energy loss.
|
||||
"""
|
||||
import numpy as np
|
||||
|
||||
# ---------------------------------------------------------------- silicon
|
||||
# QQQ3: the downstream annular detector
|
||||
QQQ_Z_MM = 105.0 # TrackRecon.C qqq_z
|
||||
QQQ_R_MM = (50.0, 100.0) # inner and outer active radius (16 rings: rho = 50 + 50/16 (ring + 0.5))
|
||||
QQQ_PHI_FRACTION = 4 * 87.0 / 360.0 # 4 quadrants x 87 deg of wedges
|
||||
|
||||
# SX3: the barrel; only the four detectors TrackRecon.C builds events for, downstream half only
|
||||
SX3_R_MM = 88.0
|
||||
SX3_Z_MM = (-3.0, 72.0) # z_local + 75/2 - 3
|
||||
SX3_IDS = (1, 3, 7, 9)
|
||||
SX3_HALF_ANGLE = np.arctan(4 * 40.30 / (8.0 * 88.0 * np.cos(np.radians(15.0)))) # outer strip edge, each side
|
||||
SX3_PHI_FRACTION = len(SX3_IDS) * 2 * SX3_HALF_ANGLE / (2 * np.pi)
|
||||
|
||||
PHI_FRACTION = {"qqq": QQQ_PHI_FRACTION, "sx3": SX3_PHI_FRACTION}
|
||||
|
||||
# Si energy thresholds (MeV), TrackRecon.C reaction_ax_core si_ecut. Used only for the eps_si_thr column.
|
||||
SI_THRESHOLD_MEV = {"qqq": 0.45, "sx3": 0.6}
|
||||
|
||||
# ---------------------------------------------------------------- proportional counter
|
||||
COUNTER_HALF_LENGTH_MM = 174.3
|
||||
COUNTER_RADII_MM = (32.0, 37.0, 42.0) # guard, anode, cathode (ClassPW.h)
|
||||
|
||||
# ---------------------------------------------------------------- upstream apertures
|
||||
# (name, radius mm, z mm of the face that binds). A track from an on-axis vertex only moves away from the axis,
|
||||
# so an opening binds at its downstream end.
|
||||
APERTURES = (("beam tube", 16.0, -189.0),
|
||||
("PCB hole", 18.0, -174.3))
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- hit rules
|
||||
# z_vertex in mm, theta = lab polar angle of the particle (radians). All return one True/False per track.
|
||||
|
||||
def hits_silicon(det, z_vertex, theta):
|
||||
"""Does the straight track from z_vertex at angle theta reach the active silicon of `det` ("qqq" or "sx3")?
|
||||
Polar angle only: multiply by PHI_FRACTION[det] for the azimuthal coverage.
|
||||
A track that reaches the SX3 barrel's z range is counted as SX3, not QQQ."""
|
||||
s, c = np.sin(theta), np.cos(theta)
|
||||
with np.errstate(divide="ignore", invalid="ignore"):
|
||||
z_at_sx3 = z_vertex + SX3_R_MM * c / s # z where the track reaches the barrel radius
|
||||
on_sx3 = (z_at_sx3 >= SX3_Z_MM[0]) & (z_at_sx3 <= SX3_Z_MM[1])
|
||||
if det == "sx3":
|
||||
return on_sx3
|
||||
r_at_qqq = np.where(c > 0, (QQQ_Z_MM - z_vertex) * s / c, -1.0) # radius where it reaches the QQQ plane
|
||||
if det == "qqq":
|
||||
return (QQQ_Z_MM > z_vertex) & (r_at_qqq >= QQQ_R_MM[0]) & (r_at_qqq <= QQQ_R_MM[1]) & ~on_sx3
|
||||
raise ValueError(f"unknown detector {det!r}: detectors.py defines 'qqq' and 'sx3'")
|
||||
|
||||
|
||||
def crosses_counter(z_vertex, theta):
|
||||
"""Does the track cross the guard, anode and cathode radii inside the counter's length?"""
|
||||
with np.errstate(divide="ignore", invalid="ignore"):
|
||||
cot = np.cos(theta) / np.sin(theta)
|
||||
ok = np.ones(np.shape(z_vertex), bool)
|
||||
for r in COUNTER_RADII_MM:
|
||||
ok &= np.abs(z_vertex + r * cot) <= COUNTER_HALF_LENGTH_MM
|
||||
return ok
|
||||
|
||||
|
||||
def clears_apertures(z_vertex, theta):
|
||||
"""Does the track pass the beam tube and the PCB hole? Only vertices upstream of an aperture can be blocked
|
||||
by it: blocked when the track is farther from the axis than the opening's radius at the opening's z."""
|
||||
s, c = np.sin(theta), np.cos(theta)
|
||||
tan_theta = s / np.where(c > 0, c, 1e-9) # backward tracks from upstream never reach the detectors
|
||||
ok = np.ones(np.shape(z_vertex), bool)
|
||||
for _name, radius, z_face in APERTURES:
|
||||
ok &= ~((z_vertex < z_face) & ((z_face - z_vertex) * tan_theta > radius))
|
||||
return ok
|
||||
88
cross_section/examples/27Al_ap_runA.toml
Executable file
88
cross_section/examples/27Al_ap_runA.toml
Executable file
|
|
@ -0,0 +1,88 @@
|
|||
# 27Al(a,p)30Si excitation function, Run A, QQQ3 and SX3. Same inputs as ../../scratch/xs_27Al_lowE_2026-10-15.
|
||||
#
|
||||
# ~/myenv/bin/python -B extract_yields.py examples/27Al_ap_runA.toml # 1. ROOT -> out/27Al_ap_runA/yields_<det>.csv
|
||||
# ~/myenv/bin/python -B geometric_efficiency.py examples/27Al_ap_runA.toml # 2. detectors.py -> eps_<det>.csv
|
||||
# ~/myenv/bin/python -B cross_section.py examples/27Al_ap_runA.toml # 3. -> xs_<det>.csv, xs.png
|
||||
#
|
||||
# Each script reads the sections it needs. Paths are relative to this file's folder.
|
||||
# "{det}" is replaced by each entry of `dets`.
|
||||
|
||||
title = "27Al(a,p)30Si, Run A"
|
||||
mode = "excitation" # "excitation": sigma(E_cm); "angular": dsigma/dOmega(theta_cm)
|
||||
dets = ["sx3", "qqq"] # names known to detectors.py
|
||||
out_dir = "../out/27Al_ap"
|
||||
|
||||
# ------------------------------------------------------------- step 1: extract_yields.py
|
||||
[extract]
|
||||
# One fill per candidate: x = vertex z, y = tracked beam energy. Projected on y (all z, including overflow).
|
||||
source = "hist"
|
||||
file = "~/ANASEN_analysis/Output_27Al_X0_Y0/Output_27Al.root"
|
||||
hist = "_m27Alax+misc_{det}/m27Alax_BeamEnergy_vs_VertexZ_{det}"
|
||||
axis = "y"
|
||||
variable = "e_beam"
|
||||
|
||||
# ------------------------------------------------------------- the reaction (steps 2 and 3)
|
||||
[reaction]
|
||||
beam_mass_u = 26.981538 # 27Al (atomic masses, as TrackRecon.C)
|
||||
target_mass_u = 4.002603254 # 4He
|
||||
ejectile_mass_u = 1.007825032 # p -> Q = 2.372 MeV for the ground state
|
||||
recoil_mass_u = 29.973770 # 30Si
|
||||
detect = "ejectile"
|
||||
ecm_per_ebeam = 0.12918 # the rounded factor of the established analysis (the masses give 0.129182)
|
||||
# 30Si states weighted by the TALYS (a,p) state cross sections at each bin's E_cm
|
||||
states_csv = "../inputs/talys_27Al_ap.csv"
|
||||
# or fixed weights: states = [{ex_mev = 0.0, weight = 1.0}, {ex_mev = 2.235, weight = 0.5}]
|
||||
|
||||
[beam]
|
||||
# Beam energy along z;
|
||||
# the nominal E_cm of each bin and the beam energy in the efficiency toy come from the 0.962 track.
|
||||
track_csv = "../inputs/beam_tracks.csv"
|
||||
track_z_col = "z_mm"
|
||||
track_e_col = "e_beam_mev_0962"
|
||||
# Alternative: build the track from an energy-loss table (check which dE/dx scale the table was made with):
|
||||
# eloss_table = "../../eloss_calculations/aluminum_lookup_80MeV_250torr_3pc.dat"
|
||||
# e_entrance_mev = 56.16
|
||||
# z_entrance_mm = -454.0
|
||||
n_beam = 1.4405e12 # Faraday cup, ch5 ssec:beam_exposure: the 45 runs (2.2096e12)
|
||||
# For another set of runs: ../../runlog/beam_exposure.py "<runs>" --data-dir ../../Output_27Al_fb
|
||||
n_beam_rel_err = 0.5
|
||||
|
||||
[bins]
|
||||
ecm_edges = { start = 0.0, stop = 7.25, step = 0.25 }
|
||||
|
||||
# ------------------------------------------------------------- step 2: geometric_efficiency.py
|
||||
[efficiency]
|
||||
n_per_bin = 400000
|
||||
seed = 20261016
|
||||
|
||||
# ------------------------------------------------------------- step 3: cross_section.py
|
||||
[target]
|
||||
# 4He in 250 Torr He + 3% CO2 at 20 C -> 7.988e17 He atoms per cm2 per mm
|
||||
pressure_torr = 250.0
|
||||
temperature_k = 293.15
|
||||
mole_fraction = 0.97
|
||||
atoms_per_molecule = 1
|
||||
|
||||
# [yield] csv = "..." # only to read yields from somewhere other than <out_dir>/yields_<det>.csv
|
||||
|
||||
[acceptance]
|
||||
source = "geometric" # <out_dir>/eps_<det>.csv from step 2
|
||||
column = "eps_geometric" # or eps_si, eps_si_thr, eps_counter
|
||||
# To use the adopted efficiency of ../../scratch/xs_27Al_lowE_2026-10-15 instead (includes gas loss and thresholds):
|
||||
# source = "csv"
|
||||
# csv = "../../scratch/xs_27Al_lowE_2026-10-15/out/xs_{det}.csv"
|
||||
# match = "bin"
|
||||
# x_col = "ecm_lo_mev"
|
||||
# eps_col = "eps_tube_adopted"
|
||||
# rel_err_col = "eps_tube_rel_err"
|
||||
|
||||
[[reference]]
|
||||
csv = "../inputs/talys_27Al_ap.csv"
|
||||
x_col = "ecm_mev"
|
||||
y_col = "sigma_total_mb"
|
||||
label = "TALYS (a,p), discrete states"
|
||||
|
||||
[plot]
|
||||
yscale = "log"
|
||||
xlim = [0, 7.4]
|
||||
ylim = [1e-3, 3e4]
|
||||
87
cross_section/examples/paap_ta_runs_hist.toml
Executable file
87
cross_section/examples/paap_ta_runs_hist.toml
Executable file
|
|
@ -0,0 +1,87 @@
|
|||
# p + 4He elastic scattering, dsigma/dOmega(theta_cm), from the alpha recoils of the Run A Ta-foil runs 18-22, straight
|
||||
# from a TrackRecon.C production file -- the same route as 27Al_ap_runA.toml. The histogram is
|
||||
# elastic_VertexZ_vs_ThetaCM_<variant>_a_<DET>, filled by protonAlphaElastic_core since 2026-10-16.
|
||||
# paap_ta_runs.toml is the same measurement from the p-alpha study's per-hit list.
|
||||
#
|
||||
# (once) process runs 18-22 with CUTLIST=pid_cuts/pid_cutlist.txt and merge them, e.g.
|
||||
# bash scratch/paap_hist_2026-10-16/reprocess.sh (or run_tr.sh block 5, then hadd runs 18-22 only)
|
||||
# ~/myenv/bin/python -B extract_yields.py examples/paap_ta_runs_hist.toml # or, the same in ROOT:
|
||||
# root -l -b -q 'extract_yields.C+("examples/paap_ta_runs_hist.toml")'
|
||||
# ~/myenv/bin/python -B geometric_efficiency.py examples/paap_ta_runs_hist.toml
|
||||
# ~/myenv/bin/python -B cross_section.py examples/paap_ta_runs_hist.toml
|
||||
#
|
||||
# Paths are relative to this file's folder.
|
||||
|
||||
title = "p + 4He elastic, alpha recoils, Ta runs 18-22 (TrackRecon histograms)"
|
||||
mode = "angular"
|
||||
dets = ["qqq", "sx3"]
|
||||
out_dir = "../out/paap_ta_run22"
|
||||
|
||||
[det_vars.qqq] # TrackRecon.C spells the detector in upper case in these folders
|
||||
DET = "QQQ"
|
||||
[det_vars.sx3]
|
||||
DET = "SX3"
|
||||
|
||||
# ------------------------------------------------------------- step 1: extract_yields.py / extract_yields.C
|
||||
[extract]
|
||||
# The merged output of runs 18-22 (not 17: its foil, at z = -135.7 mm, sits inside the vertex window below).
|
||||
# Point this at your own merged file to use your own processing.
|
||||
source = "hist"
|
||||
file = "~/ANASEN_analysis/Output_p/results_run022.root"
|
||||
# Folder _a: hits the p/alpha cut (pid_alpha_<det>, CUTLIST) calls alpha. Variant _cath_exgate: cathode topologies
|
||||
# (a1c1, a1c2, a2c1, a2c2) and |Ex| < 1 MeV under the alpha hypothesis, i.e. elastic. Others: "" (all topologies,
|
||||
# no Ex gate), "_cath", "_exgate".
|
||||
hist = "elastic+misc_{DET}_a/elastic_VertexZ_vs_ThetaCM_cath_exgate_a_{DET}"
|
||||
axis = "x" # x = vertex z (mm)
|
||||
angle_axis = "y" # y = proton theta_cm (deg)
|
||||
variable = "z"
|
||||
|
||||
# ------------------------------------------------------------- the reaction (steps 2 and 3)
|
||||
[reaction]
|
||||
beam_mass_u = 1.007825032 # p
|
||||
target_mass_u = 4.002603254 # 4He
|
||||
ejectile_mass_u = 1.007825032 # p
|
||||
recoil_mass_u = 4.002603254 # 4He
|
||||
detect = "recoil" # the silicon sees the alpha; theta_cm is the proton's
|
||||
states = [{ ex_mev = 0.0, weight = 1.0 }]
|
||||
|
||||
[beam]
|
||||
# As paap_ta_runs.toml: 6.89 MeV protons into the gas; N_b = run 17's Ta-foil Rutherford current (1.35 pA) times
|
||||
# the wall time of runs 18-22. The run log's 13 pA would give 2.6378e11 (../../runlog/beam_exposure.py "18-22").
|
||||
eloss_table = "../../eloss_calculations/proton_lookup_30MeV_250torr_3pc.dat"
|
||||
e_entrance_mev = 6.89
|
||||
z_entrance_mm = -454.0
|
||||
current_a = 1.35e-12
|
||||
time_s = 672.65
|
||||
charge_state = 1
|
||||
|
||||
[bins]
|
||||
window_z_mm = [-170.0, -53.0] # upstream of every run's foil by 25 mm for runs 18-22, inside the counter
|
||||
theta_edges_deg = { start = 88.0, stop = 168.0, step = 8.0 }
|
||||
|
||||
# ------------------------------------------------------------- step 2: geometric_efficiency.py
|
||||
[efficiency]
|
||||
n_per_bin = 400000
|
||||
seed = 20261016
|
||||
|
||||
# ------------------------------------------------------------- step 3: cross_section.py
|
||||
[target]
|
||||
pressure_torr = 250.0
|
||||
temperature_k = 293.15
|
||||
mole_fraction = 0.97
|
||||
atoms_per_molecule = 1
|
||||
|
||||
[acceptance]
|
||||
source = "geometric"
|
||||
column = "eps_geometric"
|
||||
|
||||
[[reference]]
|
||||
csv = "reference/barnard1964_A1113003.csv"
|
||||
x_col = "theta_cm_deg"
|
||||
y_col = "dsdo_window_mb_sr"
|
||||
label = "Barnard 1964, at the window's E_p"
|
||||
|
||||
[plot]
|
||||
yscale = "linear"
|
||||
xlim = [80, 175]
|
||||
ylim = [0, 130]
|
||||
144
cross_section/examples/reference/barnard1964_A1113003.csv
Executable file
144
cross_section/examples/reference/barnard1964_A1113003.csv
Executable file
|
|
@ -0,0 +1,144 @@
|
|||
# Barnard, Jones & Weil, NP 50, 604 (1964), EXFOR A1113003: p + 4He elastic, dsigma/dOmega_cm (mb/sr)
|
||||
# Legendre order 6 fits of the 6.016 and 6.977 MeV distributions; dsdo_window: log-linear in E_p at 6.7437 MeV,
|
||||
# the beam energy at the centre of the vertex window -170.0 to -53.0 mm of paap_ta_runs.toml
|
||||
# written by make_barnard_reference.py
|
||||
theta_cm_deg,dsdo_6p016_mb_sr,dsdo_6p977_mb_sr,dsdo_window_mb_sr
|
||||
26,514.406,470.065,480.465
|
||||
27,504.693,461.948,471.98
|
||||
28,494.922,453.754,463.423
|
||||
29,485.115,445.501,454.81
|
||||
30,475.295,437.203,446.161
|
||||
31,465.481,428.878,437.491
|
||||
32,455.692,420.54,428.816
|
||||
33,445.946,412.203,420.153
|
||||
34,436.261,403.88,411.513
|
||||
35,426.651,395.584,402.912
|
||||
36,417.132,387.326,394.36
|
||||
37,407.715,379.117,385.87
|
||||
38,398.413,370.966,377.45
|
||||
39,389.235,362.882,369.111
|
||||
40,380.191,354.874,360.861
|
||||
41,371.288,346.947,352.705
|
||||
42,362.532,339.108,344.652
|
||||
43,353.928,331.362,336.705
|
||||
44,345.481,323.714,328.869
|
||||
45,337.192,316.166,321.147
|
||||
46,329.064,308.722,313.542
|
||||
47,321.097,301.384,306.056
|
||||
48,313.29,294.152,298.688
|
||||
49,305.642,287.028,291.44
|
||||
50,298.152,280.012,284.312
|
||||
51,290.816,273.103,277.302
|
||||
52,283.631,266.301,270.408
|
||||
53,276.592,259.604,263.63
|
||||
54,269.697,253.011,256.964
|
||||
55,262.94,246.52,250.409
|
||||
56,256.315,240.129,243.962
|
||||
57,249.819,233.836,237.62
|
||||
58,243.445,227.639,231.379
|
||||
59,237.189,221.535,225.238
|
||||
60,231.045,215.523,219.192
|
||||
61,225.008,209.599,213.24
|
||||
62,219.074,203.763,207.379
|
||||
63,213.237,198.013,201.606
|
||||
64,207.495,192.345,195.918
|
||||
65,201.842,186.761,190.315
|
||||
66,196.276,181.257,184.794
|
||||
67,190.793,175.833,179.353
|
||||
68,185.391,170.488,173.993
|
||||
69,180.069,165.223,168.711
|
||||
70,174.824,160.037,163.508
|
||||
71,169.656,154.931,158.384
|
||||
72,164.564,149.905,153.339
|
||||
73,159.549,144.961,148.375
|
||||
74,154.61,140.099,143.492
|
||||
75,149.75,135.322,138.691
|
||||
76,144.969,130.63,133.975
|
||||
77,140.27,126.028,129.346
|
||||
78,135.655,121.516,124.807
|
||||
79,131.127,117.097,120.359
|
||||
80,126.688,112.775,116.005
|
||||
81,122.342,108.552,111.75
|
||||
82,118.093,104.431,107.595
|
||||
83,113.945,100.416,103.545
|
||||
84,109.9,96.5094,99.6024
|
||||
85,105.964,92.7147,95.7706
|
||||
86,102.14,89.0351,92.0532
|
||||
87,98.4316,85.4736,88.4535
|
||||
88,94.8431,82.0333,84.9746
|
||||
89,91.378,78.7172,81.6197
|
||||
90,88.0401,75.528,78.3918
|
||||
91,84.8326,72.4683,75.2935
|
||||
92,81.7586,69.5403,72.3274
|
||||
93,78.8209,66.7463,69.4959
|
||||
94,76.0221,64.0881,66.8009
|
||||
95,73.3644,61.5673,64.2442
|
||||
96,70.8494,59.1852,61.8272
|
||||
97,68.4787,56.9427,59.5509
|
||||
98,66.2533,54.8405,57.4162
|
||||
99,64.1738,52.8789,55.4235
|
||||
100,62.2404,51.058,53.5729
|
||||
101,60.4529,49.3774,51.864
|
||||
102,58.8107,47.8365,50.2963
|
||||
103,57.3127,46.4343,48.8688
|
||||
104,55.9576,45.1696,47.5803
|
||||
105,54.7435,44.0406,46.4292
|
||||
106,53.6684,43.0456,45.4134
|
||||
107,52.7296,42.1824,44.5309
|
||||
108,51.9245,41.4485,43.7792
|
||||
109,51.25,40.8414,43.1556
|
||||
110,50.7026,40.3582,42.657
|
||||
111,50.279,39.9957,42.2804
|
||||
112,49.9752,39.7509,42.0224
|
||||
113,49.7873,39.6202,41.8794
|
||||
114,49.7114,39.6002,41.8479
|
||||
115,49.7433,39.6873,41.9241
|
||||
116,49.8787,39.8777,42.1041
|
||||
117,50.1134,40.1678,42.3841
|
||||
118,50.4431,40.5537,42.7601
|
||||
119,50.8637,41.0316,43.2282
|
||||
120,51.3709,41.5977,43.7844
|
||||
121,51.9605,42.2482,44.4248
|
||||
122,52.6287,42.9794,45.1456
|
||||
123,53.3713,43.7876,45.9431
|
||||
124,54.1848,44.6692,46.8133
|
||||
125,55.0653,45.6205,47.7529
|
||||
126,56.0094,46.6381,48.7581
|
||||
127,57.0138,47.7186,49.8256
|
||||
128,58.0753,48.8588,50.9522
|
||||
129,59.1907,50.0552,52.1344
|
||||
130,60.3572,51.305,53.3694
|
||||
131,61.5722,52.6049,54.654
|
||||
132,62.8329,53.9521,55.9855
|
||||
133,64.137,55.3437,57.3609
|
||||
134,65.4821,56.7769,58.7776
|
||||
135,66.8659,58.2489,60.2329
|
||||
136,68.2862,59.757,61.7243
|
||||
137,69.741,61.2987,63.2493
|
||||
138,71.2282,62.8712,64.8053
|
||||
139,72.7458,64.472,66.3899
|
||||
140,74.2917,66.0985,68.0005
|
||||
141,75.864,67.7481,69.6349
|
||||
142,77.4604,69.4181,71.2903
|
||||
143,79.079,71.1058,72.9644
|
||||
144,80.7174,72.8086,74.6544
|
||||
145,82.3734,74.5237,76.3578
|
||||
146,84.0445,76.2483,78.0719
|
||||
147,85.7282,77.9794,79.7937
|
||||
148,87.4218,79.7141,81.5205
|
||||
149,89.1225,81.4492,83.2491
|
||||
150,90.8273,83.1817,84.9765
|
||||
151,92.533,84.9082,86.6995
|
||||
152,94.2363,86.6253,88.4146
|
||||
153,95.9337,88.3298,90.1185
|
||||
154,97.6217,90.0179,91.8076
|
||||
155,99.2963,91.686,93.4782
|
||||
156,100.954,93.3306,95.1267
|
||||
157,102.59,94.9478,96.7491
|
||||
158,104.2,96.5338,98.3415
|
||||
159,105.781,98.0847,99.9001
|
||||
160,107.328,99.5967,101.421
|
||||
161,108.836,101.066,102.9
|
||||
162,110.3,102.488,104.333
|
||||
163,111.718,103.86,105.716
|
||||
164,113.083,105.178,107.045
|
||||
|
378
cross_section/extract_yields.C
Executable file
378
cross_section/extract_yields.C
Executable file
|
|
@ -0,0 +1,378 @@
|
|||
// Step 1 in ROOT: yields out of ROOT, into a plain CSV histogram. The ROOT twin of extract_yields.py:
|
||||
// same config, same output (<out_dir>/yields_<det>.csv), same format. Use whichever is handier.
|
||||
//
|
||||
// root -l -b -q 'extract_yields.C+("examples/27Al_ap_runA.toml")'
|
||||
// root -l -b -q 'extract_yields.C+("examples/27Al_ap_runA.toml", "out/elsewhere")' // another output folder
|
||||
// // (relative to where root runs)
|
||||
// THE CSV FORMAT (cross_section.py reads only this)
|
||||
// 1D: <var>_lo, <var>_hi, counts, variance
|
||||
// 2D: <var>_lo, <var>_hi, theta_cm_lo, theta_cm_hi, counts, variance (angular mode)
|
||||
// <var> is z (mm), e_beam (MeV) or ecm (MeV). One row per bin; under/overflow are not written.
|
||||
//
|
||||
// CONFIG: the [extract] section, `dets`, `out_dir`, `title` and [det_vars.<det>] of the study's TOML, exactly as for
|
||||
// extract_yields.py (keys listed there). Two differences:
|
||||
// - `cut` is handed to TTree::Draw. Write it with and / or (e.g. "det == 1 and e_si > 0.5"): they become && / ||
|
||||
// here and stay valid pandas syntax for the Python version.
|
||||
// - A tree histogram puts an entry exactly on the last upper edge in the overflow (numpy puts it in the last bin).
|
||||
// The TOML reader below handles only what these configs use: "strings", numbers, one-line [lists] and
|
||||
// { start = .., stop = .., step = .. } tables. Anything else stops with an error.
|
||||
|
||||
#include <TChain.h>
|
||||
#include <TDirectory.h>
|
||||
#include <TFile.h>
|
||||
#include <TKey.h>
|
||||
#include <TH1.h>
|
||||
#include <TH2.h>
|
||||
#include <TROOT.h>
|
||||
#include <TString.h>
|
||||
#include <TSystem.h>
|
||||
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <fstream>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace xs {
|
||||
|
||||
using Section = std::map<std::string, std::string>; // key -> raw value text
|
||||
using Config = std::map<std::string, Section>; // section name ("" = top level) -> keys
|
||||
|
||||
// ============================================================ minimal TOML reading
|
||||
|
||||
std::string Trim(const std::string& s)
|
||||
{
|
||||
const auto a = s.find_first_not_of(" \t\r\n");
|
||||
if (a == std::string::npos) return "";
|
||||
const auto b = s.find_last_not_of(" \t\r\n");
|
||||
return s.substr(a, b - a + 1);
|
||||
}
|
||||
|
||||
std::string StripComment(const std::string& line)
|
||||
{
|
||||
bool inString = false;
|
||||
for (size_t i = 0; i < line.size(); ++i) {
|
||||
if (line[i] == '"') inString = !inString;
|
||||
if (line[i] == '#' && !inString) return line.substr(0, i);
|
||||
}
|
||||
return line;
|
||||
}
|
||||
|
||||
Config ReadToml(const std::string& file)
|
||||
{
|
||||
std::ifstream in(file);
|
||||
if (!in) throw std::runtime_error("cannot open config " + file);
|
||||
Config config;
|
||||
std::string section, line;
|
||||
while (std::getline(in, line)) {
|
||||
line = Trim(StripComment(line));
|
||||
if (line.empty()) continue;
|
||||
if (line.rfind("[[", 0) == 0) { section = line; continue; } // array tables (e.g. [[reference]]): not used here
|
||||
if (line[0] == '[') { section = Trim(line.substr(1, line.size() - 2)); continue; }
|
||||
const auto eq = line.find('=');
|
||||
if (eq == std::string::npos) throw std::runtime_error("cannot read config line: " + line);
|
||||
const std::string value = Trim(line.substr(eq + 1));
|
||||
if ((value[0] == '[' && value.back() != ']') || (value[0] == '{' && value.back() != '}'))
|
||||
throw std::runtime_error("lists and tables must be on one line: " + line);
|
||||
config[section][Trim(line.substr(0, eq))] = value;
|
||||
}
|
||||
return config;
|
||||
}
|
||||
|
||||
std::string Unquote(const std::string& v)
|
||||
{
|
||||
if (v.size() >= 2 && v.front() == '"' && v.back() == '"') return v.substr(1, v.size() - 2);
|
||||
return v;
|
||||
}
|
||||
|
||||
// "[a, b]" or "{ k = v, ... }" -> its items, split on commas outside quotes
|
||||
std::vector<std::string> SplitItems(const std::string& v)
|
||||
{
|
||||
std::vector<std::string> items;
|
||||
std::string inner = Trim(v.substr(1, v.size() - 2)), item;
|
||||
bool inString = false;
|
||||
for (char c : inner) {
|
||||
if (c == '"') inString = !inString;
|
||||
if (c == ',' && !inString) { items.push_back(Trim(item)); item.clear(); }
|
||||
else item += c;
|
||||
}
|
||||
if (!Trim(item).empty()) items.push_back(Trim(item));
|
||||
return items;
|
||||
}
|
||||
|
||||
// Bin edges from [e0, e1, ...] or { start = .., stop = .., step = .. } (stop included), computed as numpy does
|
||||
std::vector<double> Edges(const std::string& v)
|
||||
{
|
||||
std::vector<double> edges;
|
||||
if (v.front() == '[') {
|
||||
for (const auto& item : SplitItems(v)) edges.push_back(std::stod(item));
|
||||
return edges;
|
||||
}
|
||||
std::map<std::string, double> table;
|
||||
for (const auto& item : SplitItems(v)) {
|
||||
const auto eq = item.find('=');
|
||||
table[Trim(item.substr(0, eq))] = std::stod(Trim(item.substr(eq + 1)));
|
||||
}
|
||||
const double start = table.at("start"), stop = table.at("stop"), step = table.at("step");
|
||||
const long nBins = std::lround((stop - start) / step);
|
||||
for (long i = 0; i <= nBins; ++i) edges.push_back(start + step * i);
|
||||
return edges;
|
||||
}
|
||||
|
||||
// The [extract] section of one detector: every string with {det} and the [det_vars.<det>] keys replaced
|
||||
Section ExtractSection(const Config& config, const std::string& det)
|
||||
{
|
||||
std::map<std::string, std::string> replacements = {{"det", det}};
|
||||
const auto vars = config.find("det_vars." + det);
|
||||
if (vars != config.end())
|
||||
for (const auto& kv : vars->second) replacements[kv.first] = Unquote(kv.second);
|
||||
const auto ex = config.find("extract");
|
||||
if (ex == config.end()) throw std::runtime_error("the config has no [extract] section");
|
||||
Section out;
|
||||
for (const auto& kv : ex->second) {
|
||||
TString value = kv.second.c_str();
|
||||
for (const auto& r : replacements) value.ReplaceAll(("{" + r.first + "}").c_str(), r.second.c_str());
|
||||
out[kv.first] = value.Data();
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
std::string Get(const Section& s, const std::string& key, const std::string& fallback = "\x01")
|
||||
{
|
||||
const auto it = s.find(key);
|
||||
if (it != s.end()) return Unquote(it->second);
|
||||
if (fallback == "\x01") throw std::runtime_error("[extract] needs the key " + key);
|
||||
return fallback;
|
||||
}
|
||||
|
||||
// ============================================================ the yields table
|
||||
|
||||
struct Row {
|
||||
double lo, hi, thetaLo, thetaHi, counts, variance;
|
||||
};
|
||||
|
||||
// Sum of weights squared of a bin (global index); a histogram without Sumw2 counts each entry once
|
||||
double Variance(const TH1* h, int bin)
|
||||
{
|
||||
return h->GetSumw2N() > 0 ? h->GetSumw2()->At(bin) : h->GetBinContent(bin);
|
||||
}
|
||||
|
||||
// The histogram at "folder/name". A name that itself contains '/' (e.g. "dE_(z/100)=1") is not reachable with Get(),
|
||||
// so each split into an existing folder + a key of that folder is also tried. Not found: the error names the
|
||||
// histograms whose path matches when case is ignored (e.g. "elastic+misc_qqq_a" for "elastic+misc_QQQ_a").
|
||||
TH1* FindHistogram(TFile* file, const std::string& path)
|
||||
{
|
||||
if (auto* h = dynamic_cast<TH1*>(file->Get(path.c_str()))) return h;
|
||||
// every split into folder + name: at each '/', from the last one back, and finally no folder at all
|
||||
std::vector<std::pair<std::string, std::string>> splits;
|
||||
for (size_t i = path.size(); i-- > 0;)
|
||||
if (path[i] == '/') splits.emplace_back(path.substr(0, i), path.substr(i + 1));
|
||||
splits.emplace_back("", path);
|
||||
for (const auto& [folder, name] : splits) {
|
||||
TDirectory* dir = folder.empty() ? static_cast<TDirectory*>(file) : file->GetDirectory(folder.c_str());
|
||||
if (!dir) continue;
|
||||
if (TKey* key = dir->GetKey(name.c_str()))
|
||||
if (auto* h = dynamic_cast<TH1*>(key->ReadObj())) return h;
|
||||
}
|
||||
std::string close;
|
||||
TString lower = path.c_str();
|
||||
lower.ToLower();
|
||||
std::function<void(TDirectory*, const std::string&)> walk = [&](TDirectory* dir, const std::string& prefix) {
|
||||
for (auto* obj : *dir->GetListOfKeys()) {
|
||||
auto* key = static_cast<TKey*>(obj);
|
||||
const std::string full = prefix + key->GetName();
|
||||
if (TString(key->GetClassName()).BeginsWith("TDirectory"))
|
||||
walk(dir->GetDirectory(key->GetName()), full + "/");
|
||||
else if (TString(full.c_str()).EqualTo(lower, TString::kIgnoreCase))
|
||||
close += " '" + full + "'";
|
||||
}
|
||||
};
|
||||
walk(file, "");
|
||||
throw std::runtime_error("no histogram " + path + " in " + file->GetName() + (close.empty() ? "" : "; same path ignoring case:" + close) +
|
||||
". Paths are case-sensitive; for upper-case names per detector use [det_vars], e.g. DET = \"QQQ\"");
|
||||
}
|
||||
|
||||
std::vector<Row> FromHistogram(const Section& ex, const std::string& path, bool& twoD)
|
||||
{
|
||||
TFile* file = TFile::Open(path.c_str());
|
||||
if (!file || file->IsZombie()) throw std::runtime_error("cannot open " + path);
|
||||
const std::string name = Get(ex, "hist");
|
||||
TH1* h = FindHistogram(file, name);
|
||||
|
||||
std::vector<Row> rows;
|
||||
twoD = false;
|
||||
if (h->GetDimension() == 1) {
|
||||
for (int i = 1; i <= h->GetNbinsX(); ++i)
|
||||
rows.push_back({h->GetXaxis()->GetBinLowEdge(i), h->GetXaxis()->GetBinUpEdge(i), 0, 0,
|
||||
h->GetBinContent(i), Variance(h, i)});
|
||||
file->Close();
|
||||
return rows;
|
||||
}
|
||||
|
||||
// TH2: `axis` holds the variable; the other axis is theta_cm (angle_axis given) or is summed
|
||||
const bool varOnX = Get(ex, "axis", "x") == "x";
|
||||
TH2* h2 = static_cast<TH2*>(h);
|
||||
TAxis* varAxis = varOnX ? h2->GetXaxis() : h2->GetYaxis();
|
||||
TAxis* otherAxis = varOnX ? h2->GetYaxis() : h2->GetXaxis();
|
||||
const int nVar = varAxis->GetNbins(), nOther = otherAxis->GetNbins();
|
||||
auto global = [&](int iVar, int iOther) { return varOnX ? h2->GetBin(iVar, iOther) : h2->GetBin(iOther, iVar); };
|
||||
|
||||
if (ex.count("angle_axis")) { // keep it 2D: one row per (variable bin, theta bin)
|
||||
twoD = true;
|
||||
for (int i = 1; i <= nVar; ++i)
|
||||
for (int j = 1; j <= nOther; ++j)
|
||||
rows.push_back({varAxis->GetBinLowEdge(i), varAxis->GetBinUpEdge(i), otherAxis->GetBinLowEdge(j),
|
||||
otherAxis->GetBinUpEdge(j), h2->GetBinContent(global(i, j)), Variance(h2, global(i, j))});
|
||||
file->Close();
|
||||
return rows;
|
||||
}
|
||||
|
||||
// project on the variable: the other axis summed whole (with under/overflow), or the fraction inside other_range
|
||||
std::vector<double> weight(nOther + 2, 1.0);
|
||||
if (ex.count("other_range")) {
|
||||
const auto range = Edges(ex.at("other_range"));
|
||||
weight.front() = weight.back() = 0.0;
|
||||
for (int j = 1; j <= nOther; ++j) {
|
||||
const double lo = otherAxis->GetBinLowEdge(j), hi = otherAxis->GetBinUpEdge(j);
|
||||
weight[j] = std::max(0.0, std::min(hi, range[1]) - std::max(lo, range[0])) / (hi - lo);
|
||||
}
|
||||
}
|
||||
for (int i = 1; i <= nVar; ++i) {
|
||||
double counts = 0, variance = 0;
|
||||
for (int j = 0; j <= nOther + 1; ++j) {
|
||||
counts += weight[j] * h2->GetBinContent(global(i, j));
|
||||
variance += weight[j] * weight[j] * Variance(h2, global(i, j));
|
||||
}
|
||||
rows.push_back({varAxis->GetBinLowEdge(i), varAxis->GetBinUpEdge(i), 0, 0, counts, variance});
|
||||
}
|
||||
file->Close();
|
||||
return rows;
|
||||
}
|
||||
|
||||
std::vector<Row> FromTree(const Section& ex, const std::vector<std::string>& files, bool& twoD)
|
||||
{
|
||||
TChain chain(Get(ex, "tree").c_str());
|
||||
for (const auto& f : files) chain.Add(f.c_str()); // TChain::Add takes wildcards in the file name
|
||||
if (chain.GetEntries() <= 0) // a missing tree or file must not become a table of zeros
|
||||
throw std::runtime_error("no entries in tree " + Get(ex, "tree") + " of " + files.front() + (files.size() > 1 ? " ..." : ""));
|
||||
|
||||
// The cut, with and / or as && / ||; a weight branch multiplies it
|
||||
TString cut = Get(ex, "cut", "").c_str();
|
||||
cut.ReplaceAll(" and ", " && ").ReplaceAll(" or ", " || ");
|
||||
if (cut.IsNull()) cut = "1";
|
||||
TString selection = ex.count("weight_branch") ? TString::Format("(%s)*(%s)", Get(ex, "weight_branch").c_str(), cut.Data())
|
||||
: cut;
|
||||
|
||||
const auto edges = Edges(ex.at("bins"));
|
||||
const TString branch = Get(ex, "branch").c_str();
|
||||
gROOT->cd();
|
||||
std::vector<Row> rows;
|
||||
twoD = ex.count("angle_branch") > 0;
|
||||
if (!twoD) {
|
||||
TH1D h("h_extract_yields", "", edges.size() - 1, edges.data());
|
||||
h.Sumw2();
|
||||
const Long64_t n = chain.Draw(branch + ">>h_extract_yields", selection, "goff");
|
||||
printf(" %d file(s); %lld entries after the cut\n", chain.GetListOfFiles()->GetEntries(), n);
|
||||
for (int i = 1; i <= h.GetNbinsX(); ++i)
|
||||
rows.push_back({edges[i - 1], edges[i], 0, 0, h.GetBinContent(i), Variance(&h, i)});
|
||||
return rows;
|
||||
}
|
||||
const auto angleEdges = Edges(ex.at("angle_bins"));
|
||||
TH2D h("h_extract_yields2", "", edges.size() - 1, edges.data(), angleEdges.size() - 1, angleEdges.data());
|
||||
h.Sumw2();
|
||||
const Long64_t n = chain.Draw(TString(Get(ex, "angle_branch").c_str()) + ":" + branch + ">>h_extract_yields2",
|
||||
selection, "goff"); // "y:x" in TTree::Draw
|
||||
printf(" %d file(s); %lld entries after the cut\n", chain.GetListOfFiles()->GetEntries(), n);
|
||||
for (size_t i = 1; i < edges.size(); ++i)
|
||||
for (size_t j = 1; j < angleEdges.size(); ++j)
|
||||
rows.push_back({edges[i - 1], edges[i], angleEdges[j - 1], angleEdges[j], h.GetBinContent(h.GetBin(i, j)),
|
||||
Variance(&h, h.GetBin(i, j))});
|
||||
return rows;
|
||||
}
|
||||
|
||||
void WriteCsv(const std::vector<Row>& rows, bool twoD, const std::string& var, const std::vector<std::string>& header,
|
||||
const std::string& outFile)
|
||||
{
|
||||
FILE* f = fopen(outFile.c_str(), "w");
|
||||
if (!f) throw std::runtime_error("cannot write " + outFile);
|
||||
for (const auto& line : header) fprintf(f, "# %s\n", line.c_str());
|
||||
fprintf(f, twoD ? "%s_lo,%s_hi,theta_cm_lo,theta_cm_hi,counts,variance\n" : "%s_lo,%s_hi,counts,variance\n",
|
||||
var.c_str(), var.c_str());
|
||||
for (const auto& r : rows) {
|
||||
if (twoD) fprintf(f, "%.6g,%.6g,%.6g,%.6g,%.6g,%.6g\n", r.lo, r.hi, r.thetaLo, r.thetaHi, r.counts, r.variance);
|
||||
else fprintf(f, "%.6g,%.6g,%.6g,%.6g\n", r.lo, r.hi, r.counts, r.variance);
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
} // namespace xs
|
||||
|
||||
void extract_yields(const char* configFile, const char* outDirOverride = "")
|
||||
{
|
||||
using namespace xs;
|
||||
try {
|
||||
const Config config = ReadToml(configFile);
|
||||
const std::string configDir = gSystem->GetDirName(configFile).Data();
|
||||
auto fullPath = [&](const std::string& p) -> std::string {
|
||||
if (p.rfind("~/", 0) == 0 && getenv("HOME")) return std::string(getenv("HOME")) + p.substr(1); // "~/..." = home
|
||||
return p.empty() || p[0] == '/' ? p : configDir + "/" + p;
|
||||
};
|
||||
|
||||
const Section& top = config.count("") ? config.at("") : Section();
|
||||
std::vector<std::string> dets = {""};
|
||||
if (top.count("dets")) {
|
||||
dets.clear();
|
||||
for (const auto& d : SplitItems(top.at("dets"))) dets.push_back(Unquote(d));
|
||||
}
|
||||
const std::string outDir = *outDirOverride ? std::string(outDirOverride)
|
||||
: fullPath(top.count("out_dir") ? Unquote(top.at("out_dir")) : "out");
|
||||
gSystem->mkdir(outDir.c_str(), kTRUE);
|
||||
const std::string title = top.count("title") ? Unquote(top.at("title")) : "";
|
||||
|
||||
for (const auto& det : dets) {
|
||||
const Section ex = ExtractSection(config, det);
|
||||
const std::string source = Get(ex, "source"), var = Get(ex, "variable");
|
||||
if (source != "hist" && source != "tree")
|
||||
throw std::runtime_error("[extract] source must be \"hist\" or \"tree\", not " + source +
|
||||
(source == "csv" ? " (event-list CSVs: use extract_yields.py)" : ""));
|
||||
std::vector<std::string> files; // `file` may be one path or a list
|
||||
if (ex.at("file").front() == '[') for (const auto& f : SplitItems(ex.at("file"))) files.push_back(fullPath(Unquote(f)));
|
||||
else files.push_back(fullPath(Get(ex, "file")));
|
||||
const std::string fileText = ex.at("file").front() == '[' ? ex.at("file") : Get(ex, "file");
|
||||
printf("--- %s: %s : %s\n", det.empty() ? "data" : det.c_str(), fileText.c_str(),
|
||||
Get(ex, source == "hist" ? "hist" : "tree").c_str());
|
||||
|
||||
bool twoD = false;
|
||||
std::vector<Row> rows;
|
||||
std::string from;
|
||||
if (source == "hist") {
|
||||
rows = FromHistogram(ex, files.front(), twoD);
|
||||
from = "histogram " + Get(ex, "hist");
|
||||
} else if (source == "tree") {
|
||||
rows = FromTree(ex, files, twoD);
|
||||
from = "tree " + Get(ex, "tree") + ", branch " + Get(ex, "branch");
|
||||
if (!Get(ex, "cut", "").empty()) from += ", cut: " + Get(ex, "cut");
|
||||
} else {
|
||||
throw std::runtime_error("[extract] source must be \"hist\" or \"tree\", not " + source +
|
||||
(source == "csv" ? " (event-list CSVs: use extract_yields.py)" : ""));
|
||||
}
|
||||
|
||||
TString detUpper = det.c_str();
|
||||
detUpper.ToUpper();
|
||||
const std::string outFile = outDir + "/" + (det.empty() ? "yields.csv" : "yields_" + det + ".csv");
|
||||
WriteCsv(rows, twoD, var,
|
||||
{title + " " + detUpper.Data() + ": yields, binned in " + var, "from " + fileText + " : " + from,
|
||||
"written by extract_yields.C"},
|
||||
outFile);
|
||||
double total = 0;
|
||||
for (const auto& r : rows) total += r.counts;
|
||||
printf(" %.0f counts in %zu bins -> %s\n", total, rows.size(), outFile.c_str());
|
||||
}
|
||||
} catch (const std::exception& e) {
|
||||
fprintf(stderr, "extract_yields.C: %s\n", e.what());
|
||||
gSystem->Exit(1); // a failed extraction must not look like a finished one
|
||||
}
|
||||
}
|
||||
164
cross_section/geometric_efficiency.py
Executable file
164
cross_section/geometric_efficiency.py
Executable file
|
|
@ -0,0 +1,164 @@
|
|||
"""Step 2: geometric efficiency of every bin, for the detectors as they are now (detectors.py).
|
||||
|
||||
~/myenv/bin/python -B geometric_efficiency.py examples/27Al_ap_runA.toml # ~1 min; numpy and pandas only
|
||||
|
||||
A toy Monte Carlo per bin (same bins as the cross section):
|
||||
- vertices uniform over the bin's stretch of beam path (angular mode: over the window);
|
||||
- beam energy at each vertex from the nominal beam track;
|
||||
- the residual nucleus' state drawn from [reaction] states: fixed weights, or state cross sections
|
||||
from a table (e.g. TALYS) at the bin's nominal E_cm;
|
||||
- emission isotropic in the CM (angular mode: cos theta_cm uniform inside the theta bin, theta_cm of the ejectile);
|
||||
- relativistic two-body kinematics, straight tracks from the vertex.
|
||||
|
||||
Writes <out_dir>/eps_<det>.csv, one row per bin, with these efficiencies (each times the azimuthal coverage):
|
||||
eps_si the particle reaches the analysed silicon (solid angle)
|
||||
eps_si_thr eps_si, and its energy at the vertex is above the Si threshold (the ch5 "solid angle" convention;
|
||||
a kinematic cut, not geometry)
|
||||
eps_counter eps_si, and it crosses the guard, anode and cathode radii inside the counter
|
||||
eps_geometric eps_counter, and it clears the beam tube and the PCB hole <- THE GEOMETRIC EFFICIENCY
|
||||
and the Monte Carlo relative error of each (<name>_rel_err).
|
||||
Not included, because they are not geometry: energy loss in the gas, the Si threshold after the gas, the counter's
|
||||
deposit threshold, intrinsic efficiencies. They are why the adopted eps_tube of ../scratch/xs_27Al_lowE_2026-10-15 is lower.
|
||||
|
||||
CONFIG
|
||||
[reaction] beam_mass_u, target_mass_u, ejectile_mass_u, recoil_mass_u (atomic masses; Q from these)
|
||||
detect = "ejectile" (default) or "recoil": the particle the silicon sees
|
||||
states = [{ex_mev = 0.0, weight = 1.0}, ...] fixed state weights, or
|
||||
states_csv = file with ecm_mev and one column ex_<Ex in MeV> per state (state cross sections)
|
||||
[efficiency] n_per_bin (default 400000), seed
|
||||
[beam], [bins], mode, dets as for the cross section.
|
||||
"""
|
||||
import argparse
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
import common
|
||||
import detectors
|
||||
|
||||
U = 931.49410242 # MeV per u
|
||||
EFFICIENCIES = ("eps_si", "eps_si_thr", "eps_counter", "eps_geometric")
|
||||
|
||||
|
||||
def two_body(t_beam, reaction, ex, cos_cm):
|
||||
"""Relativistic two-body kinematics, beam on target at rest -> ejectile (at cos_cm in the CM) + recoil (state ex).
|
||||
Returns the lab kinetic energy (MeV) and polar angle (rad) of the detected particle, and whether the channel is
|
||||
open at this beam energy."""
|
||||
m1, m2 = reaction["beam_mass_u"] * U, reaction["target_mass_u"] * U
|
||||
m3, m4 = reaction["ejectile_mass_u"] * U, reaction["recoil_mass_u"] * U + ex
|
||||
s = (m1 + m2) ** 2 + 2 * m2 * t_beam # invariant mass squared
|
||||
sqrt_s = np.sqrt(s)
|
||||
is_open = sqrt_s > m3 + m4
|
||||
e_total = t_beam + m1 + m2
|
||||
beta = np.sqrt(t_beam ** 2 + 2 * t_beam * m1) / e_total # of the CM in the lab
|
||||
gamma = e_total / sqrt_s
|
||||
p_cm = np.sqrt(np.clip((s - (m3 + m4) ** 2) * (s - (m3 - m4) ** 2), 0, None)) / (2 * sqrt_s)
|
||||
sin_cm = np.sqrt(1 - cos_cm ** 2)
|
||||
|
||||
# the recoil goes the opposite way in the CM
|
||||
mass, sign = (m3, 1.0) if reaction.get("detect", "ejectile") == "ejectile" else (m4, -1.0)
|
||||
e_cm = np.sqrt(p_cm ** 2 + mass ** 2)
|
||||
p_z = gamma * (sign * p_cm * cos_cm + beta * e_cm)
|
||||
energy = gamma * (e_cm + beta * sign * p_cm * cos_cm)
|
||||
theta = np.arctan2(p_cm * sin_cm, p_z)
|
||||
return np.where(is_open, energy - mass, 0.0), theta, is_open
|
||||
|
||||
|
||||
def q_value_mev(reaction):
|
||||
return (reaction["beam_mass_u"] + reaction["target_mass_u"]
|
||||
- reaction["ejectile_mass_u"] - reaction["recoil_mass_u"]) * U
|
||||
|
||||
|
||||
def state_weights(reaction, ecm, states_table):
|
||||
"""Excitation energies of the residual nucleus and their probabilities at this E_cm. States that are closed
|
||||
(Ex >= Q + E_cm) get weight 0; if none is open, the ground state alone."""
|
||||
if states_table is None:
|
||||
states = reaction.get("states", [{"ex_mev": 0.0, "weight": 1.0}])
|
||||
ex = np.array([s["ex_mev"] for s in states], float)
|
||||
w = np.array([s["weight"] for s in states], float)
|
||||
else:
|
||||
columns = [c for c in states_table.columns if c.startswith("ex_")]
|
||||
ex = np.array([float(c[3:]) for c in columns])
|
||||
# the table row nearest this E_cm, among rows with any cross section (below the first such row, its weights)
|
||||
rows = states_table[states_table[columns].sum(axis=1) > 0]
|
||||
row = rows.iloc[np.argmin(np.abs(rows["ecm_mev"].to_numpy() - max(ecm, rows["ecm_mev"].min())))]
|
||||
w = row[columns].to_numpy(float)
|
||||
w = np.where(ex < q_value_mev(reaction) + ecm, w, 0.0)
|
||||
if w.sum() <= 0:
|
||||
w = (ex == 0).astype(float)
|
||||
return ex, w / w.sum()
|
||||
|
||||
|
||||
def efficiency_of_bin(det, reaction, track, z_range, cos_range, ecm, states_table, n, rng):
|
||||
"""Toy for one bin: n reactions with vertices uniform in z_range and cos(theta_cm) uniform in cos_range."""
|
||||
z = rng.uniform(z_range[0], z_range[1], n)
|
||||
t_beam = track.energy_at(z, nominal=True)
|
||||
ex_states, weights = state_weights(reaction, ecm, states_table)
|
||||
ex = rng.choice(ex_states, size=n, p=weights)
|
||||
cos_cm = rng.uniform(cos_range[0], cos_range[1], n)
|
||||
energy, theta, is_open = two_body(t_beam, reaction, ex, cos_cm)
|
||||
is_open &= t_beam > 0
|
||||
|
||||
on_si = is_open & detectors.hits_silicon(det, z, theta)
|
||||
passed = {"eps_si": on_si,
|
||||
"eps_si_thr": on_si & (energy > detectors.SI_THRESHOLD_MEV[det]),
|
||||
"eps_counter": on_si & detectors.crosses_counter(z, theta)}
|
||||
passed["eps_geometric"] = passed["eps_counter"] & detectors.clears_apertures(z, theta)
|
||||
|
||||
phi = detectors.PHI_FRACTION[det]
|
||||
row = {"ground_state_weight": float(weights[ex_states == 0].sum()), "frac_open": float(is_open.mean())}
|
||||
for name, ok in passed.items():
|
||||
p = ok.mean()
|
||||
row[name] = phi * p
|
||||
row[f"{name}_rel_err"] = np.sqrt(p * (1 - p) / n) / p if p > 0 else np.nan # binomial
|
||||
return row
|
||||
|
||||
|
||||
def main(argv=None):
|
||||
parser = argparse.ArgumentParser(description="Step 2: geometric efficiency per bin (detectors.py).")
|
||||
parser.add_argument("config", help="TOML config file")
|
||||
args = parser.parse_args(argv)
|
||||
config, full_path = common.read_config(args.config)
|
||||
|
||||
for det in config.get("dets", [""]):
|
||||
c = common.config_for_detector(config, det)
|
||||
reaction, settings = c["reaction"], c.get("efficiency", {})
|
||||
mode = c.get("mode", "excitation")
|
||||
k = common.ecm_per_beam_energy(reaction)
|
||||
track = common.load_beam_track(c["beam"], full_path)
|
||||
bins, window = common.make_bins(c, track, k)
|
||||
states_table = pd.read_csv(full_path(reaction["states_csv"]), comment="#") if "states_csv" in reaction else None
|
||||
rng = np.random.default_rng(settings.get("seed", 20261016))
|
||||
n = int(settings.get("n_per_bin", 400_000))
|
||||
|
||||
rows = []
|
||||
for _, b in bins.iterrows():
|
||||
if b["dz_mm"] <= 0: # past the beam's stopping point
|
||||
rows.append({name: np.nan for name in EFFICIENCIES})
|
||||
continue
|
||||
if mode == "excitation":
|
||||
ecm = b["ecm_nominal_mev"]
|
||||
cos_range = (-1.0, 1.0)
|
||||
else:
|
||||
ecm = k * track.energy_at(0.5 * (b["z_up_mm"] + b["z_down_mm"]), nominal=True)
|
||||
cos_range = (np.cos(np.radians(b["theta_hi_deg"])), np.cos(np.radians(b["theta_lo_deg"])))
|
||||
rows.append(efficiency_of_bin(det, reaction, track, (b["z_up_mm"], b["z_down_mm"]), cos_range,
|
||||
ecm, states_table, n, rng))
|
||||
table = pd.concat([bins.reset_index(drop=True), pd.DataFrame(rows)], axis=1)
|
||||
|
||||
states_text = reaction.get("states_csv", reaction.get("states", "ground state only"))
|
||||
header = [f"{c.get('title', '')} {det.upper()}: geometric efficiency per bin ({mode} mode), detectors.py",
|
||||
f"beam track: {track.description}; Q = {q_value_mev(reaction):.4f} MeV; detected: "
|
||||
f"{reaction.get('detect', 'ejectile')}; states: {states_text}",
|
||||
f"isotropic CM, straight tracks, {n} reactions per bin; azimuthal coverage {detectors.PHI_FRACTION[det]:.4f}",
|
||||
"eps_geometric = silicon + counter + apertures; eps_si_thr adds the Si threshold at the vertex energy",
|
||||
"written by geometric_efficiency.py"]
|
||||
out = common.output_file(config, full_path, "eps", det)
|
||||
common.write_csv(table, header, out)
|
||||
x_col = "ecm_nominal_mev" if mode == "excitation" else "theta_c_deg"
|
||||
print(f"--- {det}: -> {out}")
|
||||
print(table[[x_col, *EFFICIENCIES]].to_string(index=False, float_format=lambda v: f"{v:.4g}"))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
7146
cross_section/inputs/beam_tracks.csv
Executable file
7146
cross_section/inputs/beam_tracks.csv
Executable file
File diff suppressed because it is too large
Load Diff
182
cross_section/inputs/talys_27Al_ap.csv
Executable file
182
cross_section/inputs/talys_27Al_ap.csv
Executable file
|
|
@ -0,0 +1,182 @@
|
|||
# 27Al(a,p)30Si; TALYS 2.2 run /home/vsitaraman/TALYS/runs/al027_a_v3
|
||||
# E_cm = E_a,lab * 0.870818 (xs_series.py LAB2CM); grid as calculated, no smoothing
|
||||
# sigma_total_mb = sum of the discrete-state columns ex_<Ex MeV> (fig2 'all levels (sum)')
|
||||
# group_<label>_mb = states in ch5 tab:level_windows groups; sigma_channel_mb = <prefix>.tot (discrete + continuum)
|
||||
# written by tools/xs/02_export_talys.py
|
||||
ecm_mev,e_alpha_lab_mev,sigma_total_mb,ex_0.000,ex_2.235,ex_3.498,ex_3.769,ex_3.788,ex_4.810,ex_4.831,ex_5.231,ex_5.279,ex_5.372,ex_5.487,ex_5.614,ex_5.951,ex_6.503,ex_6.537,ex_6.641,ex_6.693,ex_6.744,ex_6.865,ex_6.915,ex_6.999,ex_7.043,ex_7.079,ex_7.223,ex_7.256,ex_7.441,ex_7.508,ex_7.612,ex_7.624,ex_7.634,ex_7.667,ex_7.810,ex_7.912,ex_8.105,ex_8.156,ex_8.163,ex_8.191,ex_8.194,ex_8.290,ex_8.333,ex_8.441,group_3.498_mb,group_5.279_mb,group_5.951_mb,sigma_channel_mb
|
||||
0.435409,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
0.522491,0.6,1.01951e-15,1.00639e-15,1.31186e-17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.00639e-15
|
||||
0.609572,0.7,1.12487e-13,1.05676e-13,6.8115e-15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.12487e-13
|
||||
0.696654,0.8,5.08499e-12,4.57286e-12,5.12137e-13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5.08499e-12
|
||||
0.783736,0.9,1.18685e-10,1.01376e-10,1.73085e-11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.18685e-10
|
||||
0.870818,1,1.69172e-09,1.36621e-09,3.25514e-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.69172e-09
|
||||
0.957899,1.1,1.65257e-08,1.25813e-08,3.94447e-09,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.65258e-08
|
||||
1.04498,1.2,1.19945e-07,8.59853e-08,3.396e-08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.19945e-07
|
||||
1.13206,1.3,6.85888e-07,4.63489e-07,2.22398e-07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.85888e-07
|
||||
1.21914,1.4,3.21947e-06,2.0543e-06,1.16518e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.21947e-06
|
||||
1.30623,1.5,1.28906e-05,7.79398e-06,5.09659e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.28906e-05
|
||||
1.39331,1.6,4.50568e-05,2.59074e-05,1.91493e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.50568e-05
|
||||
1.48039,1.7,0.000140276,7.7005e-05,6.32703e-05,9.60429e-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9.60429e-10,0,0,0.000140276
|
||||
1.56747,1.8,0.000395317,0.000207929,0.000187369,1.85546e-08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.85546e-08,0,0,0.000395317
|
||||
1.65455,1.9,0.00100986,0.000504273,0.000505387,1.97973e-07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.97973e-07,0,0,0.00100986
|
||||
1.74164,2,0.00236725,0.0011237,0.00124211,1.43569e-06,1.38796e-09,1.37299e-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.43721e-06,0,0,0.00236725
|
||||
1.82872,2.1,0.0051701,0.00233611,0.00282613,7.83447e-06,2.24959e-08,2.43913e-09,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7.8594e-06,0,0,0.0051701
|
||||
1.9158,2.2,0.0106344,0.00457886,0.00602048,3.48358e-05,2.13766e-07,2.72104e-08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.50768e-05,0,0,0.0106344
|
||||
2.00288,2.3,0.0207647,0.00852755,0.012108,0.000127471,1.4281e-06,2.30062e-07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.000129129,0,0,0.0207647
|
||||
2.08996,2.4,0.0387206,0.0151787,0.0231334,0.000399641,7.47807e-06,1.32047e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00040844,0,0,0.0387206
|
||||
2.17704,2.5,0.0692895,0.0259559,0.0421901,0.00110647,3.11076e-05,5.83118e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00114341,0,0,0.0692895
|
||||
2.26413,2.6,0.119413,0.0427635,0.0737589,0.00276209,0.000106983,2.12336e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00289031,0,0,0.119413
|
||||
2.35121,2.7,0.198845,0.0681058,0.124035,0.00631933,0.000318235,6.65756e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00670414,0,0,0.198845
|
||||
2.43829,2.8,0.320768,0.105109,0.201228,0.013404,0.000841589,0.000184604,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0144302,0,0,0.320768
|
||||
2.52537,2.9,0.502444,0.157571,0.315767,0.0266254,0.00201934,0.000461748,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0291065,0,0,0.502444
|
||||
2.61245,3,0.765736,0.229909,0.480378,0.0499321,0.00445925,0.00105758,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0554489,0,0,0.765736
|
||||
2.69953,3.1,1.11004,0.317194,0.695971,0.0867457,0.00820774,0.00192171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0968752,0,0,1.11004
|
||||
2.78662,3.2,1.57272,0.431474,0.979329,0.143747,0.014709,0.00345723,1.06522e-06,2.23127e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.161913,3.29648e-06,0,1.57272
|
||||
2.8737,3.3,2.1909,0.57762,1.35161,0.229897,0.0256502,0.00609239,1.11277e-05,2.3353e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.261639,3.44807e-05,0,2.1909
|
||||
2.96078,3.4,3.00185,0.760865,1.83117,0.355774,0.043376,0.0104363,7.03793e-05,0.00015816,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.409586,0.000228539,0,3.00185
|
||||
3.04786,3.5,4.04369,0.985478,2.43514,0.533587,0.0710041,0.0173206,0.000322985,0.00083573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.621911,0.00115871,0,4.04369
|
||||
3.13494,3.6,5.35861,1.25591,3.18087,0.77715,0.112529,0.0278308,0.00118171,0.00314733,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.917511,0.00432904,0,5.35861
|
||||
3.22203,3.7,6.99025,1.57593,4.08392,1.10128,0.172845,0.0433193,0.00360405,0.00933418,1.22557e-05,7.10926e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.31744,0.0129576,0,6.99025
|
||||
3.30911,3.8,8.98163,1.94796,5.15663,1.52126,0.257578,0.0653734,0.00929943,0.02333,0.000113673,7.16291e-05,4.614e-08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.84422,0.0328147,0,8.98163
|
||||
3.39619,3.9,11.2605,2.33828,6.36246,2.03518,0.360942,0.0902712,0.0209987,0.0511599,0.000619245,0.00061132,5.66807e-07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.48639,0.0733898,0,11.2605
|
||||
3.48327,4,13.8861,2.77349,7.70183,2.64843,0.490437,0.122493,0.0428006,0.101119,0.00243035,0.00306432,5.22291e-06,2.56323e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3.26136,0.149445,0,13.8861
|
||||
3.57035,4.1,16.9375,3.25536,9.20179,3.3783,0.65475,0.163929,0.0805697,0.184086,0.00757477,0.0108395,2.77358e-05,0.000232322,2.65087e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4.19698,0.283332,0,16.9375
|
||||
3.65743,4.2,20.4517,3.7807,10.8581,4.22993,0.859535,0.216354,0.141953,0.313477,0.01989,0.0303904,0.000105791,0.00122841,2.53116e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5.30582,0.507069,0,20.4517
|
||||
3.74452,4.3,24.4525,4.34191,12.6533,5.20348,1.10873,0.281033,0.236123,0.505023,0.0457533,0.0719858,0.000323547,0.00468001,0.000157784,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6.59325,0.864047,0,24.4525
|
||||
3.8316,4.4,28.9555,4.93234,14.5645,6.28731,1.40521,0.359169,0.373858,0.774329,0.0931712,0.149863,0.000842725,0.0142052,0.000771644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8.05169,1.40704,0,28.9555
|
||||
3.91868,4.5,33.9684,5.54112,16.5594,7.47075,1.74793,0.45086,0.565757,1.13736,0.172597,0.281643,0.00193821,0.0363143,0.00272978,2.85664e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9.66954,2.19834,2.85664e-05,33.9684
|
||||
4.00576,4.6,39.5017,6.15885,18.6084,8.73141,2.13728,0.55653,0.822059,1.60921,0.296402,0.487675,0.00403241,0.081977,0.00767034,0.000245362,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11.4252,3.30903,0.000245362,39.5017
|
||||
4.09284,4.7,45.5488,6.77387,20.6718,10.0476,2.56703,0.675313,1.15143,2.20148,0.478034,0.790295,0.00774534,0.164572,0.0182945,0.00131649,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13.29,4.81184,0.00131649,45.5488
|
||||
4.17992,4.8,50.8447,7.14681,22.2044,11.1008,2.96059,0.787659,1.50946,2.86524,0.717049,1.2011,0.0136308,0.295726,0.0371005,0.00516313,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14.849,6.63931,0.00516313,50.8447
|
||||
4.26701,4.9,56.746,7.57978,23.7684,12.166,3.37486,0.910479,1.93566,3.63737,1.03117,1.73742,0.0225503,0.496567,0.0691125,0.0166091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16.4513,8.92985,0.0166091,56.746
|
||||
4.35409,5,63.1917,8.00751,25.3121,13.2379,3.80855,1.04112,2.43161,4.5223,1.43192,2.41608,0.0354556,0.784622,0.119746,0.0427309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.0876,11.7417,0.0427309,63.1917
|
||||
4.44117,5.1,70.206,8.41949,26.8296,14.3087,4.26005,1.17881,2.99625,5.51564,1.92763,3.24961,0.0533883,1.17766,0.195344,0.093782,9.77982e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.7476,15.1155,0.0937918,70.206
|
||||
4.52825,5.2,77.7436,8.80616,28.2869,15.3591,4.72292,1.32187,3.62144,6.60355,2.52233,4.2451,0.0773905,1.69082,0.302976,0.182892,0.000107224,1.10189e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21.4039,19.0636,0.183011,77.7436
|
||||
4.61533,5.3,85.778,9.16185,29.6632,16.3771,5.19074,1.46821,4.30173,7.77328,3.21721,5.40489,0.108416,2.33654,0.448453,0.325447,0.000879255,9.18651e-05,9.8221e-06,1.18644e-08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23.036,23.5905,0.326428,85.778
|
||||
4.70242,5.4,91.9193,9.28922,30.2081,16.9428,5.55445,1.59768,4.90034,8.68379,3.85235,6.56219,0.146305,3.03111,0.621507,0.524901,0.00401069,0.000442792,7.99369e-05,1.57814e-06,1.34386e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24.095,27.7976,0.529434,91.9193
|
||||
4.7895,5.5,98.793,9.44843,30.8692,17.526,5.92982,1.72979,5.51523,9.631,4.56286,7.84239,0.192083,3.89393,0.835002,0.802077,0.0131859,0.00156384,0.00041184,1.33951e-05,1.17052e-05,2.72147e-07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25.1856,32.4725,0.817238,98.793
|
||||
4.87658,5.6,106.24,9.59808,31.5394,18.1114,6.30431,1.86132,6.15027,10.6323,5.34994,9.25318,0.245935,4.88686,1.0931,1.17254,0.0347915,0.0044444,0.00156639,6.55556e-05,6.63922e-05,1.37631e-05,2.48926e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26.277,37.6115,1.21335,106.24
|
||||
4.96366,5.7,114.209,9.73544,32.2081,18.6997,6.67511,1.99141,6.79695,11.6616,6.20795,10.7834,0.307858,5.99681,1.39894,1.65078,0.078388,0.0107753,0.00485181,0.000230786,0.000295384,0.000110088,2.08627e-05,2.07923e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27.3662,43.1535,1.74479,114.209
|
||||
5.05074,5.8,122.496,9.84613,32.8105,19.2618,7.03222,2.11704,7.45069,12.705,7.12131,12.3919,0.377126,7.19478,1.75194,2.24124,0.156324,0.0231257,0.0124861,0.000650593,0.00097809,0.000510004,0.000112567,0.000169864,6.20637e-05,1.23012e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28.4111,48.9927,2.43318,122.496
|
||||
5.13782,5.9,131.021,9.93421,33.3532,19.7958,7.37646,2.23862,8.09208,13.7286,8.06524,14.0609,0.453197,8.45827,2.15109,2.95028,0.283117,0.0443538,0.0274324,0.00155958,0.00258273,0.00170732,0.000465335,0.000881029,0.000500465,1.04132e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.4109,55.0093,3.30518,131.021
|
||||
5.22491,6,138.816,9.93481,33.6069,20.1683,7.66124,2.34521,8.66934,14.614,8.96144,15.6904,0.534136,9.66384,2.57576,3.76531,0.473785,0.0775054,0.052897,0.00329534,0.00577919,0.00454773,0.00148537,0.00343451,0.00233585,5.46315e-05,2.17089e-05,2.85858e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30.1748,60.7089,4.3695,138.816
|
||||
5.31199,6.1,146.175,9.90403,33.7274,20.4327,7.90916,2.44264,9.16506,15.3442,9.77643,17.2458,0.617584,10.9143,3.01177,4.66977,0.743817,0.125838,0.0938128,0.00633076,0.0115253,0.0103013,0.00378044,0.0107403,0.00786599,0.000210338,0.000172255,2.34011e-05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30.7845,66.0752,5.63324,146.175
|
||||
5.39907,6.2,153.321,9.82424,33.752,20.6272,8.11605,2.52562,9.60597,16.018,10.5646,18.7611,0.703088,12.1221,3.45936,5.6783,1.10593,0.192595,0.15456,0.0111623,0.0208369,0.0207089,0.00821278,0.0268687,0.021276,0.000660011,0.000801373,0.000119655,2.59675e-07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31.2688,71.2342,7.13139,153.321
|
||||
5.48615,6.3,160.158,9.71363,33.6635,20.7355,8.27567,2.59326,9.97657,16.6087,11.3039,20.2359,0.78454,13.2833,3.90234,6.77287,1.56962,0.280481,0.239813,0.0182756,0.0350068,0.0379844,0.0158668,0.0574896,0.0489595,0.00168724,0.00270481,0.000450743,2.21167e-06,4.08155e-06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31.6045,76.0952,8.86279,160.158
|
||||
5.57323,6.4,166.046,9.55747,33.3816,20.714,8.38227,2.64662,10.254,17.0142,11.8983,21.5335,0.863393,14.3039,4.31928,7.90267,2.13546,0.390504,0.352355,0.0282092,0.0552766,0.0638346,0.0279074,0.109304,0.0992962,0.00368043,0.00731524,0.0013921,1.22782e-05,3.3074e-05,8.16426e-06,1.24922e-06,4.72626e-07,0,0,0,0,0,0,0,0,0,0,0,31.7429,80.1865,10.781,166.046
|
||||
5.66031,6.5,169.068,9.16185,32.3187,20.186,8.26104,2.62444,10.2367,16.9801,12.3273,22.3597,1.0613,15.0766,4.82594,9.1251,2.8287,0.523559,0.495123,0.0450875,0.0871244,0.102089,0.0462332,0.18702,0.180286,0.00751201,0.0167295,0.00347486,7.84005e-05,0.000163035,6.59094e-05,1.04089e-05,4.7371e-06,2.65135e-06,5.5097e-11,2.45516e-16,0,0,0,0,0,0,0,0,31.0715,82.8678,12.9725,169.068
|
||||
5.7474,6.6,174.328,8.96918,31.9659,20.0955,8.27842,2.64032,10.4049,17.2886,12.6581,23.4294,1.11971,15.9489,5.18425,10.3089,3.60122,0.680385,0.675961,0.0635323,0.12535,0.153367,0.071646,0.302338,0.305392,0.0134406,0.0343851,0.00749384,0.000270729,0.000600413,0.000351045,6.51681e-05,3.76862e-05,2.16825e-05,2.11855e-06,6.77592e-11,1.61457e-16,0,0,0,0,0,0,0,31.0142,86.0339,15.2665,174.328
|
||||
5.83448,6.7,180.249,8.79354,31.6426,20.0268,8.30163,2.65591,10.5663,17.5868,13.2295,24.4776,1.14959,16.7291,5.60947,11.5894,4.49632,0.86635,0.895422,0.0849886,0.171521,0.220851,0.106151,0.461587,0.48233,0.0224614,0.0641408,0.0144758,0.000745291,0.00178466,0.00143579,0.000290134,0.000174078,0.000106057,2.32074e-05,6.24425e-08,1.81675e-16,0,0,0,0,0,0,0,30.9843,89.3484,17.8475,180.25
|
||||
5.92156,6.8,186.459,8.64737,31.4018,20.0208,8.35089,2.67789,10.7535,17.9175,13.6043,25.4786,1.26219,17.4496,5.96297,12.8271,5.49137,1.08263,1.15554,0.112831,0.228518,0.304771,0.15148,0.672955,0.720318,0.0355487,0.110113,0.0257437,0.0017441,0.00452971,0.00454423,0.000930442,0.000577041,0.000380338,0.000185424,5.40052e-06,5.7916e-11,1.03429e-16,6.108e-17,5.44935e-17,8.75475e-17,0,0,0,31.0496,92.4288,20.5566,186.459
|
||||
6.00864,6.9,192.587,8.47653,31.087,19.9705,8.36785,2.68609,10.9058,18.2045,14.1545,26.377,1.27394,18.0212,6.32769,14.0709,6.57562,1.31923,1.44388,0.145072,0.297353,0.408034,0.206017,0.94045,1.02463,0.0533515,0.176518,0.0426383,0.00358939,0.00980429,0.0114901,0.00239241,0.00152539,0.00108947,0.000845446,4.39762e-05,1.59712e-08,3.29076e-11,1.94337e-11,8.66905e-12,1.78524e-16,1.25184e-16,0,0,31.0244,95.2647,23.4096,192.587
|
||||
6.09572,7,198.875,8.32732,30.8265,19.9539,8.39922,2.69773,11.0654,18.4991,14.4557,27.2094,1.3807,18.5308,6.68246,15.2939,7.68193,1.58565,1.76916,0.17931,0.378291,0.535819,0.275167,1.26909,1.40209,0.0770451,0.268267,0.0668323,0.0060779,0.0185445,0.0248942,0.00528552,0.00346021,0.00265714,0.00276797,0.000207881,2.57189e-06,3.85506e-07,2.17362e-07,1.76614e-11,5.67486e-11,3.97929e-11,1.39382e-16,0,31.0508,97.8234,26.3306,198.875
|
||||
6.18281,7.1,205.139,8.1764,30.5387,19.9205,8.42545,2.70723,11.2076,18.7571,14.9702,27.9511,1.37826,18.929,7.01204,16.3979,8.81368,1.87273,2.1269,0.220793,0.469746,0.685803,0.354698,1.65644,1.85171,0.10418,0.389041,0.0998504,0.0105262,0.0324339,0.0477167,0.0104047,0.00696838,0.00575342,0.00721043,0.000632513,2.20308e-05,3.87624e-06,3.37034e-06,3.17284e-06,2.39379e-05,1.09372e-08,4.42689e-11,1.85489e-15,31.0532,100.205,29.2112,205.139
|
||||
6.26989,7.2,211.657,8.02886,30.2453,19.8836,8.45192,2.71654,11.3401,18.9891,15.4324,28.6624,1.48435,19.2362,7.32454,17.5519,9.97086,2.17115,2.50774,0.266806,0.570613,0.857907,0.450093,2.10765,2.37585,0.137629,0.539434,0.141259,0.0146952,0.0535557,0.0841504,0.0187308,0.0126683,0.0106541,0.0161821,0.00174618,0.000111489,3.16155e-05,2.73351e-05,2.55793e-05,0.000191912,5.38688e-06,3.07794e-07,1.80322e-09,31.052,102.469,32.2016,211.657
|
||||
6.35697,7.3,217.731,7.89304,29.9798,19.8632,8.48696,2.72843,11.477,19.2213,15.6601,29.1836,1.47148,19.4708,7.58753,18.5233,11.1369,2.49335,2.89887,0.317107,0.67989,1.05218,0.559528,2.62099,2.97378,0.181138,0.7249,0.191969,0.0230779,0.083564,0.138276,0.0313229,0.0214283,0.0184284,0.0316693,0.00412191,0.000384128,0.000141533,0.000127314,0.000123002,0.00091989,4.40415e-05,3.71393e-06,2.04603e-07,31.0786,104.072,35.0524,217.731
|
||||
6.44405,7.4,223.849,7.73728,29.6433,19.7929,8.48882,2.72779,11.5755,19.4029,15.937,29.664,1.49688,19.6303,7.88163,19.581,12.2791,2.81445,3.29871,0.359996,0.783625,1.26441,0.680296,3.18325,3.63019,0.231588,0.948872,0.257571,0.0344279,0.123877,0.213224,0.0493487,0.0341783,0.0302974,0.0576501,0.00859058,0.00110041,0.000468159,0.000423723,0.000431094,0.0032199,0.00021926,3.07134e-05,1.47524e-05,31.0095,105.588,37.9733,223.849
|
||||
6.53113,7.5,229.097,7.5661,29.2547,19.678,8.4664,2.71806,11.6378,19.5425,16.0172,30.0635,1.58967,19.7077,8.06548,20.3096,13.2723,3.11877,3.68617,0.412555,0.880533,1.48307,0.809709,3.79816,4.34483,0.288709,1.20902,0.335267,0.0492433,0.175913,0.314588,0.0738986,0.0515021,0.0469576,0.097639,0.0158505,0.00231889,0.00124029,0.00113011,0.00121052,0.00905248,0.000787462,0.000130263,0.00014215,30.8625,106.624,40.3868,229.098
|
||||
6.61821,7.6,234.108,7.37334,28.7566,19.4797,8.40753,2.69803,11.6384,19.5772,16.3064,30.3366,1.54722,19.6686,8.25475,21.1627,14.329,3.41421,4.03554,0.46362,0.990991,1.69664,0.936685,4.44411,5.09579,0.351331,1.49917,0.423901,0.0678402,0.240102,0.443377,0.105465,0.0740731,0.0693129,0.154805,0.0274913,0.00505754,0.00280492,0.00257116,0.00285359,0.0216309,0.00228678,0.000440081,0.000291653,30.5853,107.329,42.9414,234.109
|
||||
6.7053,7.7,238.296,7.19397,28.2754,19.2825,8.35377,2.6807,11.629,19.5806,16.2315,30.5153,1.63542,19.6282,8.35718,21.6189,15.1329,3.69457,4.41199,0.51562,1.10149,1.92903,1.06149,5.1097,5.88028,0.419513,1.81776,0.523804,0.0905891,0.318318,0.602875,0.144983,0.102797,0.0984806,0.232457,0.0445782,0.00985202,0.00564742,0.00514371,0.00597043,0.0456278,0.00572951,0.00114801,0.00105287,30.3169,107.577,44.8584,238.298
|
||||
6.79238,7.8,242.643,7.00904,27.7516,19.0515,8.28665,2.65894,11.5933,19.5365,16.4458,30.6088,1.58288,19.5322,8.45841,22.2148,16.0476,3.95645,4.72774,0.565614,1.20862,2.15686,1.21104,5.78417,6.65482,0.482981,2.15664,0.633379,0.110249,0.404921,0.792654,0.192772,0.137766,0.134901,0.3331,0.0683511,0.0175367,0.0103395,0.00945282,0.0112487,0.0856852,0.0122744,0.00264861,0.00316469,29.9971,107.758,46.9466,242.651
|
||||
6.87946,7.9,246.173,6.80423,27.1762,18.7768,8.18877,2.6258,11.5245,19.4611,16.6025,30.7495,1.66461,19.3562,8.52873,22.515,16.6176,4.19058,5.00433,0.603017,1.29902,2.38344,1.3321,6.46231,7.4443,0.539726,2.50568,0.750382,0.139805,0.500429,1.0093,0.248667,0.176748,0.173592,0.456167,0.0956577,0.0288856,0.0171381,0.0158594,0.0193992,0.147568,0.0234,0.00538428,0.00825113,29.5914,107.887,48.3276,246.193
|
||||
6.96654,8,247.557,6.56814,26.4188,18.3822,8.0583,2.5851,11.3903,19.3969,16.5266,30.4566,1.59722,18.9374,8.52164,22.6496,16.9596,4.39296,5.214,0.657185,1.38024,2.58692,1.46047,7.07841,8.11554,0.613359,2.83642,0.851298,0.162011,0.607522,1.23597,0.31204,0.221744,0.217978,0.598804,0.134492,0.0448209,0.0271307,0.0251285,0.0311885,0.234169,0.0396126,0.00994278,0.0190417,29.0256,106.827,49.2161,247.604
|
||||
7.05362,8.1,247.424,6.32006,25.4886,17.8744,7.91193,2.54156,11.1986,19.114,16.5521,29.8584,1.66375,18.4075,8.52404,22.642,17.0677,4.55931,5.38733,0.688573,1.45184,2.76192,1.57828,7.51454,8.63951,0.686466,3.13014,0.962414,0.197685,0.722144,1.45894,0.381394,0.270192,0.272213,0.757675,0.182557,0.0632609,0.0399698,0.0377084,0.0473723,0.347091,0.0634413,0.0170547,0.0398131,28.3279,105.319,49.6563,247.523
|
||||
7.1407,8.2,246.231,6.09473,24.6393,17.4063,7.77192,2.49797,11.0176,18.7188,16.2785,29.1701,1.66604,17.9778,8.46898,22.1579,17.0357,4.69582,5.53332,0.726165,1.49763,2.92434,1.69102,7.82776,9.16732,0.759641,3.39606,1.0853,0.22407,0.843508,1.70524,0.457012,0.323726,0.332104,0.933233,0.24063,0.0897071,0.0572626,0.0540222,0.0687372,0.494609,0.0966189,0.0273901,0.0767097,27.6762,103.298,49.4228,246.419
|
||||
7.22779,8.3,245.825,5.88607,23.8801,16.9816,7.62961,2.45165,10.8479,18.0789,15.7184,28.6215,1.65112,17.6255,8.45807,22.1868,17.3223,4.83012,5.65814,0.757494,1.55057,3.05845,1.79333,8.16208,9.66634,0.827814,3.66519,1.20617,0.264355,0.961067,1.97458,0.538308,0.38034,0.397006,1.12995,0.301528,0.116748,0.0789463,0.074462,0.0958801,0.679947,0.139136,0.0397273,0.137901,27.0629,101.001,49.9973,246.16
|
||||
7.31487,8.4,245.791,5.69687,23.2139,16.6104,7.50218,2.40976,10.6993,17.8151,15.5352,28.2164,1.63729,17.3056,8.40237,21.8409,17.2926,4.92979,5.76657,0.785312,1.59993,3.20138,1.87574,8.50332,10.1527,0.893736,3.93384,1.32673,0.305199,1.09108,2.24976,0.623562,0.439971,0.466874,1.34838,0.378086,0.155721,0.105563,0.0995363,0.128726,0.903892,0.195282,0.0560003,0.0960379,26.5224,99.6112,49.8299,246.351
|
||||
7.40195,8.5,246.034,5.50666,22.5568,16.2383,7.36668,2.36523,10.5447,17.5599,15.038,27.7599,1.62173,16.9447,8.33904,21.9502,17.5054,5.02004,5.8128,0.810423,1.63582,3.33001,1.97436,8.83964,10.5531,0.955624,4.19328,1.44185,0.347739,1.21345,2.52876,0.709159,0.494717,0.529034,1.58397,0.463895,0.201344,0.136668,0.127805,0.167788,1.16793,0.263774,0.078325,0.155946,25.9702,97.808,50.2884,246.923
|
||||
7.48903,8.6,246.61,5.32666,21.9386,15.8857,7.23276,2.3214,10.3949,17.5063,15.2736,27.4856,1.55192,16.61,8.29499,21.6744,17.3705,5.093,5.84957,0.825439,1.66578,3.44164,2.03835,9.15964,10.9188,0.995295,4.44036,1.55164,0.362645,1.31465,2.80567,0.799527,0.558094,0.601722,1.80823,0.543968,0.253808,0.17241,0.161172,0.213965,1.46992,0.345616,0.105954,0.245668,25.4399,97.1173,49.9875,247.961
|
||||
7.57611,8.7,247.648,5.1542,21.3468,15.5456,7.10011,2.2776,10.2468,17.4334,15.4504,27.3016,1.64306,16.3238,8.22075,21.5453,17.3669,5.14686,5.86964,0.85072,1.68695,3.53842,2.10372,9.43316,11.2141,1.04768,4.64694,1.62886,0.404698,1.42973,3.06187,0.883262,0.609756,0.672197,2.07509,0.642887,0.312527,0.209916,0.196984,0.26623,1.80464,0.440837,0.139086,0.375177,24.9233,96.6198,49.9287,249.627
|
||||
7.6632,8.8,246.687,4.96614,20.7163,15.1674,6.93559,2.22134,10.0679,16.8324,14.8918,26.996,1.61758,15.9722,8.1186,21.4516,17.3064,5.17336,5.83753,0.856229,1.69114,3.6155,2.15479,9.69568,11.4443,1.09173,4.85172,1.71902,0.444511,1.52775,3.32657,0.967583,0.658889,0.717083,2.30648,0.729879,0.37438,0.251048,0.23533,0.323191,2.16131,0.540624,0.176482,0.554038,24.3243,94.4965,49.7689,249.486
|
||||
7.75028,8.9,246.457,4.79071,20.12,14.8095,6.78428,2.1704,9.90283,16.5853,14.7063,26.7033,1.59505,15.6572,8.08238,21.3149,17.1744,5.1959,5.79371,0.871579,1.68979,3.68339,2.20031,9.9129,11.6115,1.13177,5.03589,1.80233,0.484153,1.61776,3.53284,1.04359,0.702855,0.778192,2.56,0.836999,0.414272,0.291449,0.275865,0.3856,2.54057,0.654905,0.218775,0.793274,23.7642,93.2324,49.4789,250.304
|
||||
7.83736,9,247.377,4.64069,19.6197,14.5181,6.66394,2.12957,9.77884,16.406,14.5782,26.5008,1.57769,15.3708,8.01977,21.5342,17.2386,5.23035,5.75691,0.878433,1.69126,3.75406,2.24767,10.1388,11.7475,1.1718,5.2189,1.88529,0.521371,1.70172,3.74284,1.12076,0.740733,0.837538,2.82405,0.927273,0.479327,0.337179,0.318688,0.453771,2.93786,0.772629,0.258579,1.10501,23.3116,92.2321,49.7601,252.55
|
||||
7.92444,9.1,246.207,4.48233,19.067,14.1821,6.52343,2.08346,9.62089,16.1612,14.0426,26.0924,1.5571,15.0407,7.98424,21.2396,16.8776,5.23307,5.69347,0.88588,1.6785,3.79859,2.27906,10.3048,11.8212,1.20335,5.3619,1.95232,0.557677,1.77062,3.91258,1.19253,0.781851,0.891184,3.06389,1.05486,0.535566,0.375984,0.357205,0.519356,3.32396,0.89984,0.308194,1.49529,22.789,90.4992,49.0438,252.984
|
||||
8.01152,9.2,245.039,4.32192,18.4964,13.8272,6.37284,2.03425,9.44441,16.0846,14.2593,25.7699,1.47364,14.6945,7.87536,21.3296,16.8422,5.22018,5.61208,0.891085,1.66818,3.81854,2.30037,10.4186,11.8183,1.22991,5.47253,2.00853,0.588978,1.82763,4.0491,1.25067,0.807211,0.938694,3.2875,1.14186,0.618846,0.42806,0.403257,0.589138,3.69341,1.01942,0.35169,0.759254,22.2343,89.6017,49.004,253.703
|
||||
8.0986,9.3,244.233,4.15784,17.9034,13.4488,6.2077,1.98006,9.2459,15.9459,14.3819,25.4796,1.55896,14.3646,7.74602,21.0935,16.5885,5.187,5.52137,0.891581,1.6529,3.82798,2.30311,10.4802,11.7752,1.24745,5.55291,2.04946,0.59635,1.85398,4.15831,1.30283,0.834664,0.978142,3.48702,1.25423,0.667645,0.46243,0.437429,0.655786,4.06217,1.14665,0.39435,1.34878,21.6366,88.723,48.3904,255.049
|
||||
8.18569,9.4,241.656,3.98834,17.2769,13.038,6.02495,1.91998,9.02046,15.2254,13.7041,24.9939,1.52743,14.014,7.64861,20.7978,16.3149,5.12954,5.40512,0.888635,1.62971,3.82011,2.29907,10.4733,11.6711,1.25902,5.59577,2.07807,0.64311,1.8821,4.22605,1.33813,0.844793,1.00947,3.65483,1.33153,0.750261,0.500992,0.468096,0.714681,4.3779,1.26674,0.445553,2.45805,20.9829,86.1339,47.6473,254.95
|
||||
8.27277,9.5,238.885,3.84462,16.752,12.6973,5.87267,1.86946,8.83944,14.952,13.486,24.6235,1.501,13.7158,7.52586,20.5855,16.1206,5.09042,5.31363,0.884918,1.61221,3.81986,2.30027,10.5002,11.6085,1.26178,5.6471,2.10466,0.648735,1.91007,4.31982,1.37633,0.85804,1.02114,3.79396,1.39284,0.787959,0.537421,0.505914,0.781272,4.71618,1.3892,0.496323,1.82011,20.4394,84.6436,47.1102,254.969
|
||||
8.35985,9.6,236.368,3.72149,16.3077,12.4127,5.74477,1.8266,8.69393,14.7395,13.3197,24.3441,1.47868,13.482,7.42931,20.1644,15.8112,5.0625,5.24301,0.886699,1.59722,3.82834,2.30367,10.5357,11.5804,1.27336,5.69558,2.11996,0.673318,1.93514,4.39372,1.40861,0.869983,1.04782,3.95334,1.47408,0.822761,0.566724,0.533353,0.83835,5.01913,1.51161,0.54835,1.16914,19.9841,83.4872,46.2811,255.755
|
||||
8.44693,9.7,234.395,3.578,15.7659,12.0485,5.57831,1.77155,8.48905,14.4264,12.6902,23.7751,1.44834,13.1677,7.3388,19.9625,15.5719,4.99647,5.13547,0.879357,1.57405,3.80606,2.29,10.4838,11.4574,1.27671,5.70102,2.13115,0.691601,1.94308,4.43415,1.42494,0.868734,1.06554,4.06714,1.54095,0.89406,0.600617,0.562697,0.893641,5.27631,1.59731,0.594483,2.59595,19.3983,81.3356,45.6663,257.135
|
||||
8.53401,9.8,231.574,3.44388,15.256,11.7038,5.41972,1.71899,8.29282,14.3382,12.9012,23.369,1.35328,12.8752,7.20007,19.9961,15.5654,4.93097,5.03338,0.871968,1.54889,3.78324,2.27398,10.4268,11.3427,1.27713,5.70113,2.13673,0.709852,1.94492,4.46575,1.43991,0.871999,1.07814,4.16563,1.59879,0.911136,0.617596,0.579564,0.935262,5.50215,1.69533,0.617556,1.67939,18.8425,80.3299,45.5258,258.092
|
||||
8.6211,9.9,231.802,3.32511,14.8056,11.4006,5.27965,1.67241,8.12248,14.2602,13.0806,23.1248,1.44354,12.6565,7.08011,19.7731,15.3989,4.87545,4.94587,0.865888,1.52737,3.76378,2.26219,10.3839,11.2486,1.27926,5.70479,2.14409,0.724779,1.94794,4.4963,1.45021,0.86826,1.09065,4.25524,1.66215,0.985555,0.646836,0.602982,0.978268,5.7041,1.78699,0.679789,3.49716,18.3526,79.7683,44.9933,262.379
|
||||
8.70818,10,226.825,3.2044,14.3383,11.0798,5.13151,1.62339,7.93706,13.5846,12.4303,22.7082,1.4148,12.4174,7.00258,19.5095,15.2269,4.81254,4.84969,0.858001,1.50372,3.73392,2.24136,10.3123,11.1306,1.27668,5.68954,2.14227,0.739183,1.94185,4.50823,1.45575,0.866462,1.09673,4.3224,1.69672,0.989636,0.657403,0.613391,1.01305,5.88515,1.86537,0.696943,2.31755,17.8347,77.4949,44.3986,261.686
|
||||
8.79526,10.1,231.684,3.1179,14.1027,10.8967,5.02278,1.58658,7.82605,13.521,12.3738,23.3634,1.3931,12.3711,6.91843,19.9505,15.4362,4.78273,4.80011,0.854227,1.49055,3.73707,2.23233,10.8402,11.8839,1.2795,5.81482,2.14987,0.752028,1.9474,4.60565,1.46335,0.864676,1.10845,4.46481,1.7588,1.06166,0.68164,0.628912,1.04362,6.3781,1.94956,0.733507,4.49638,17.506,77.7668,44.9696,272.875
|
||||
8.88234,10.2,227.399,3.02247,13.7308,10.6454,4.9077,1.54825,7.68691,13.3079,12.2023,23.0188,1.3705,12.1714,6.81879,19.4333,15.1062,4.74006,4.73943,0.856372,1.47927,3.71976,2.21895,10.7796,11.774,1.27612,5.81194,2.15135,0.754738,1.93706,4.62172,1.46893,0.863158,1.11359,4.50904,1.75802,1.05636,0.689909,0.640522,1.07672,6.53197,2.01696,0.766864,3.0761,17.1014,76.5766,44.019,273.663
|
||||
8.96942,10.3,222.466,2.91018,13.2769,10.3263,4.7609,1.5001,7.49587,13.228,12.0321,22.4177,1.26978,11.8951,6.73067,19.1862,14.8741,4.66514,4.64538,0.847805,1.46296,3.68309,2.19073,10.6398,11.583,1.26581,5.76237,2.13376,0.765598,1.92084,4.59495,1.45952,0.851017,1.11281,4.54375,1.82699,1.11697,0.696707,0.642154,1.09136,6.59444,2.0639,0.7915,1.60998,16.5873,75.0692,43.3709,273.909
|
||||
9.0565,10.4,220.83,2.78397,12.7533,9.94919,4.58709,1.44356,7.25839,13.0314,12.1153,21.9051,1.33126,11.5511,6.55184,19.0806,14.7906,4.56113,4.52592,0.83511,1.43449,3.62595,2.15488,10.4286,11.3193,1.24921,5.67341,2.1106,0.772531,1.89397,4.54319,1.43898,0.833199,1.09721,4.5128,1.79405,1.09301,0.697791,0.643842,1.09986,6.59968,2.07543,0.810558,3.87299,15.9798,73.7445,42.9582,276.941
|
||||
9.14359,10.5,214.529,2.67049,12.2821,9.6094,4.4304,1.39256,7.04485,12.6786,11.8149,21.3294,1.32359,11.2731,6.39096,18.6892,14.5259,4.46847,4.42054,0.823983,1.40961,3.57057,2.12552,10.2492,11.0875,1.23445,5.59504,2.08407,0.780397,1.86906,4.48984,1.42045,0.820908,1.0906,4.49845,1.80253,1.08978,0.693595,0.639351,1.10157,6.60098,2.10862,0.825753,2.17306,15.4323,71.8555,42.1041,275.719
|
||||
9.23067,10.6,211.139,2.55312,11.7876,9.24805,4.26371,1.33857,6.81243,11.8881,11.0532,20.6943,1.28837,10.9639,6.26849,18.2444,14.2283,4.36556,4.30573,0.810902,1.38214,3.50378,2.08418,10.0425,10.8342,1.22557,5.49622,2.05121,0.779391,1.83978,4.42195,1.39469,0.802394,1.08176,4.4608,1.83927,1.14195,0.694,0.636193,1.10025,6.56023,2.1046,0.837798,4.70879,14.8503,68.9688,41.144,277.11
|
||||
9.31775,10.7,207.697,2.48931,11.5361,9.07456,4.18355,1.31188,6.71599,11.7422,10.9369,20.4654,1.271,10.8358,6.19768,18.1228,14.1804,4.34063,4.27181,0.810216,1.37425,3.49664,2.07699,10.0202,10.7863,1.2339,5.50346,2.04784,0.782218,1.83306,4.43383,1.39567,0.800718,1.08488,4.49568,1.82526,1.11767,0.696376,0.638154,1.11198,6.63024,2.13957,0.84452,2.84119,14.57,68.165,40.9156,279.766
|
||||
9.40483,10.8,205.679,2.39911,11.1587,8.79949,4.0566,1.27064,6.54239,11.4601,10.2797,19.8711,1.24365,10.5883,6.06422,17.456,13.749,4.26825,4.19271,0.803743,1.35841,3.45204,2.04862,9.88212,10.6144,1.22356,5.45093,2.03766,0.782269,1.80896,4.39029,1.37841,0.787903,1.08025,4.47703,1.87013,1.17105,0.697234,0.634318,1.10878,6.60489,2.14894,0.854789,5.61266,14.1267,66.0494,39.666,283.253
|
||||
9.49191,10.9,200.655,2.30521,10.7605,8.50504,3.92057,1.22671,6.35148,11.3789,10.5106,19.3777,1.13819,10.3142,5.96852,17.5328,13.7353,4.18404,4.10378,0.794191,1.34173,3.40095,2.01467,9.71392,10.4114,1.21055,5.37294,2.02443,0.796358,1.78033,4.33157,1.35614,0.773014,1.06733,4.44307,1.82761,1.13253,0.689812,0.628235,1.10351,6.56008,2.14582,0.862854,3.55888,13.6523,65.0395,39.5559,283.263
|
||||
9.57899,11,199.227,2.20149,10.3128,8.16879,3.76513,1.17682,6.12624,11.2009,10.6108,18.887,1.22853,10.0151,5.79166,17.0852,13.4304,4.07738,3.99462,0.781393,1.31707,3.33384,1.97401,9.49095,10.1509,1.19272,5.26412,1.98958,0.794843,1.74334,4.2467,1.32525,0.754182,1.05041,4.37434,1.86157,1.17855,0.68071,0.616417,1.08682,6.45863,2.12865,0.864373,6.49452,13.1107,63.8602,38.5876,286.581
|
||||
9.66608,11.1,191.326,2.10861,9.91247,7.86781,3.62577,1.13205,5.92464,10.4362,9.86172,18.3298,1.19687,9.72275,5.63298,16.6866,13.1612,3.98231,3.89886,0.770264,1.2957,3.27219,1.93989,9.30632,9.92677,1.17715,5.16945,1.95901,0.810332,1.7222,4.17265,1.29773,0.737522,1.03552,4.31463,1.79865,1.13433,0.673136,0.608713,1.07414,6.37363,2.10631,0.86722,4.30232,12.6256,61.105,37.7289,283.264
|
||||
9.75316,11.2,185.215,2.02785,9.56597,7.60782,3.50511,1.09325,5.75139,10.1499,9.61327,17.8563,1.16899,9.4998,5.54887,16.3524,12.9474,3.90396,3.81898,0.761284,1.2783,3.22218,1.90915,9.155,9.74721,1.17048,5.09337,1.93408,0.810667,1.70837,4.12924,1.27632,0.723613,1.02324,4.2678,1.78372,1.12852,0.665063,0.600126,1.06194,6.30902,2.10042,0.869304,2.07545,12.2062,59.5885,37.0228,282.219
|
||||
9.84024,11.3,183.821,1.94055,9.18555,7.31902,3.37112,1.0504,5.55415,9.81999,9.32447,17.3072,1.138,9.21012,5.39033,15.9521,12.6792,3.80996,3.72531,0.750107,1.25718,3.15855,1.8709,8.96227,9.52146,1.16164,5.00026,1.90218,0.809863,1.67727,4.05324,1.24962,0.713443,1.05646,4.3,1.88256,1.17716,0.657935,0.591019,1.04579,6.20913,2.07277,0.869188,5.0931,11.7405,57.7442,36.1665,285.107
|
||||
9.92732,11.4,178.857,1.89339,8.99318,7.17816,3.30524,1.02885,5.46739,9.68441,8.77691,16.9587,1.12161,9.09326,5.37221,15.5374,12.3728,3.7834,3.69756,0.749181,1.25322,3.14758,1.86234,8.9379,9.47809,1.16049,4.99686,1.90525,0.812458,1.67057,4.04946,1.24441,0.709267,1.03113,4.27189,1.88684,1.18088,0.657007,0.589495,1.04595,6.22325,2.08078,0.87105,2.77682,11.5123,56.4745,35.3912,286.271
|
||||
10.0144,11.5,177.665,1.79509,8.55537,6.83976,3.14845,0.979108,5.22801,9.51581,8.92916,16.2984,1.00508,8.73466,5.17692,15.379,12.2448,3.65985,3.57708,0.734222,1.22781,3.06114,1.81063,8.66803,9.17064,1.13935,4.85712,1.87133,0.820355,1.62856,3.93768,1.20514,0.688121,1.01209,4.13752,1.81731,1.16986,0.641815,0.573773,1.01808,6.06124,2.03999,0.864685,6.44189,10.9673,54.888,34.8608,288.217
|
||||
10.1015,11.6,174.423,1.73698,8.30683,6.65104,3.0605,0.95084,5.10097,9.50965,9.18395,16.0947,1.10895,8.57926,5.07316,15.1447,12.1052,3.60558,3.5237,0.728915,1.21767,3.03037,1.79327,8.57483,9.05148,1.13213,4.80857,1.8559,0.821817,1.61161,3.9011,1.18963,0.679145,1.00498,4.10921,1.80988,1.16864,0.636427,0.56785,1.00891,6.01685,2.02779,0.867919,5.07191,10.6624,54.6507,34.3792,289.586
|
||||
10.1886,11.7,166.554,1.65,7.91809,6.34908,2.92029,0.906423,4.885,8.70056,8.38512,15.4727,1.0749,8.27944,4.9453,14.6725,11.7623,3.49062,3.41495,0.715304,1.19386,2.95095,1.74705,8.33268,8.77419,1.11284,4.68062,1.81704,0.832298,1.58205,3.79823,1.15344,0.65998,0.987697,4.01618,1.73778,1.12045,0.622373,0.553309,0.98249,5.86553,1.98479,0.857645,3.64826,10.1758,51.743,33.3403,284.43
|
||||
10.2756,11.8,162.734,1.59565,7.68378,6.16996,2.83646,0.879586,4.76163,8.4963,8.20435,15.1353,1.05311,8.09883,4.84244,14.4345,11.6182,3.43407,3.35982,0.709739,1.18361,2.91701,1.7263,8.23416,8.65322,1.10909,4.62916,1.80084,0.834076,1.57468,3.77102,1.13955,0.662582,1.05567,4.08867,1.85411,1.18269,0.619667,0.546992,0.971907,5.81336,1.9698,0.854903,2.22764,9.886,50.592,32.8466,285.433
|
||||
10.3627,11.9,163.965,1.54235,7.45272,5.99253,2.75341,0.853061,4.6382,8.29094,8.02195,14.7955,1.03137,7.91683,4.73857,13.7949,11.2065,3.37865,3.30456,0.702033,1.17153,2.88163,1.70486,8.13141,8.52674,1.10622,4.57954,1.7839,0.835556,1.55837,3.73066,1.12318,0.646759,1.02195,4.05847,1.849,1.18288,0.617504,0.544671,0.964368,5.76352,1.95311,0.851705,6.96306,9.599,49.4333,31.6846,290.859
|
||||
10.4498,12,159.233,1.46835,7.11994,5.73207,2.63232,0.814814,5.05792,8.45843,7.80876,14.189,1.001,7.62797,4.62718,13.4405,10.893,3.27901,3.20912,0.690644,1.15039,2.80941,1.66354,7.91257,8.27719,1.09008,4.46917,1.7553,0.834375,1.52576,3.63882,1.09096,0.630209,0.977992,3.93458,1.82904,1.1761,0.605637,0.532152,0.940603,5.6335,1.93032,0.851661,5.9238,9.1792,48.7703,30.8217,288.125
|
||||
10.5369,12.1,155.359,1.42267,6.92268,5.57978,2.56101,0.792044,4.34241,8.03207,7.64889,13.8397,0.897928,7.47047,4.53541,13.6162,11.0214,3.23178,3.16407,0.686529,1.14294,2.78024,1.64545,7.8285,8.17181,1.08452,4.42502,1.74896,0.844114,1.51228,3.60601,1.07722,0.622923,0.972806,3.86492,1.77144,1.17685,0.601375,0.527247,0.931759,5.59158,1.9185,0.860214,4.88755,8.93283,46.7669,31.0335,288.088
|
||||
10.624,12.2,150.053,1.34899,6.58739,5.31534,2.43826,0.753426,4.14718,7.90096,7.78767,13.4062,0.992257,7.19316,4.36891,13.1692,10.7001,3.12484,3.06186,0.673851,1.12139,2.70268,1.60133,7.58752,7.89966,1.06643,4.29728,1.71185,0.851998,1.48285,3.50323,1.04196,0.605033,0.957026,3.76968,1.74614,1.16824,0.588131,0.513411,0.905007,5.43684,1.87458,0.850698,3.80093,8.50703,45.7963,30.056,284.043
|
||||
10.7111,12.3,145.406,1.30399,6.39049,5.1622,2.36647,0.730625,4.0372,7.2675,7.14211,13.0967,0.971874,7.051,4.31917,12.9436,10.5382,3.06819,3.01237,0.668835,1.11261,2.66905,1.5816,7.48805,7.78004,1.06087,4.24432,1.6966,0.854408,1.47462,3.46754,1.0262,0.59689,0.950781,3.73498,1.68059,1.1199,0.582937,0.507632,0.894114,5.38207,1.8588,0.848608,2.72211,8.2593,43.8855,29.5623,282.789
|
||||
10.7981,12.4,140.094,1.24007,6.09927,4.93224,2.25949,0.697017,3.86593,6.97112,6.8713,12.5901,0.943438,6.78385,4.17066,12.5475,10.255,2.97025,2.91406,0.655001,1.09385,2.60047,1.54274,7.27395,7.53889,1.04763,4.13333,1.66396,0.854206,1.44436,3.38185,0.996876,0.584893,0.985393,3.7645,1.79414,1.17582,0.575039,0.49657,0.870359,5.24536,1.81986,0.840351,1.60349,7.88875,42.1964,28.6868,279.083
|
||||
10.8852,12.5,142.091,1.19798,5.91365,4.78709,2.19145,0.675477,3.76004,6.79152,6.70722,12.2882,0.923739,6.62152,4.07657,11.8933,9.82724,2.9189,2.86569,0.647927,1.08107,2.56597,1.52275,7.1704,7.4157,1.04159,4.0816,1.65157,0.856133,1.42966,3.34023,0.98097,0.576986,0.946539,3.68428,1.79006,1.17715,0.570369,0.492223,0.861405,5.1949,1.80797,0.837844,6.92644,7.65401,41.1688,27.5051,283.805
|
||||
10.9723,12.6,138.925,1.15962,5.74528,4.6554,2.12976,0.65593,3.66393,6.87618,6.63292,11.8967,0.817838,6.47403,4.03439,11.75,9.68261,2.87293,2.82247,0.644219,1.07081,2.53247,1.50507,7.07982,7.30696,1.03647,4.03404,1.63843,0.858138,1.41685,3.30425,0.966934,0.570036,0.941979,3.6557,1.78727,1.17899,0.566443,0.487556,0.852027,5.14759,1.80007,0.842196,5.83116,7.44109,40.3959,27.128,283.006
|
||||
11.0594,12.7,134.984,1.10245,5.48216,4.44642,2.03283,0.625586,3.50624,6.81138,6.83358,11.5673,0.898178,6.22446,3.89478,11.7776,9.67618,2.78383,2.73787,0.634285,1.05416,2.46411,1.46592,6.87045,7.07361,1.02215,3.92396,1.61222,0.863128,1.3877,3.21546,0.937002,0.555281,0.92958,3.52287,1.70679,1.17383,0.555866,0.476286,0.829349,5.0142,1.76324,0.841677,4.68958,7.10483,39.736,26.9755,279.016
|
||||
11.1465,12.8,130.871,1.06036,5.29235,4.29645,1.96299,0.603632,3.3942,6.61183,6.6477,11.2366,0.896559,6.07041,3.79338,11.5242,9.50299,2.72443,2.68175,0.628452,1.04431,2.42259,1.4409,6.73808,6.92386,1.01383,3.85495,1.59374,0.871285,1.37392,3.16128,0.917782,0.545836,0.922323,3.47378,1.63151,1.11924,0.549697,0.469441,0.81547,4.93675,1.74202,0.838903,3.54094,6.86307,38.6507,26.4334,276.334
|
||||
11.2335,12.9,124.936,1.01012,5.06048,4.11213,1.87747,0.576906,3.25406,5.91466,5.93862,10.8123,0.872073,5.86841,3.70935,11.1876,9.22996,2.63129,2.59864,0.619616,1.02953,2.36348,1.40822,6.5465,6.71141,0.999985,3.75517,1.5665,0.872344,1.35317,3.08432,0.890843,0.532629,0.911233,3.39871,1.61169,1.11314,0.54027,0.459376,0.795052,4.81623,1.70886,0.832931,2.3603,6.56651,36.3694,25.6475,270.909
|
||||
11.3206,13,121.964,0.976932,4.91264,3.99574,1.82305,0.559775,3.16696,5.76483,5.79859,10.5567,0.854701,5.73062,3.6279,10.9941,9.10461,2.58751,2.55062,0.61132,1.02287,2.3332,1.39134,6.45108,6.60065,0.994659,3.70499,1.55351,0.875159,1.34109,3.04976,0.878086,0.528556,0.956143,3.48747,1.7516,1.178,0.538265,0.455887,0.78588,4.7645,1.69478,0.831855,1.17831,6.37857,35.5003,25.2368,270.435
|
||||
11.4077,13.1,122.264,0.928257,4.68547,3.81453,1.73916,0.533629,3.02781,5.51944,5.10759,9.9846,0.830514,5.50592,3.5017,10.1901,8.54808,2.50651,2.474,0.598517,1.00083,2.27146,1.35742,6.25028,6.38036,0.982311,3.60067,1.5253,0.875589,1.31467,2.96466,0.850035,0.515062,0.907007,3.35728,1.73702,1.17501,0.528857,0.445656,0.765183,4.63938,1.66253,0.825125,6.83595,6.08732,33.4776,23.7187,269.409
|
||||
11.4948,13.2,120.382,0.897721,4.54848,3.70645,1.6888,0.517806,2.94624,5.6255,5.50792,9.76669,0.724571,5.37529,3.46429,10.472,8.68343,2.46424,2.43453,0.595445,0.989137,2.23593,1.34095,6.15537,6.27182,0.977895,3.55182,1.51431,0.879457,1.30277,2.92665,0.836274,0.508585,0.903096,3.26875,1.66584,1.17776,0.525347,0.441342,0.755831,4.58774,1.65291,0.828103,5.66471,5.91306,33.4105,24.0542,268.826
|
||||
11.5819,13.3,116.319,0.851962,4.33305,3.53415,1.60927,0.493075,2.81319,5.59996,5.74107,9.49883,0.825384,5.17834,3.34185,10.1392,8.4358,2.38482,2.35935,0.586994,0.975145,2.16995,1.3034,5.95449,6.05327,0.965432,3.44739,1.48707,0.880391,1.27643,2.84105,0.808417,0.495215,0.892239,3.18836,1.64825,1.17421,0.515885,0.431122,0.734529,4.45742,1.61835,0.82679,4.44767,5.63649,32.9986,23.3191,263.454
|
||||
11.669,13.4,111.678,0.821057,4.19182,3.42215,1.55727,0.476812,2.72758,4.9924,5.11143,9.2388,0.808063,5.03905,3.25979,9.93672,8.25611,2.32817,2.31503,0.582991,0.968501,2.13626,1.28135,5.83516,5.92599,0.959556,3.38925,1.47291,0.886148,1.26435,2.79491,0.792495,0.487695,0.887057,3.14643,1.56739,1.11434,0.511346,0.425843,0.723189,4.39181,1.6016,0.825743,3.2238,5.45624,31.1771,22.836,259.398
|
||||
11.756,13.5,108.438,0.79308,4.06455,3.32138,1.51044,0.462159,2.65048,4.85753,4.98295,9.00484,0.791959,4.93296,3.22236,9.75518,8.13481,2.2777,2.26569,0.579607,0.96289,2.10645,1.26538,5.73546,5.8126,0.950679,3.33781,1.46059,0.889566,1.25508,2.75817,0.778743,0.481065,0.882644,3.1098,1.55949,1.11423,0.507503,0.421291,0.713304,4.3354,1.58735,0.825222,1.97995,5.29398,30.4431,22.4334,257.486
|
||||
11.8431,13.6,110.66,0.747333,3.8449,3.14484,1.42924,0.437017,2.51247,4.61038,4.74996,8.56858,0.76787,4.70463,3.09444,9.39548,7.86097,2.19245,2.17519,0.563782,0.946834,2.03886,1.22905,5.50776,5.56871,0.933604,3.21652,1.42944,0.890133,1.22625,2.6603,0.748023,0.467805,0.920503,3.14742,1.69412,1.17316,0.496916,0.409851,0.689183,4.18319,1.54678,0.817776,7.91784,5.0111,29.0083,21.6241,257.54
|
||||
11.9302,13.7,106.407,0.724444,3.74143,3.0632,1.39129,0.425125,2.44986,4.50099,4.18233,8.23349,0.75386,4.60158,3.06783,8.83186,7.44474,2.15975,2.14501,0.55618,0.933447,2.01543,1.21661,5.42865,5.48023,0.931315,3.17387,1.41706,0.893519,1.21754,2.62901,0.736819,0.462809,0.874642,3.0622,1.69551,1.17796,0.494709,0.406744,0.681817,4.14167,1.53773,0.818047,6.70653,4.87961,27.7899,20.5814,254.226
|
||||
12.0173,13.8,104.382,0.698689,3.62225,2.96856,1.34752,0.411474,2.37674,4.61742,4.58791,8.03046,0.648061,4.48015,2.99489,9.05525,7.5869,2.11863,2.1067,0.55335,0.919397,1.9759,1.20018,5.32413,5.36592,0.927031,3.12094,1.40244,0.893643,1.20535,2.58612,0.722281,0.456181,0.870749,2.96067,1.61486,1.18099,0.491024,0.402196,0.671537,4.08015,1.52452,0.818948,5.46175,4.72755,27.7356,20.8675,251.85
|
||||
12.1044,13.9,101.986,0.673079,3.50284,2.87358,1.30366,0.397816,2.30312,4.6959,4.91379,7.94489,0.754379,4.37533,2.92138,8.87413,7.45992,2.07631,2.06722,0.550235,0.914322,1.93635,1.17062,5.20896,5.24729,0.922289,3.06546,1.38999,0.896879,1.19248,2.5409,0.70716,0.44926,0.866442,2.91945,1.60926,1.18343,0.487012,0.397355,0.660673,4.01444,1.5088,0.820899,4.18899,4.57506,27.9088,20.4776,249.46
|
||||
12.1914,14,95.7918,0.633342,3.30866,2.71704,1.23196,0.375688,2.17985,4.01877,4.21806,7.54896,0.732185,4.18619,2.83906,8.54571,7.15623,1.98592,1.99257,0.541834,0.900559,1.87381,1.13757,4.98635,5.01352,0.909542,2.95359,1.36172,0.896943,1.16398,2.44627,0.677756,0.435378,0.855112,2.82954,1.50666,1.11042,0.476883,0.386442,0.63748,3.86573,1.47051,0.814729,2.86925,4.32469,25.7231,19.6804,240.206
|
||||
12.2785,14.1,91.6093,0.598616,3.13922,2.58055,1.16944,0.35639,2.07235,3.82475,4.03289,7.20336,0.712173,4.00479,2.73562,8.25976,6.93892,1.90716,1.91555,0.534806,0.889063,1.81974,1.10912,4.79772,4.81006,0.891864,2.85647,1.33754,0.898952,1.14139,2.36477,0.652179,0.435185,0.940924,2.8844,1.64852,1.16754,0.467183,0.377077,0.617432,3.73728,1.43773,0.809855,1.53094,4.10638,24.5859,19.0214,233.573
|
||||
12.3656,14.2,94.7777,0.57369,3.02,2.48513,1.12561,0.342809,1.99758,3.69067,3.90338,6.96519,0.696582,3.87803,2.66056,7.58535,6.48207,1.86281,1.86179,0.515453,0.86979,1.78491,1.09104,4.67449,4.67836,0.880256,2.78732,1.3228,0.902049,1.12753,2.31275,0.635383,0.41586,0.890624,2.84169,1.64558,1.17081,0.461671,0.370383,0.603917,3.65625,1.41824,0.808273,7.78104,3.95354,23.792,17.792,236.363
|
||||
12.4527,14.3,91.9185,0.553023,2.92214,2.40726,1.08979,0.331686,1.93674,3.82789,3.8617,6.71038,0.682922,3.77436,2.6305,7.46626,6.35624,1.82787,1.82941,0.513664,0.854003,1.74578,1.07716,4.57788,4.57466,0.877378,2.73318,1.30506,0.905451,1.11716,2.27257,0.622147,0.410038,0.838507,2.73948,1.64549,1.17522,0.458652,0.366409,0.594462,3.59548,1.40177,0.806703,6.50205,3.82874,23.4245,17.4798,232.912
|
||||
12.5398,14.4,89.1002,0.531743,2.82019,2.3259,1.05246,0.320119,1.87303,3.71042,3.74972,6.44649,0.578266,3.66527,2.56451,7.71452,6.51166,1.79016,1.79432,0.511369,0.850336,1.7054,1.05293,4.47204,4.46177,0.8737,2.68028,1.28747,0.901572,1.10547,2.22794,0.607715,0.403618,0.834966,2.62791,1.55561,1.17875,0.45503,0.361867,0.583881,3.5281,1.38663,0.805961,5.19113,3.69848,22.5877,17.8107,228.987
|
||||
12.6269,14.5,85.3372,0.49897,2.6562,2.19318,0.991946,0.301521,1.76779,3.72549,4.01251,6.24431,0.677906,3.50168,2.46241,7.42734,6.28721,1.7215,1.72937,0.504574,0.839269,1.65009,1.01533,4.26475,4.25253,0.863162,2.57872,1.26303,0.897371,1.07715,2.14049,0.580959,0.39119,0.825337,2.54462,1.53934,1.17659,0.446055,0.352018,0.562517,3.3872,1.35159,0.801171,3.83281,3.48664,22.3921,17.1654,221.718
|
||||
12.7139,14.6,60.2212,0.313435,1.67469,1.38436,0.625866,0.190124,1.11689,2.07174,2.40531,4.05994,0.58625,2.40933,1.91683,5.51573,4.60282,1.23934,1.27894,0.440926,0.734699,1.24776,0.801153,2.85698,2.79094,0.755557,1.85254,1.06595,0.875542,0.889363,1.50185,0.395522,0.301661,0.739085,1.91811,1.2813,1.02808,0.369166,0.274413,0.403088,2.30609,1.06347,0.731393,2.20494,2.20034,14.5663,12.6368,155.583
|
||||
12.801,14.7,61.5763,0.32866,1.76247,1.45862,0.659183,0.20012,1.1779,2.18696,2.50743,4.26991,0.588709,2.50975,1.95871,5.71432,4.7959,1.27813,1.3,0.441274,0.751203,1.295,0.827471,3.01086,2.94774,0.761095,1.9245,1.09218,0.884819,0.913287,1.57233,0.414726,0.310439,0.798854,2.13155,1.47359,1.10333,0.375229,0.282871,0.421819,2.43484,1.10124,0.745012,0.864293,2.31792,15.1994,13.0884,164.174
|
||||
12.8881,14.8,65.9065,0.320272,1.72374,1.42826,0.645227,0.195762,1.15446,2.1454,2.00242,4.05022,0.580103,2.46645,1.92731,5.16247,4.44198,1.26822,1.29158,0.433559,0.737646,1.28824,0.824883,2.97816,2.91163,0.763652,1.90069,1.08025,0.890081,0.912133,1.55979,0.410139,0.308962,0.747541,2.05134,1.48221,1.11215,0.375884,0.281119,0.41695,2.41049,1.09483,0.74837,7.38194,2.26925,14.3263,12.1643,168.455
|
||||
12.9752,14.9,66.368,0.324874,1.75473,1.45576,0.657417,0.199338,1.17781,2.433,2.5615,4.15455,0.486277,2.50295,1.96671,5.27767,4.51815,1.2924,1.31599,0.44019,0.733289,1.29646,0.838033,3.04873,2.98247,0.773399,1.94011,1.09489,0.897168,0.924598,1.59441,0.419166,0.314066,0.755685,2.09141,1.50312,1.12651,0.382296,0.286507,0.426344,2.47506,1.1115,0.752761,6.08073,2.31252,15.2828,12.4042,172.552
|
||||
13.0623,15,66.3536,0.320631,1.73791,1.44366,0.651728,0.197494,1.16914,2.6251,2.98834,4.27112,0.597549,2.50008,1.94805,5.68784,4.80686,1.29274,1.31739,0.443328,0.73858,1.28524,0.829151,3.04736,2.97905,0.777816,1.94204,1.08941,0.891429,0.927325,1.59598,0.418698,0.314531,0.759094,2.01752,1.41692,1.13638,0.384551,0.287784,0.427402,2.48275,1.11742,0.754598,4.73364,2.29288,16.0994,13.1048,174.031
|
||||
13.1493,15.1,49.1371,0.198151,1.07777,0.896454,0.404568,0.122523,0.7267,1.79702,2.20864,2.76951,0.533671,1.73867,1.55102,4.37265,3.68496,0.972155,1.00916,0.400847,0.668813,1.00816,0.671945,2.05598,1.9626,0.712503,1.43537,0.954699,0.867568,0.792675,1.14731,0.289228,0.252375,0.700206,1.57598,1.20384,1.00639,0.331112,0.233496,0.315096,1.70962,0.914431,0.707279,3.15599,1.42355,11.3252,10.0389,125.002
|
||||
13.2364,15.2,49.6387,0.217798,1.1887,0.990002,0.446668,0.135192,0.803356,1.49812,1.86589,3.03208,0.538282,1.88066,1.63545,4.6179,3.85143,1.0046,1.05336,0.412573,0.688223,1.06519,0.7036,2.23282,2.14114,0.716708,1.53429,0.986029,0.877979,0.814294,1.22988,0.313458,0.264777,0.715211,1.66495,1.23233,1.02406,0.343775,0.245231,0.337586,1.86365,0.959373,0.723129,1.78894,1.57186,11.2538,10.5273,133.256
|
||||
13.3235,15.3,55.6067,0.207643,1.13713,0.948286,0.427746,0.129388,0.770308,1.43769,1.80398,2.92084,0.528528,1.81956,1.59543,4.53157,3.79592,0.98679,1.0203,0.401873,0.688471,1.05098,0.697281,2.17077,2.07509,0.704439,1.49167,0.981789,0.883144,0.80967,1.19879,0.303475,0.258318,0.760429,1.78533,1.40487,1.08453,0.335024,0.238562,0.329351,1.81897,0.951077,0.725225,8.39647,1.50542,10.8763,10.3346,138.738
|
||||
13.4106,15.4,54.0924,0.215881,1.1862,0.990527,0.446703,0.135043,0.805473,1.50455,1.40662,2.89998,0.527832,1.8757,1.61517,4.14059,3.58201,1.01935,1.05276,0.399038,0.682945,1.08081,0.71434,2.26392,2.16952,0.716197,1.53068,0.984871,0.891149,0.825462,1.24335,0.315486,0.264947,0.712245,1.75473,1.42938,1.1009,0.342832,0.245267,0.339368,1.88738,0.967956,0.735576,7.08965,1.57227,10.6353,9.7947,141.101
|
||||
13.4977,15.5,54.5884,0.218368,1.2038,1.0066,0.453849,0.137124,0.819429,1.76997,1.93981,2.96975,0.433787,1.89554,1.64406,4.64429,3.90959,1.03598,1.06983,0.404613,0.674891,1.0801,0.723905,2.30862,2.21399,0.724324,1.55682,0.982421,0.882082,0.83466,1.26554,0.321112,0.268447,0.718901,1.6967,1.34381,1.1141,0.347796,0.249172,0.345627,1.92915,0.975724,0.735309,5.73886,1.59758,11.4723,10.6597,144.215
|
||||
13.5848,15.6,53.5791,0.212095,1.17299,0.98222,0.442758,0.133696,0.800454,1.93855,2.34031,3.04564,0.541164,1.87288,1.61647,4.60175,3.8903,1.02788,1.06299,0.406574,0.678248,1.05896,0.709415,2.27709,2.17978,0.726902,1.54335,0.983451,0.887972,0.833619,1.2525,0.316732,0.267064,0.720575,1.68695,1.3491,1.12254,0.348334,0.248693,0.342991,1.90925,0.97473,0.732194,4.33998,1.55867,12.1555,10.5829,142.47
|
||||
13.6718,15.7,50.1073,0.203829,1.13087,0.948264,0.427372,0.128977,0.773658,1.44858,1.81937,2.95505,0.532258,1.82239,1.58217,4.53463,3.778,0.997032,1.05023,0.407564,0.680005,1.0489,0.693012,2.20377,2.11894,0.727981,1.51999,0.98162,0.879103,0.820341,1.23062,0.309877,0.26445,0.720899,1.66828,1.24229,1.03895,0.347703,0.247085,0.338103,1.87366,0.96942,0.735581,2.90649,1.50461,10.9335,10.3599,138.478
|
||||
13.7589,15.8,48.1826,0.198247,1.10334,0.926458,0.417484,0.125921,0.756762,1.41805,1.78549,2.89828,0.524735,1.80282,1.58319,4.49695,3.76425,0.974462,1.02613,0.40946,0.68325,1.04502,0.692296,2.17666,2.08189,0.715012,1.50803,0.982722,0.885385,0.811006,1.20664,0.304794,0.263217,0.72247,1.65955,1.24452,1.04455,0.348249,0.246687,0.335745,1.85572,0.968655,0.739952,1.44851,1.46986,10.7693,10.2618,136.799
|
||||
13.846,15.9,54.7523,0.192133,1.0726,0.901896,0.406366,0.122499,0.737591,1.38318,1.74763,2.83345,0.516995,1.76531,1.55556,4.45153,3.74322,0.966617,1.00139,0.39935,0.685873,1.03934,0.690582,2.14358,2.04597,0.702748,1.47838,0.982795,0.891285,0.810338,1.19284,0.299086,0.257275,0.7685,1.79718,1.42607,1.10376,0.338609,0.240135,0.327499,1.82435,0.966373,0.743772,8.19865,1.43076,10.5397,10.1628,143.453
|
||||
13.9331,16,51.5757,0.188166,1.05362,0.887182,0.399689,0.12042,0.726455,1.36333,1.27667,2.65583,0.510386,1.74173,1.56097,3.96056,3.40009,0.964546,1.00039,0.390749,0.670871,1.03867,0.691483,2.12876,2.029,0.707001,1.45936,0.968098,0.897289,0.811917,1.18736,0.296896,0.257042,0.709281,1.71103,1.43751,1.11416,0.340284,0.240688,0.326789,1.80859,0.956942,0.748374,6.8375,1.40729,9.83537,9.32559,140.354
|
||||
14.0202,16.1,51.1251,0.185225,1.04021,0.877145,0.395112,0.118976,0.719125,1.58428,1.76294,2.65107,0.414849,1.72481,1.54372,4.34965,3.67264,0.965122,1.00192,0.394045,0.65762,1.02227,0.693539,2.1225,2.02097,0.711656,1.45915,0.955905,0.884231,0.814466,1.18573,0.295816,0.257313,0.712809,1.62334,1.3385,1.12466,0.342352,0.241671,0.32702,1.80786,0.950542,0.73097,5.44337,1.39123,10.4008,9.98933,140.298
|
||||
14.1072,16.2,50.115,0.180203,1.01494,0.857069,0.386018,0.116174,0.703545,1.75518,2.16114,2.73489,0.520161,1.70689,1.5194,4.31635,3.66045,0.959297,0.997226,0.396327,0.661509,1.00142,0.665295,2.0832,1.99242,0.714743,1.44853,0.957859,0.872218,0.801913,1.17479,0.292134,0.256292,0.714921,1.61567,1.34461,1.13363,0.343192,0.241465,0.324881,1.79054,0.95047,0.736015,4.01203,1.35926,11.1012,9.93332,139.045
|
||||
14.1943,16.3,46.2675,0.169919,0.959735,0.811607,0.365504,0.109941,0.667087,1.25474,1.63156,2.6091,0.51019,1.65233,1.50198,4.21766,3.5166,0.92017,0.977108,0.396253,0.661511,0.984407,0.657736,1.9947,1.89624,0.696494,1.4119,0.952621,0.877926,0.783774,1.13255,0.281923,0.252077,0.713733,1.58469,1.22724,1.0425,0.341079,0.238347,0.316847,1.73161,0.939279,0.73806,2.53879,1.28705,9.82699,9.63154,132.869
|
||||
14.2814,16.4,44.671,0.164107,0.929482,0.787123,0.354455,0.106562,0.647832,1.21942,1.59334,2.5429,0.502552,1.6144,1.47441,4.17145,3.49453,0.894827,0.950206,0.397874,0.664303,0.978546,0.656028,1.95954,1.85821,0.699186,1.39592,0.952794,0.884159,0.783095,1.10958,0.274126,0.260473,0.819543,1.71752,1.40433,1.09412,0.334851,0.237466,0.313448,1.70542,0.936573,0.742086,1.04421,1.24814,9.59486,9.51101,131.03
|
||||
14.3685,16.5,50.1343,0.159489,0.905781,0.768123,0.345884,0.103931,0.633061,1.19249,1.56305,2.49217,0.495578,1.5843,1.45093,3.64151,3.15571,0.890035,0.927536,0.375437,0.647238,0.975411,0.655717,1.93459,1.83081,0.685959,1.36899,0.954192,0.890331,0.7836,1.09925,0.270634,0.243856,0.760472,1.71633,1.41519,1.1045,0.329717,0.230007,0.30485,1.67722,0.935864,0.74645,7.88816,1.21794,9.41157,8.61479,136.838
|
||||
14.4556,16.6,48.4395,0.155473,0.88531,0.75182,0.33853,0.10167,0.620485,1.40148,1.59122,2.38858,0.488968,1.55807,1.45374,3.63349,3.13144,0.88669,0.925271,0.378275,0.63162,0.953863,0.656005,1.91449,1.80852,0.689934,1.34572,0.936919,0.896344,0.784585,1.09108,0.26777,0.243311,0.697571,1.62276,1.42617,1.11475,0.331087,0.230233,0.303433,1.65385,0.908782,0.735974,6.50419,1.19202,9.50255,8.5769,134.303
|
||||
14.5427,16.7,46.9059,0.15117,0.863041,0.733941,0.330458,0.0991963,0.60656,1.3733,1.56185,2.28165,0.394052,1.52955,1.43103,4.00444,3.3868,0.882139,0.921809,0.380836,0.635969,0.932424,0.640758,1.89079,1.78259,0.693476,1.33658,0.920401,0.880688,0.784952,1.08116,0.26444,0.242508,0.700086,1.52201,1.31933,1.1244,0.332158,0.230201,0.30155,1.63748,0.909304,0.726566,5.08426,1.1636,9.17799,9.19519,132.052
|
||||
14.6297,16.8,45.1625,0.141831,0.811777,0.691316,0.311248,0.093384,0.572124,1.50444,1.91809,2.29532,0.494413,1.4776,1.39038,3.91086,3.32117,0.86186,0.903093,0.381073,0.636479,0.916556,0.619017,1.803,1.70479,0.693414,1.30151,0.915922,0.865442,0.764684,1.04792,0.254631,0.238537,0.699323,1.49217,1.31976,1.13079,0.330289,0.227268,0.293793,1.57921,0.898694,0.72905,3.62031,1.09595,9.65236,8.99698,128.113
|
||||
14.7168,16.9,42.0663,0.1374,0.788358,0.672287,0.302676,0.0907682,0.557175,1.05258,1.43525,2.24317,0.487457,1.45945,1.39066,3.87762,3.23218,0.838306,0.898413,0.383259,0.640204,0.913533,0.618896,1.76292,1.6586,0.67757,1.29038,0.917689,0.872184,0.751456,1.02714,0.250862,0.237458,0.701308,1.48361,1.20261,1.03772,0.330988,0.226938,0.291422,1.55946,0.898019,0.733869,2.13442,1.06573,8.62575,8.84652,124.675
|
||||
14.8039,17,40.3849,0.132727,0.763381,0.651867,0.293483,0.0879695,0.541038,1.02283,1.40239,2.18671,0.480421,1.42676,1.36613,3.83999,3.217,0.814676,0.853563,0.372267,0.643506,0.909459,0.618175,1.73337,1.62645,0.662552,1.25961,0.918804,0.8786,0.751612,1.00551,0.243428,0.229603,0.74285,1.62115,1.38326,1.08706,0.316927,0.222094,0.288629,1.53676,0.896418,0.738282,0.61759,1.03332,8.42626,8.72523,122.71
|
||||
14.891,17.1,45.2355,0.128465,0.740605,0.633264,0.285112,0.0854204,0.526375,0.995817,0.935952,1.99834,0.47365,1.39667,1.34303,3.30551,2.87448,0.809781,0.849801,0.362051,0.625845,0.906137,0.617805,1.707,1.59768,0.666356,1.23156,0.898879,0.884821,0.752031,0.994395,0.239798,0.228731,0.67925,1.52413,1.39407,1.09744,0.318034,0.217729,0.278847,1.49305,0.878786,0.74265,7.51618,1.0038,7.66983,7.83957,126.773
|
||||
14.9781,17.2,44.1212,0.124605,0.720002,0.616465,0.277548,0.0831168,0.513168,1.19853,1.39703,1.97002,0.379311,1.36918,1.34415,3.29229,2.84746,0.805799,0.846893,0.364784,0.609457,0.883334,0.617789,1.68385,1.5723,0.670189,1.22291,0.901212,0.890853,0.75272,0.984704,0.236587,0.228028,0.682032,1.52062,1.40481,1.10762,0.319233,0.217774,0.277036,1.47641,0.863008,0.729637,6.11877,0.97713,8.17139,7.79244,124.943
|
||||
15.0651,17.3,43.5636,0.120597,0.698412,0.598768,0.269577,0.0806938,0.499161,1.3663,1.78557,2.05336,0.481045,1.35222,1.32166,3.66429,3.10274,0.801025,0.843187,0.3673,0.613727,0.860967,0.601945,1.65839,1.54462,0.673685,1.21296,0.883147,0.873582,0.752969,0.973887,0.233083,0.227151,0.68451,1.41539,1.29358,1.11728,0.320215,0.217639,0.274922,1.4577,0.863053,0.717718,4.68552,0.94904,8.85932,8.41124,123.567
|
||||
15.1522,17.4,40.7916,0.112494,0.652914,0.560489,0.252343,0.0755019,0.467934,1.30285,1.72036,1.94246,0.472081,1.29281,1.28406,3.57886,3.04368,0.782903,0.826519,0.367837,0.61472,0.846827,0.580673,1.57536,1.47222,0.674099,1.18075,0.879576,0.856813,0.732401,0.943026,0.224064,0.223577,0.684178,1.38787,1.17048,1.02117,0.318673,0.21502,0.26778,1.40266,0.853505,0.720548,3.20952,0.888334,8.48255,8.23196,117.639
|
||||
15.2393,17.5,38.0352,0.109465,0.636687,0.547249,0.246388,0.0736883,0.457562,0.868125,1.25484,1.90552,0.465913,1.28183,1.28727,3.55911,2.96512,0.744402,0.80468,0.370489,0.619205,0.846673,0.582087,1.54461,1.43566,0.658292,1.17479,0.882809,0.863783,0.719373,0.925988,0.221621,0.22315,0.686851,1.38381,1.17462,1.02808,0.319951,0.215254,0.266544,1.39045,0.854927,0.725965,1.71235,0.867326,7.52106,8.07331,114.8
|
||||
15.3264,17.6,44.4689,0.104112,0.606816,0.522223,0.235128,0.0702908,0.437292,0.830265,1.21443,1.83316,0.458521,1.24159,1.25934,3.50707,2.93674,0.73522,0.776392,0.358841,0.62172,0.839498,0.579771,1.50304,1.3911,0.641809,1.13731,0.882436,0.870014,0.718086,0.898009,0.212439,0.214004,0.727079,1.51735,1.35578,1.0747,0.303855,0.204653,0.254011,1.3436,0.850701,0.729789,8.47072,0.827641,7.2746,7.95542,120.785
|
||||
15.4135,17.7,41.3269,0.101779,0.594425,0.51218,0.230615,0.0689132,0.42953,0.816115,0.768921,1.6711,0.452831,1.22353,1.24263,2.99113,2.61059,0.735422,0.777543,0.349134,0.604912,0.840677,0.58179,1.49245,1.37869,0.646714,1.11674,0.863885,0.876586,0.720629,0.894183,0.210892,0.214144,0.662738,1.42512,1.3686,1.08603,0.305863,0.205461,0.253692,1.32363,0.834824,0.735092,7.10719,0.811709,6.60466,7.11469,117.107
|
||||
15.5006,17.8,40.6208,0.0984672,0.576228,0.497096,0.223828,0.0668579,0.417505,1.01586,1.22121,1.64526,0.360329,1.19795,1.24374,3.38212,2.8521,0.732167,0.775315,0.351949,0.58832,0.81812,0.582114,1.47084,1.35492,0.6507,1.10897,0.845023,0.857805,0.721616,0.885213,0.207946,0.213576,0.665673,1.32207,1.25858,1.09635,0.307165,0.205603,0.252071,1.30775,0.817679,0.720382,5.70434,0.787782,7.10186,7.74171,115.436
|
||||
15.5876,17.9,39.683,0.0951348,0.557807,0.481773,0.216933,0.0647724,0.405229,1.18252,1.60365,1.73082,0.45968,1.18311,1.22305,3.35665,2.84566,0.728538,0.772693,0.35461,0.59282,0.796319,0.566515,1.44827,1.33021,0.654442,1.1006,0.848022,0.864436,0.722342,0.875754,0.204887,0.212922,0.668393,1.31596,1.26587,1.10625,0.308331,0.205646,0.25031,1.29096,0.818337,0.706794,4.26596,0.763478,7.78806,7.70355,113.053
|
||||
15.6747,18,36.1762,0.0890006,0.522819,0.452076,0.203567,0.0607579,0.380808,0.725114,1.11729,1.64261,0.451792,1.13532,1.19168,3.29117,2.7242,0.696711,0.760773,0.355832,0.594934,0.786447,0.547228,1.36505,1.26384,0.655937,1.07611,0.846608,0.846863,0.703059,0.851774,0.197872,0.210328,0.66906,1.29527,1.14172,1.00859,0.307664,0.203895,0.244926,1.24766,0.812015,0.710484,2.78731,0.716401,6.64461,7.47286,107.386
|
||||
|
|
|
@ -98,7 +98,8 @@ if [[ 1 -eq 1 ]]; then
|
|||
# export CO2percent=4
|
||||
export DATASET="27Al"
|
||||
export PREFIX="Run_"
|
||||
export OUT_DIR="Output_p"
|
||||
export OUT_DIR="Output_p"
|
||||
export CUTLIST=pid_cuts/pid_cutlist.txt
|
||||
export CATHODE_GAIN=3.0
|
||||
rm -f ${OUT_DIR}/*.root
|
||||
export source_vertex=-200.0 # Source on the entrance window
|
||||
|
|
@ -109,6 +110,7 @@ if [[ 1 -eq 1 ]]; then
|
|||
parallel --bar -j 8 process_run ::: {17..22}
|
||||
hadd -j 4 -k ${OUT_DIR}/Al_protons.root ${OUT_DIR}/results_run0{15..22}.root
|
||||
unset CATHODE_GAIN
|
||||
unset CUTLIST
|
||||
# exit
|
||||
fi
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user