Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions crates/ekore/src/anomalous_dimensions/polarized/spacelike/as1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,14 @@ mod tests {
let me = gamma_qg(&mut c, NF);
assert_approx_eq_cmplx!(f64, me, Complex::zero(), epsilon = 1e-12);
}

// TODO: activate this test once the beta function will be available
// #[test]
// fn axial_anomaly() {
// const N: Complex<f64> = cmplx!(1., 0.);
// let mut c = Cache::new(N);
// let me = gamma_gg(&mut c, NF);
// let beta = -1.0 * beta_qcd_as2(NF);
// assert_approx_eq_cmplx!(f64, me, beta);
// }
}
14 changes: 14 additions & 0 deletions crates/ekore/src/anomalous_dimensions/polarized/spacelike/as2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ pub fn gamma_singlet(c: &mut Cache, nf: u8) -> [[Complex<f64>; 2]; 2] {

#[cfg(test)]
mod tests {
use super::super::as1::gamma_gq as as1_gamma_gq;
use super::*;
use crate::harmonics::cache::Cache;
use crate::{assert_approx_eq_cmplx, cmplx};
Expand Down Expand Up @@ -192,4 +193,17 @@ mod tests {
epsilon = 1e-13
);
}

#[test]
fn axial_anomaly() {
const N: Complex<f64> = cmplx!(1., 0.);
let mut c = Cache::new(N);
let me_ps = gamma_ps(&mut c, NF);
let as1_gq = -2.0 * (NF as f64) * as1_gamma_gq(&mut c, NF);
assert_approx_eq_cmplx!(f64, me_ps, as1_gq);
// TODO: activate this test once the beta function will be available
// let me_gg = gamma_gg(&mut c, NF);
// let beta = -1.0 * beta_qcd_as2(NF);
// assert_approx_eq_cmplx!(f64, me_gg, beta, rel=9e-7);
}
}
11 changes: 9 additions & 2 deletions doc/source/theory/pQCD.rst
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,9 @@ At |NLO|, the singlet entry of the quark-quark anomalous dimension can be decomp
\gamma^{(1)}_{qq} =\gamma^{(1)}_{ps} + \gamma^{(1)}_{ns,+}

The non-singlet sector in the polarized case swaps the plus and minus non-singlet relative to the unpolarized case.
This is because the polarized non-singlet splitting functions are defined as the difference between the probability of the polarized parton splitting into daughter partons of the same flavour
and daughters splitting into a different flavours and opposite helicity. The first moments of the anomalous dimensions are:
This is because the polarized non-singlet splitting functions are defined as the difference between the probability of the polarized parton splitting
into daughter partons of the same flavour and same helicity and daughters of a different flavours and opposite helicity.
The first moments of the anomalous dimensions are:

.. math ::
\gamma^{(1)}_{ns,+} (N=1) &= 0 \\
Expand All @@ -102,6 +103,12 @@ At |NNLO| the non-singlet is further decomposed into the helicity difference qua
where :math:`\gamma^{(2)}_{ns,-}` is the minus flavour asymmetry non-singlet and :math:`\gamma^{(2)}_{ns,s}` the sea-like polarized non-singlet.
The singlet entry :math:`\gamma^{(2)}_{qq}` is defined as above in the |NLO| case.

Finally the violation of the axial current conservation :math:`\bar{\psi} \gamma_\mu \gamma_5 \bar{\psi}` only through
loop corrections impose the following relations to the singlet splittings at all orders :cite:`Moch:2014sna` :

.. math ::
\gamma^{(n)}_{gg} & = - \beta_n \\
\gamma^{(n)}_{ps} & = - 2 n_f \gamma^{(n-1)}_{gq}

Unified Splitting Functions
---------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import numpy as np

import ekore.anomalous_dimensions.polarized.space_like.as1 as as1
from eko import constants
from eko import beta, constants
from ekore import harmonics

NF = 5
Expand Down Expand Up @@ -30,3 +30,10 @@ def test_gluon_momentum():
def test_qg_helicity_conservation():
N = complex(1.0, 0.0)
np.testing.assert_almost_equal(as1.gamma_qg(N, NF), 0)


def test_axial_anomaly():
# violation of the axial current conservation happens only through loops
N = complex(1.0, 0.0)
cache = harmonics.cache.reset()
np.testing.assert_allclose(as1.gamma_gg(N, cache, NF), -beta.beta_qcd_as2(NF))
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# Test NLO Polarized splitting functions
import numpy as np

import ekore.anomalous_dimensions.polarized.space_like.as1 as as1
import ekore.anomalous_dimensions.polarized.space_like.as2 as as2
from eko import beta
from eko.constants import CA, CF, TR
from ekore import harmonics

Expand Down Expand Up @@ -32,7 +34,10 @@ def test_qg_momentum():
cache = harmonics.cache.reset()
np.testing.assert_allclose(
-as2.gamma_qg(N, nf, cache),
4 * nf * (0.574074 * CF - 2 * CA * (-7 / 18 + 1 / 6 * (5 - np.pi**2 / 3))) * TR,
4
* nf
* (0.574074 * CF - 2 * CA * (-7 / 18 + 1 / 6 * (5 - np.pi**2 / 3)))
* TR,
)


Expand All @@ -55,5 +60,16 @@ def test_gg_momentum():
cache = harmonics.cache.reset()
np.testing.assert_almost_equal(
-as2.gamma_gg(N, nf, cache),
4 * (-1.7537256813471833 * CA**2 + ((29 * CA) / 27 - (28 * CF) / 27) * nf * TR),
4
* (-1.7537256813471833 * CA**2 + ((29 * CA) / 27 - (28 * CF) / 27) * nf * TR),
)


def test_axial_anomaly():
# violation of the axial current conservation happens only through loops
N = complex(1.0, 0.0)
cache = harmonics.cache.reset()
np.testing.assert_allclose(
as2.gamma_gg(N, nf, cache), -beta.beta_qcd_as3(nf), rtol=9e-7
)
np.testing.assert_allclose(as2.gamma_ps(N, nf), -2 * nf * as1.gamma_gq(N))
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# Test NNLO Polarized splitting functions
import numpy as np

import ekore.anomalous_dimensions.polarized.space_like.as2 as as2
import ekore.anomalous_dimensions.polarized.space_like.as3 as as3
import ekore.anomalous_dimensions.unpolarized.space_like.as3 as as3_unpol
from eko import beta
from eko.constants import zeta2, zeta3
from ekore import harmonics

Expand Down Expand Up @@ -54,3 +56,15 @@ def test_ns():
np.testing.assert_allclose(
as3_unpol.gamma_nsp(N, nf, cache), as3.gamma_nsm(N, nf, cache)
)


def test_axial_anomaly():
# violation of the axial current conservation happens only through loops
N = complex(1.0, 0.0)
cache = harmonics.cache.reset()
np.testing.assert_allclose(
as3.gamma_gg(N, nf, cache), -beta.beta_qcd_as4(nf), rtol=2e-5
)
np.testing.assert_allclose(
as3.gamma_ps(N, nf, cache), -2 * nf * as2.gamma_gq(N, nf, cache), rtol=3e-6
)