Skip to content

Commit ed4a595

Browse files
authored
Merge pull request #58 from xsuite/release/v0.3.2
Release 0.3.2
2 parents ebbc428 + d5c6d33 commit ed4a595

File tree

19 files changed

+154
-100
lines changed

19 files changed

+154
-100
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "xcoll"
3-
version = "0.3.1"
3+
version = "0.3.2"
44
description = "Xsuite collimation package"
55
homepage = "https://github.com/xsuite/xcoll"
66
repository = "https://github.com/xsuite/xcoll"

tests/test__regenerate_kernels.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import xtrack as xt
2+
3+
def test_init():
4+
from xtrack.prebuilt_kernels.kernel_definitions import kernel_definitions
5+
xcoll_kernels = [ker for ker in kernel_definitions if 'xcoll' in ker]
6+
if len(xcoll_kernels) > 0:
7+
xt.prebuild_kernels.regenerate_kernels(kernels=xcoll_kernels)

tests/test_rf_sweep.py

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
from pathlib import Path
22
import numpy as np
3+
import pytest
4+
35
import xtrack as xt
46
import xcoll as xc
57
from xobjects.test_helpers import for_all_test_contexts
68

79
path = Path(__file__).parent / 'data'
810

911
@for_all_test_contexts
10-
def test_dp_pos(test_context):
11-
sweep = -300 # negative sweep => positive off-momentum
12+
@pytest.mark.parametrize("sweep, beam", [[-300, 1], [300, 2]],
13+
ids=["DP pos", "DP neg"])
14+
def test_rf_sweep(sweep, beam, test_context):
1215
num_turns = 6000
1316
num_particles = 5
14-
line = xt.Line.from_json(path / f'sequence_lhc_run3_b1.json')
17+
line = xt.Line.from_json(path / f'sequence_lhc_run3_b{beam}.json')
1518

1619
line.build_tracker()
1720

@@ -21,22 +24,9 @@ def test_dp_pos(test_context):
2124
rf_sweep = xc.RFSweep(line)
2225
# This sweep is 3.5 buckets, so check that all particles are at least 3 buckets away
2326
rf_sweep.track(sweep=sweep, num_turns=num_turns, particles=part)
24-
assert np.all(part.delta > 1.5e-3)
25-
26-
27-
@for_all_test_contexts
28-
def test_dp_neg(test_context):
29-
sweep = 300 # positive sweep => negative off-momentum
30-
num_turns = 6000
31-
num_particles = 5
32-
line = xt.Line.from_json(path / f'sequence_lhc_run3_b2.json')
33-
34-
line.build_tracker()
35-
36-
part = line.build_particles(delta=np.linspace(-2e-4, 2e-4, num_particles),
37-
x_norm=0, px_norm=0, y_norm=0, py_norm=0)
3827

39-
rf_sweep = xc.RFSweep(line)
40-
# This sweep is 3.5 buckets, so check that all particles are at least 3 buckets away
41-
rf_sweep.track(sweep=sweep, num_turns=num_turns, particles=part)
42-
assert np.all(part.delta < -1.5e-3)
28+
# negative sweep => positive off-momentum etc
29+
if sweep < 0:
30+
assert np.all(part.delta > 1.5e-3)
31+
else:
32+
assert np.all(part.delta < -1.5e-3)

tests/test_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from xcoll import __version__
22

33
def test_version():
4-
assert __version__ == '0.3.1'
4+
assert __version__ == '0.3.2'
55

xcoll/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
# Copyright (c) CERN, 2023. #
44
# ######################################### #
55

6-
from .general import _pkg_root, __version__
6+
from .general import _pkg_root, __version__, citation
77

8-
from .beam_elements import BlackAbsorber, EverestBlock, EverestCollimator, EverestCrystal
8+
from .beam_elements import BlackAbsorber, EverestBlock, EverestCollimator, EverestCrystal, element_classes
99
from .scattering_routines.everest import materials, Material, CrystalMaterial
1010
from .manager import CollimatorManager
1111
from .colldb import CollimatorDatabase, load_SixTrack_colldb
1212
from .rf_sweep import RFSweep
1313

14+
# print("If you use Xcoll in your simulations, please cite us :-)")
15+
# print(citation)

xcoll/beam_elements/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,9 @@
33
from .everest import EverestBlock, EverestCollimator, EverestCrystal
44

