This page demonstrates deserialization and evaluation of an amplitude model for the decay \(\Lambda_b^0 \to p K^- \gamma\). The resonant structure is studied using proton-proton collision data recorded at centre-of-mass energies of \(7\), \(8\), and \(13\) TeV collected with the LHCb detector, INSPIRE-HEP 2765817.
Non-standard lineshapes are used to model resonances that do not conform to a simple BreitWigner distributions, or a MultichannelBreitWigner has to be defined explicitly. The code below defines a new NonResonant lineshape, and its deserialization method. In this case this is just a constant.
Deserialization of Objects to a Workspace
Model components are deserialized from a JSON file into computational objects within a workspace for further manipulation. First, functions representing lineshapes and form-factors are built. Following this, distributions are processed and added to the workspace.
The integrity of the model is checked by validating the value of distributions at a few phase space points. The table lists the validation checks and their status. The marks βπ’β, βπ‘β, and βπ΄β indicate an accuracy of \(<10^{-12}\), \(<10^{-2}\), or \(\ge10^{-2}\), respectively, for the difference between the reference and computed values.
A loop over validation points
df =let@unpack misc, parameter_points = input@unpack amplitude_model_checksums = miscmap(amplitude_model_checksums) do check_point_info@unpack point, value, distribution = check_point_info## pull distribution dist = workspace[distribution]# pull correct parameter point parameter_points_dict =array2dict(parameter_points; key="name")# find the point in the list of points parameter_point = parameter_points_dict[point]# compute, compare _parameters =array2dict(parameter_point["parameters"]; key="name", apply=v -> v["value"])# computed_value =dist(_parameters)#tonumber(X::Number) = Xtonumber(X::String) =string2complex(X) reference_value =tonumber(value) status =label_diff(reference_value - computed_value)# (; Distribution=distribution, Reference=value, Computed_value=computed_value, Point=point, Status=status)end|> DataFrameend
17Γ5 DataFrame
Row
Distribution
Reference
Computed_value
Point
Status
String
Any
Complexβ¦
String
Char
1
default_model
645.688
645.688+0.0im
validation_point1
π‘
2
default_model
33.3131
33.3131+0.0im
validation_point2
π’
3
default_model
38.2867
38.2867+0.0im
validation_point3
π’
4
L1405_Flatte
-0.740197550450631 + 0.23636822774611727i
-0.740198+0.236368im
validation_point_m12sq
π’
5
L1890_BW
2.198693289424333 + 1.0366413279995204i
2.19869+1.03664im
validation_point_m12sq
π’
6
L1800_BW
0.3117344649326182 + 2.7741995686483376i
0.311734+2.7742im
validation_point_m12sq
π’
7
L1520_BW
-0.6431712763866598 + 0.5539481728042333i
-0.643171+0.553948im
validation_point_m12sq
π’
8
L2110_BW
0.8540683809737195 + 0.0415635681035755i
0.854068+0.0415636im
validation_point_m12sq
π’
9
L1680_BW
-2.4613302416589518 + 0.36109808787606623i
-2.46133+0.361098im
validation_point_m12sq
π’
10
L2350_BW
0.43057041569422266 + 0.00019710073244917788i
0.43057+0.000197101im
validation_point_m12sq
π’
11
L1600_BW
-0.6293313194817324 + 0.7663369213404696i
-0.629331+0.766337im
validation_point_m12sq
π’
12
L1810_BW
0.1064360891979254 + 5.093985975099388i
0.106436+5.09399im
validation_point_m12sq
π’
13
L1820_BW
4.647408096395898 + 4.443944768616481i
4.64741+4.44394im
validation_point_m12sq
π’
14
L1830_BW
3.824528421578999 + 3.827749839464702i
3.82453+3.82775im
validation_point_m12sq
π’
15
L2100_BW
0.8262246387007841 + 0.013532417439695257i
0.826225+0.0135324im
validation_point_m12sq
π’
16
L1690_BW
-1.8597288296334098 + 1.396126484908448i
-1.85973+1.39613im
validation_point_m12sq
π’
17
LNR30_NR
1.0 + 0.0i
1.0+0.0im
validation_point_m12sq
π’
Visualization
The model describing the decay is fetched from the workspace
model_dist = [v for (k, v) in workspace if v isa HadronicUnpolarizedIntensity] |> first;model = model_dist.model
The Dalitz plot shows the probability distribution across two dimensional phase space of the decay in the range of mass \(m_{pK^{-}}\) from \(1.5\) to \(2.5 GeV/c^2\).
The projection of the model onto a mass variable is shown by black line. Contributions from individual resonances are shown by the colored lines.
Computation of projections
let k =3 i, j =ij_from_k(k) model = model_dist.model# mlims = (sqrt(lims(3, masses(model))[1]), 2.5) mv =range(mlims..., 200) |> shift_by_half#plot()plot!(mv, lab=L"\textrm{Total}") do m I =Base.Fix1(unpolarized_intensity, model) m *quadgk(projection_integrand(I, masses(model), m^2; k), 0, 1)[1] /1e3end chain_names =Set(model.names) |> collect |> sortfor name in chain_names _model = model[model.names.==name] lab =replace(name, "L"=>"\\varLambda(\\textrm{") *"})"plot!(mv, lab=latexstring(lab)) do m I =Base.Fix1(unpolarized_intensity, _model) m *quadgk(projection_integrand(I, masses(_model), m^2; k), 0, 1)[1] /1e3endendplot!(; xlab=L"m_{pK^-}\,\, [\textrm{GeV}]", ylab=L"\textrm{d} N /\textrm{d} m_{pK^-}\,\, [\textrm{GeV}^{-1}]")end