88 lines
2.6 KiB
SQL
88 lines
2.6 KiB
SQL
WITH uniform_structure_leptons AS (
|
|
SELECT
|
|
event,
|
|
MET,
|
|
list_distinct(
|
|
list_concat(
|
|
list_transform(
|
|
COALESCE(Muon, ARRAY []),
|
|
x -> CAST( ROW(x.pt, x.eta, x.phi, x.mass, x.charge, 'm') AS ROW( pt REAL, eta REAL, phi REAL, mass REAL, charge INTEGER, type CHAR ) )
|
|
),
|
|
list_transform(
|
|
COALESCE(Electron, ARRAY []),
|
|
x -> CAST( ROW(x.pt, x.eta, x.phi, x.mass, x.charge, 'e') AS ROW( pt REAL, eta REAL, phi REAL, mass REAL, charge INTEGER, type CHAR ) )
|
|
)
|
|
)
|
|
) AS Leptons
|
|
FROM hep_singleMu
|
|
WHERE len(Muon) + len(Electron) > 2
|
|
),
|
|
lepton_pairs AS (
|
|
WITH m AS (select unnest(Leptons) AS m FROM hep_singleMu)
|
|
SELECT
|
|
*,
|
|
CAST(
|
|
ROW(
|
|
l1.pt * cos(l1.phi) + l2.pt * cos(l2.phi),
|
|
l1.pt * sin(l1.phi) + l2.pt * sin(l2.phi),
|
|
l1.pt * ( ( exp(l1.eta) - exp(-l1.eta) ) / 2.0 ) + l2.pt * ( ( exp(l2.eta) - exp(-l2.eta) ) / 2.0 ),
|
|
sqrt(l1.pt * cosh(l1.eta) * l1.pt * cosh(l1.eta) + l1.mass * l1.mass) + sqrt(l2.pt * cosh(l2.eta) * l2.pt * cosh(l2.eta) + l2.mass * l2.mass)
|
|
) AS
|
|
ROW (x REAL, y REAL, z REAL, e REAL)
|
|
) AS l,
|
|
idx1 AS l1_idx,
|
|
idx2 AS l2_idx
|
|
FROM uniform_structure_leptons
|
|
CROSS JOIN (
|
|
SELECT l1, row_number()OVER (PARTITION BY event) idx1
|
|
FROM (select unnest(Leptons) l1, event FROM uniform_structure_leptons)
|
|
) AS _l1
|
|
CROSS JOIN (
|
|
SELECT l2, row_number()OVER (PARTITION BY event) idx2
|
|
FROM (select unnest(Leptons) l2, event FROM uniform_structure_leptons)
|
|
) AS _l2
|
|
WHERE idx1 < idx2 AND l1.type = l2.type AND l1.charge != l2.charge
|
|
),
|
|
processed_pairs AS (
|
|
SELECT
|
|
event,
|
|
min_by(
|
|
ROW(
|
|
l1_idx,
|
|
l2_idx,
|
|
Leptons,
|
|
MET.pt,
|
|
MET.phi
|
|
),
|
|
abs(91.2 - sqrt(l.e * l.e - l.x * l.x - l.y * l.y - l.z * l.z))
|
|
) AS system
|
|
FROM lepton_pairs
|
|
GROUP BY event
|
|
),
|
|
other_max_pt AS (
|
|
SELECT event, CAST(max_by(sqrt(2 * system[4] * l.pt * (1.0 - cos((system[5]- l.phi + pi()) % (2 * pi()) - pi()))), l.pt) AS REAL) AS pt
|
|
FROM processed_pairs
|
|
CROSS JOIN (
|
|
SELECT l, row_number()OVER (PARTITION BY row_id) idx
|
|
FROM (select unnest(system[3]) AS l, event row_id FROM processed_pairs)
|
|
)
|
|
WHERE idx != system[1] AND idx != system[2]
|
|
GROUP BY event
|
|
)
|
|
SELECT
|
|
FLOOR((
|
|
CASE
|
|
WHEN pt < 15 THEN 14.99
|
|
WHEN pt > 250 THEN 250.1
|
|
ELSE pt
|
|
END - 0.9) / 2.35) * 2.35 + 2.075 AS x,
|
|
COUNT(*) AS y
|
|
FROM other_max_pt
|
|
GROUP BY FLOOR((
|
|
CASE
|
|
WHEN pt < 15 THEN 14.99
|
|
WHEN pt > 250 THEN 250.1
|
|
ELSE pt
|
|
END - 0.9) / 2.35) * 2.35 + 2.075
|
|
ORDER BY x;
|