55
_all_collimator_types = {BlackAbsorber, EverestCollimator, EverestCrystal}
6+
7+
block_classes = tuple(v for v in globals().values()
8+
if isinstance(v, type) and issubclass(v, BaseBlock) and v != BaseBlock)
9+
collimator_classes = tuple(v for v in globals().values()
10+
if isinstance(v, type) and issubclass(v, BaseCollimator) and v != BaseCollimator)
11+
element_classes = block_classes + collimator_classes

xcoll/beam_elements/base.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# copyright ############################### #
2-
# This file is part of the Xcoll Package. #
2+
# This file is part of the Xcoll Package. #
33
# Copyright (c) CERN, 2023. #
44
# ######################################### #
55

@@ -20,6 +20,7 @@ class InvalidXcoll(xt.BeamElement):
2020

2121
isthick = True
2222
behaves_like_drift = True
23+
# allow_track = False # Need to wait for xtrack release to implement
2324
skip_in_loss_location_refinement = True
2425
allow_backtrack = True
2526

@@ -47,6 +48,7 @@ class BaseBlock(xt.BeamElement):
4748

4849
isthick = True
4950
behaves_like_drift = True
51+
# allow_track = False # Need to wait for xtrack release to implement
5052
skip_in_loss_location_refinement = True
5153

5254
_extra_c_sources = [
@@ -88,6 +90,7 @@ class BaseCollimator(xt.BeamElement):
8890

8991
isthick = True
9092
behaves_like_drift = True
93+
# allow_track = False # Need to wait for xtrack release to implement
9194
skip_in_loss_location_refinement = True
9295

9396
_skip_in_to_dict = ['jaw_L', 'jaw_R', 'ref_x', 'ref_y',

xcoll/beam_elements/collimators_src/everest_block.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@
1010

1111

1212
/*gpufun*/
13-
void EverestBlock_set_material(EverestBlockData el, LocalParticle* part0){
13+
void EverestBlock_set_material(EverestBlockData el){
1414
MaterialData material = EverestBlockData_getp__material(el);
1515
RandomRutherfordData rng = EverestBlockData_getp_rutherford_rng(el);
1616
RandomRutherford_set_by_xcoll_material(rng, (GeneralMaterialData) material);
1717
}
1818

19+
1920
/*gpufun*/
2021
EverestCollData EverestBlock_init(EverestBlockData el, LocalParticle* part0, int8_t active){
2122
EverestCollData coll = (EverestCollData) malloc(sizeof(EverestCollData_));
@@ -32,6 +33,7 @@ EverestCollData EverestBlock_init(EverestBlockData el, LocalParticle* part0, int
3233
coll->csref[0] = MaterialData_get_cross_section(material, 0);
3334
coll->csref[1] = MaterialData_get_cross_section(material, 1);
3435
coll->csref[5] = MaterialData_get_cross_section(material, 5);
36+
coll->only_mcs = MaterialData_get__only_mcs(material);
3537

3638
// Impact table
3739
coll->record = EverestBlockData_getp_internal_record(el, part0);
@@ -46,29 +48,27 @@ EverestCollData EverestBlock_init(EverestBlockData el, LocalParticle* part0, int
4648

4749

4850
/*gpufun*/
49-
EverestData EverestBlock_init_data(LocalParticle* part, EverestCollData coll, int8_t only_mcs){
51+
EverestData EverestBlock_init_data(LocalParticle* part, EverestCollData coll){
5052
EverestData everest = (EverestData) malloc(sizeof(EverestData_));
5153
everest->coll = coll;
5254
everest->rescale_scattering = 1;
5355
#ifndef XCOLL_REFINE_ENERGY
54-
if (!only_mcs){
55-
// Preinitialise scattering parameters
56-
double charge_ratio = LocalParticle_get_charge_ratio(part);
57-
double mass_ratio = charge_ratio / LocalParticle_get_chi(part);
58-
double energy = ( LocalParticle_get_ptau(part) + 1 / LocalParticle_get_beta0(part)
59-
) * mass_ratio * LocalParticle_get_p0c(part) / 1e9; // energy in GeV
60-
calculate_scattering(everest, energy);
61-
calculate_ionisation_properties(everest, energy);
62-
}
56+
// Preinitialise scattering parameters
57+
double charge_ratio = LocalParticle_get_charge_ratio(part);
58+
double mass_ratio = charge_ratio / LocalParticle_get_chi(part);
59+
double energy = ( LocalParticle_get_ptau(part) + 1 / LocalParticle_get_beta0(part)
60+
) * mass_ratio * LocalParticle_get_p0c(part) / 1e9; // energy in GeV
61+
calculate_scattering(everest, energy);
62+
calculate_ionisation_properties(everest, energy);
6363
#endif
6464
return everest;
6565
}
6666

67+
6768
/*gpufun*/
6869
void EverestBlock_track_local_particle(EverestBlockData el, LocalParticle* part0) {
6970
int8_t active = EverestBlockData_get__tracking(el);
7071
double const length = EverestBlockData_get_length(el);
71-
int8_t const only_mcs = EverestBlockData_get__only_mcs(el);
7272

7373
// Initialise collimator data
7474
// TODO: we want this to happen before tracking (instead of every turn), as a separate kernel
@@ -84,7 +84,7 @@ void EverestBlock_track_local_particle(EverestBlockData el, LocalParticle* part0
8484
int8_t is_valid = xcoll_check_particle_init(coll->rng, part);
8585

8686
if (is_valid) {
87-
EverestData everest = EverestBlock_init_data(part, coll, only_mcs);
87+
EverestData everest = EverestBlock_init_data(part, coll);
8888
double const e0 = LocalParticle_get_energy0(part) / 1.e9; // Reference energy in GeV
8989
double const p0 = LocalParticle_get_p0c(part) / 1e9; // Reference momentum in GeV
9090
double const mass_ratio = LocalParticle_get_charge_ratio(part) / LocalParticle_get_chi(part); // m/m0
@@ -95,7 +95,7 @@ void EverestBlock_track_local_particle(EverestBlockData el, LocalParticle* part0
9595
double const px_in = LocalParticle_get_px(part);
9696
double const py_in = LocalParticle_get_py(part);
9797

98-
double* result = jaw(everest, part, energy, length, only_mcs, 0);
98+
double* result = jaw(everest, part, energy, length, 0);
9999
energy = result[0];
100100
if (result[1] == 1){ is_abs = 1; }
101101
double s_out = result[2];

xcoll/beam_elements/collimators_src/everest_collimator.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
#include <stdio.h>
1010

1111

12-
/*gpufun*/
13-
void EverestCollimator_set_material(EverestCollimatorData el, LocalParticle* part0){
12+
void EverestCollimator_set_material(EverestCollimatorData el){
1413
MaterialData material = EverestCollimatorData_getp__material(el);
1514
RandomRutherfordData rng = EverestCollimatorData_getp_rutherford_rng(el);
1615
RandomRutherford_set_by_xcoll_material(rng, (GeneralMaterialData) material);
@@ -36,6 +35,7 @@ EverestCollData EverestCollimator_init(EverestCollimatorData el, LocalParticle*
3635
coll->csref[0] = MaterialData_get_cross_section(material, 0);
3736
coll->csref[1] = MaterialData_get_cross_section(material, 1);
3837
coll->csref[5] = MaterialData_get_cross_section(material, 5);
38+
coll->only_mcs = MaterialData_get__only_mcs(material);
3939

4040
// Impact table
4141
coll->record = EverestCollimatorData_getp_internal_record(el, part0);
@@ -93,8 +93,8 @@ void EverestCollimator_track_local_particle(EverestCollimatorData el, LocalParti
9393
double const sin_zR = EverestCollimatorData_get_sin_zR(el);
9494
double const cos_zR = EverestCollimatorData_get_cos_zR(el);
9595
if (fabs(sin_zL-sin_zR) > 1.e-10 || fabs(cos_zL-cos_zR) > 1.e-10 ){
96-
printf("Jaws with different angles not yet implemented!");
97-
fflush(stdout);
96+
printf("Jaws with different angles not yet implemented!"); //only_for_context cpu_serial
97+
fflush(stdout); //only_for_context cpu_serial
9898
kill_all_particles(part0, XC_ERR_NOT_IMPLEMENTED);
9999
};
100100

xcoll/beam_elements/collimators_src/everest_crystal.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@
99
#include <stdio.h>
1010

1111

12-
1312
/*gpufun*/
14-
void EverestCrystal_set_material(EverestCrystalData el, LocalParticle* part0){
13+
void EverestCrystal_set_material(EverestCrystalData el){
1514
CrystalMaterialData material = EverestCrystalData_getp__material(el);
1615
RandomRutherfordData rng = EverestCrystalData_getp_rutherford_rng(el);
1716
RandomRutherford_set_by_xcoll_material(rng, (GeneralMaterialData) material);

0 commit comments

Comments
 (0)