Skip to content

Commit 6f52dc1

Browse files
committed
switch to uniform, update calculation
1 parent 022e0ef commit 6f52dc1

File tree

12 files changed

+155
-146
lines changed

12 files changed

+155
-146
lines changed

modules/schema/src/main/resources/lucuma/odb/graphql/OdbSchema.graphql

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3658,7 +3658,7 @@ input OffsetInput {
36583658

36593659
"""
36603660
An offset generator produces a series of offsets according to generator-specific
3661-
parameters. Only (at most) one of `enumerated`, `grid`, `random` or `spiral`
3661+
parameters. Only (at most) one of `enumerated`, `random`, `spiral` or `uniform`
36623662
will be defined. All others will be `null`. The `generatorType` corresponds to
36633663
the entry (if any) that is defined. If the generator type of `NONE`, then none
36643664
of the entries will be defined.
@@ -3667,32 +3667,34 @@ type OffsetGenerator {
36673667
generatorType: OffsetGeneratorType!
36683668

36693669
enumerated: EnumeratedOffsetGenerator
3670-
grid: GridOffsetGenerator
36713670
random: RandomOffsetGenerator
36723671
spiral: SpiralOffsetGenerator
3672+
uniform: UniformOffsetGenerator
36733673
}
36743674

36753675
"""
3676-
An offset generator is specified by defining one of the `enumerated`, `grid`,
3677-
`random` or `spiral` options. If none are defined, the generator type will be
3676+
An offset generator is specified by defining one of the `enumerated`, `random`,
3677+
`spiral` or `uniform` options. If none are defined, the generator type will be
36783678
`NONE`.
36793679
"""
36803680
input OffsetGeneratorInput {
36813681
enumerated: EnumeratedOffsetGeneratorInput
3682-
grid: GridOffsetGeneratorInput
36833682
random: RandomOffsetGeneratorInput
36843683
spiral: SpiralOffsetGeneratorInput
3684+
uniform: UniformOffsetGeneratorInput
36853685
}
36863686

36873687
enum OffsetGeneratorType {
36883688
NONE,
36893689
ENUMERATED,
3690-
GRID,
36913690
RANDOM,
3692-
SPIRAL
3691+
SPIRAL,
3692+
UNIFORM
36933693
}
36943694

3695-
# In the `ENUMERATED` option offsets are explicitly specified instead of calculated.
3695+
"""
3696+
In the `ENUMERATED` option offsets are explicitly specified instead of calculated.
3697+
"""
36963698
type EnumeratedOffsetGenerator {
36973699
# Explicit offset (and guiding values). If the list is empty then this
36983700
# is essentially the same as `NONE`. If the ITC prescribes _n_ steps for
@@ -3706,22 +3708,6 @@ input EnumeratedOffsetGeneratorInput {
37063708
values: [TelescopeConfigInput!]!
37073709
}
37083710

3709-
# Defines a region of the sky using two corners. Exposures are
3710-
# then distributed across this region as evenly as possible.
3711-
type GridOffsetGenerator {
3712-
cornerA: Offset!
3713-
cornerB: Offset!
3714-
}
3715-
3716-
"""
3717-
Defines the region over which the grid pattern of offsets will be distributed.
3718-
The number of points is determined by integration time calculator results.
3719-
"""
3720-
input GridOffsetGeneratorInput {
3721-
cornerA: OffsetInput!
3722-
cornerB: OffsetInput!
3723-
}
3724-
37253711
# The random offset pattern is defined by the limiting `size` and
37263712
# the `center` point. The offsets are random, but non-repeating.
37273713
type RandomOffsetGenerator {
@@ -3751,6 +3737,24 @@ input SpiralOffsetGeneratorInput {
37513737
center: OffsetInput
37523738
}
37533739

3740+
"""
3741+
Defines a region of the sky using two corners. Exposures are
3742+
then distributed across this region as evenly as possible.
3743+
"""
3744+
type UniformOffsetGenerator {
3745+
cornerA: Offset!
3746+
cornerB: Offset!
3747+
}
3748+
3749+
"""
3750+
Defines the region over which the pattern of offsets will be distributed.
3751+
The number of points is determined by integration time calculator results.
3752+
"""
3753+
input UniformOffsetGeneratorInput {
3754+
cornerA: OffsetInput!
3755+
cornerB: OffsetInput!
3756+
}
3757+
37543758
"""
37553759
Parallax, choose one of the available units
37563760
"""

modules/sequence/src/main/scala/lucuma/odb/sequence/data/OffsetGeneratorType.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ import lucuma.core.util.Enumerated
88
enum OffsetGeneratorType(val tag: String) derives Enumerated:
99
case NoGenerator extends OffsetGeneratorType("none")
1010
case Enumerated extends OffsetGeneratorType("enumerated")
11-
case Grid extends OffsetGeneratorType("grid")
1211
case Random extends OffsetGeneratorType("random")
13-
case Spiral extends OffsetGeneratorType("spiral")
12+
case Spiral extends OffsetGeneratorType("spiral")
13+
case Uniform extends OffsetGeneratorType("uniform")

modules/service/src/main/resources/db/migration/V1064__offset_generator.sql

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
CREATE TYPE e_offset_generator_type AS ENUM(
22
'none',
33
'enumerated',
4-
'grid',
54
'random',
6-
'spiral'
5+
'spiral',
6+
'uniform'
77
);
88

99
CREATE TYPE e_offset_generator_role AS ENUM(
@@ -13,20 +13,20 @@ CREATE TYPE e_offset_generator_role AS ENUM(
1313

1414
CREATE TABLE t_offset_generator (
1515

16-
c_observation_id d_observation_id NOT NULL REFERENCES t_observation(c_observation_id) ON DELETE CASCADE,
17-
c_role e_offset_generator_role NOT NULL,
16+
c_observation_id d_observation_id NOT NULL REFERENCES t_observation(c_observation_id) ON DELETE CASCADE,
17+
c_role e_offset_generator_role NOT NULL,
1818
PRIMARY KEY (c_observation_id, c_role),
1919

20-
c_type e_offset_generator_type NOT NULL,
20+
c_type e_offset_generator_type NOT NULL,
2121

22-
c_grid_corner_a_p d_angle_µas NOT NULL DEFAULT 0,
23-
c_grid_corner_a_q d_angle_µas NOT NULL DEFAULT 0,
24-
c_grid_corner_b_p d_angle_µas NOT NULL DEFAULT 0,
25-
c_grid_corner_b_q d_angle_µas NOT NULL DEFAULT 0,
22+
c_uniform_corner_a_p d_angle_µas NOT NULL DEFAULT 0,
23+
c_uniform_corner_a_q d_angle_µas NOT NULL DEFAULT 0,
24+
c_uniform_corner_b_p d_angle_µas NOT NULL DEFAULT 0,
25+
c_uniform_corner_b_q d_angle_µas NOT NULL DEFAULT 0,
2626

27-
c_size d_angle_µas NOT NULL DEFAULT 0,
28-
c_center_offset_p d_angle_µas NOT NULL DEFAULT 0,
29-
c_center_offset_q d_angle_µas NOT NULL DEFAULT 0
27+
c_size d_angle_µas NOT NULL DEFAULT 0,
28+
c_center_offset_p d_angle_µas NOT NULL DEFAULT 0,
29+
c_center_offset_q d_angle_µas NOT NULL DEFAULT 0
3030

3131
);
3232

@@ -59,12 +59,12 @@ CREATE VIEW v_offset_generator AS
5959
CASE WHEN o.c_role = 'sky' THEN o.c_observation_id END AS c_sky_observation_id,
6060
CASE WHEN o.c_type = 'enumerated' THEN o.c_observation_id END AS c_enumerated_observation_id,
6161
CASE WHEN o.c_type = 'enumerated' THEN o.c_role END AS c_enumerated_role,
62-
CASE WHEN o.c_type = 'grid' THEN o.c_observation_id END AS c_grid_observation_id,
63-
CASE WHEN o.c_type = 'grid' THEN o.c_role END AS c_grid_role,
6462
CASE WHEN o.c_type = 'random' THEN o.c_observation_id END AS c_random_observation_id,
6563
CASE WHEN o.c_type = 'random' THEN o.c_role END AS c_random_role,
6664
CASE WHEN o.c_type = 'spiral' THEN o.c_observation_id END AS c_spiral_observation_id,
67-
CASE WHEN o.c_type = 'spiral' THEN o.c_role END AS c_spiral_role
65+
CASE WHEN o.c_type = 'spiral' THEN o.c_role END AS c_spiral_role,
66+
CASE WHEN o.c_type = 'uniform' THEN o.c_observation_id END AS c_uniform_observation_id,
67+
CASE WHEN o.c_type = 'uniform' THEN o.c_role END AS c_uniform_role
6868
FROM t_offset_generator o;
6969

7070

modules/service/src/main/scala/lucuma/odb/graphql/BaseMapping.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,6 @@ trait BaseMapping[F[_]]
208208
lazy val GmosSouthStepType = schema.ref("GmosSouthStep")
209209
lazy val GmosBinningType = schema.ref("GmosBinning")
210210
lazy val GoaPropertiesType = schema.ref("GoaProperties")
211-
lazy val GridOffsetGeneratorType = schema.ref("GridOffsetGenerator")
212211
lazy val GroupType = schema.ref("Group")
213212
lazy val GroupIdType = schema.ref("GroupId")
214213
lazy val GroupEditType = schema.ref("GroupEdit")
@@ -385,6 +384,7 @@ trait BaseMapping[F[_]]
385384
lazy val TimingWindowType = schema.ref("TimingWindow")
386385
lazy val ToOActivationType = schema.ref("ToOActivation")
387386
lazy val TransactionIdType = schema.ref("TransactionId")
387+
lazy val UniformOffsetGeneratorType = schema.ref("UniformOffsetGenerator")
388388
lazy val UnlinkUserResultType = schema.ref("UnlinkUserResult")
389389
lazy val UpdateAsterismsResultType = schema.ref("UpdateAsterismsResult")
390390
lazy val UpdateAttachmentsResultType = schema.ref("UpdateAttachmentsResult")

modules/service/src/main/scala/lucuma/odb/graphql/input/OffsetGeneratorInput.scala

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ sealed trait OffsetGeneratorInput:
2727
this match
2828
case OffsetGeneratorInput.NoGenerator => OffsetGeneratorType.NoGenerator
2929
case OffsetGeneratorInput.Enumerated(_) => OffsetGeneratorType.Enumerated
30-
case OffsetGeneratorInput.Grid(_, _) => OffsetGeneratorType.Grid
3130
case OffsetGeneratorInput.Random(_, _) => OffsetGeneratorType.Random
3231
case OffsetGeneratorInput.Spiral(_, _) => OffsetGeneratorType.Spiral
32+
case OffsetGeneratorInput.Uniform(_, _) => OffsetGeneratorType.Uniform
3333

3434
object OffsetGeneratorInput:
3535

@@ -39,15 +39,6 @@ object OffsetGeneratorInput:
3939
values: NonEmptyList[TelescopeConfig]
4040
) extends OffsetGeneratorInput
4141

42-
case class Grid(
43-
cornerA: Offset,
44-
cornerB: Offset
45-
) extends OffsetGeneratorInput
46-
47-
object Grid:
48-
val cornerA: Lens[Grid, Offset] = GenLens[Grid](_.cornerA)
49-
val cornerB: Lens[Grid, Offset] = GenLens[Grid](_.cornerB)
50-
5142
case class Random(
5243
size: Angle,
5344
center: Offset
@@ -58,9 +49,18 @@ object OffsetGeneratorInput:
5849
center: Offset
5950
) extends OffsetGeneratorInput
6051

61-
private def grid: Prism[OffsetGeneratorInput, Grid] = GenPrism[OffsetGeneratorInput, Grid]
62-
val cornerA: Optional[OffsetGeneratorInput, Offset] = grid.andThen(Grid.cornerA)
63-
val cornerB: Optional[OffsetGeneratorInput, Offset] = grid.andThen(Grid.cornerB)
52+
case class Uniform(
53+
cornerA: Offset,
54+
cornerB: Offset
55+
) extends OffsetGeneratorInput
56+
57+
object Uniform:
58+
val cornerA: Lens[Uniform, Offset] = GenLens[Uniform](_.cornerA)
59+
val cornerB: Lens[Uniform, Offset] = GenLens[Uniform](_.cornerB)
60+
61+
private def uniform: Prism[OffsetGeneratorInput, Uniform] = GenPrism[OffsetGeneratorInput, Uniform]
62+
val cornerA: Optional[OffsetGeneratorInput, Offset] = uniform.andThen(Uniform.cornerA)
63+
val cornerB: Optional[OffsetGeneratorInput, Offset] = uniform.andThen(Uniform.cornerB)
6464

6565
val size: Optional[OffsetGeneratorInput, Angle] =
6666
Optional.apply[OffsetGeneratorInput, Angle] {
@@ -96,15 +96,6 @@ object OffsetGeneratorInput:
9696
.fold(OdbError.InvalidArgument("'enumerated' offsets must have at least one offset position".some).asFailure): nel =>
9797
Enumerated(nel).success
9898

99-
100-
private val GridBinding: Matcher[Grid] =
101-
ObjectFieldsBinding.rmap:
102-
case List(
103-
OffsetInput.Binding("cornerA", rCornerA),
104-
OffsetInput.Binding("cornerB", rCornerB)
105-
) => (rCornerA, rCornerB).parMapN: (a, b) =>
106-
Grid(a, b)
107-
10899
private val RandomBinding: Matcher[Random] =
109100
ObjectFieldsBinding.rmap:
110101
case List(
@@ -121,17 +112,25 @@ object OffsetGeneratorInput:
121112
) => (rSize, rCenter).parMapN: (size, center) =>
122113
Spiral(size, center.getOrElse(Offset.Zero))
123114

115+
private val UniformBinding: Matcher[Uniform] =
116+
ObjectFieldsBinding.rmap:
117+
case List(
118+
OffsetInput.Binding("cornerA", rCornerA),
119+
OffsetInput.Binding("cornerB", rCornerB)
120+
) => (rCornerA, rCornerB).parMapN: (a, b) =>
121+
Uniform(a, b)
122+
124123
val Binding: Matcher[OffsetGeneratorInput] =
125124
ObjectFieldsBinding.rmap:
126125
case List(
127126
EnumeratedBinding.Option("enumerated", rEnumerated),
128-
GridBinding.Option("grid", rGrid),
129127
RandomBinding.Option("random", rRandom),
130-
SpiralBinding.Option("spiral", rSpiral)
131-
) => (rEnumerated, rGrid, rRandom, rSpiral).parTupled.flatMap:
128+
SpiralBinding.Option("spiral", rSpiral),
129+
UniformBinding.Option("uniform", rUniform)
130+
) => (rEnumerated, rRandom, rSpiral, rUniform).parTupled.flatMap:
132131
case (None, None, None, None ) => NoGenerator.success
133132
case (Some(e), None, None, None ) => e.success
134-
case (None, Some(g), None, None ) => g.success
135-
case (None, None, Some(r), None ) => r.success
136-
case (None, None, None, Some(s)) => s.success
133+
case (None, Some(r), None, None ) => r.success
134+
case (None, None, Some(s), None ) => s.success
135+
case (None, None, None, Some(u)) => u.success
137136
case _ => Matcher.validationFailure("At most one offset generator may be specified.")

modules/service/src/main/scala/lucuma/odb/graphql/mapping/OffsetGeneratorMapping.scala

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,6 @@ trait OffsetGeneratorMapping[F[_]] extends OffsetGeneratorView[F] with Enumerate
3535
child
3636
)
3737

38-
lazy val GridOffsetGeneratorMapping: ObjectMapping =
39-
ObjectMapping(GridOffsetGeneratorType)(
40-
SqlField("observationId", OffsetGeneratorView.Grid.ObservationId, key = true, hidden = true),
41-
SqlField("role", OffsetGeneratorView.Grid.OffsetGeneratorRole, key = true, hidden = true),
42-
SqlObject("cornerA"),
43-
SqlObject("cornerB")
44-
)
45-
4638
lazy val RandomOffsetGeneratorMapping: ObjectMapping =
4739
ObjectMapping(RandomOffsetGeneratorType)(
4840
SqlField("observationId", OffsetGeneratorView.Random.ObservationId, key = true, hidden = true),
@@ -59,6 +51,14 @@ trait OffsetGeneratorMapping[F[_]] extends OffsetGeneratorView[F] with Enumerate
5951
SqlObject("center")
6052
)
6153

54+
lazy val UniformOffsetGeneratorMapping: ObjectMapping =
55+
ObjectMapping(UniformOffsetGeneratorType)(
56+
SqlField("observationId", OffsetGeneratorView.Uniform.ObservationId, key = true, hidden = true),
57+
SqlField("role", OffsetGeneratorView.Uniform.OffsetGeneratorRole, key = true, hidden = true),
58+
SqlObject("cornerA"),
59+
SqlObject("cornerB")
60+
)
61+
6262
lazy val OffsetGeneratorMapping: ObjectMapping =
6363
ObjectMapping(OffsetGeneratorType)(
6464
SqlField("observationId", OffsetGeneratorView.ObservationId, key = true, hidden = true),
@@ -70,17 +70,17 @@ trait OffsetGeneratorMapping[F[_]] extends OffsetGeneratorView[F] with Enumerate
7070
OffsetGeneratorView.ObservationId -> OffsetGeneratorView.Enumerated.ObservationId,
7171
OffsetGeneratorView.OffsetGeneratorRole -> OffsetGeneratorView.Enumerated.OffsetGeneratorRole
7272
))),
73-
SqlObject("grid", Join(List(
74-
OffsetGeneratorView.ObservationId -> OffsetGeneratorView.Grid.ObservationId,
75-
OffsetGeneratorView.OffsetGeneratorRole -> OffsetGeneratorView.Grid.OffsetGeneratorRole
76-
))),
7773
SqlObject("random", Join(List(
7874
OffsetGeneratorView.ObservationId -> OffsetGeneratorView.Random.ObservationId,
7975
OffsetGeneratorView.OffsetGeneratorRole -> OffsetGeneratorView.Random.OffsetGeneratorRole
8076
))),
8177
SqlObject("spiral", Join(List(
8278
OffsetGeneratorView.ObservationId -> OffsetGeneratorView.Spiral.ObservationId,
8379
OffsetGeneratorView.OffsetGeneratorRole -> OffsetGeneratorView.Spiral.OffsetGeneratorRole
80+
))),
81+
SqlObject("uniform", Join(List(
82+
OffsetGeneratorView.ObservationId -> OffsetGeneratorView.Uniform.ObservationId,
83+
OffsetGeneratorView.OffsetGeneratorRole -> OffsetGeneratorView.Uniform.OffsetGeneratorRole
8484
)))
8585
)
8686

@@ -90,8 +90,8 @@ trait OffsetGeneratorMapping[F[_]] extends OffsetGeneratorView[F] with Enumerate
9090
enumeratedOffsetGeneratorMapping(GmosNorthImagingType / "skyOffsetGenerator" / "enumerated", OffsetGeneratorView.Enumerated.ObservationId, EnumeratedOffsetView.SkyObservationId),
9191
enumeratedOffsetGeneratorMapping(GmosSouthImagingType / "objectOffsetGenerator" / "enumerated", OffsetGeneratorView.Enumerated.ObservationId, EnumeratedOffsetView.ObjectObservationId),
9292
enumeratedOffsetGeneratorMapping(GmosSouthImagingType / "skyOffsetGenerator" / "enumerated", OffsetGeneratorView.Enumerated.ObservationId, EnumeratedOffsetView.SkyObservationId),
93-
GridOffsetGeneratorMapping,
9493
OffsetGeneratorMapping,
9594
RandomOffsetGeneratorMapping,
96-
SpiralOffsetGeneratorMapping
95+
SpiralOffsetGeneratorMapping,
96+
UniformOffsetGeneratorMapping
9797
)

modules/service/src/main/scala/lucuma/odb/graphql/mapping/OffsetMapping.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ trait OffsetMapping[F[_]] extends EnumeratedOffsetView[F]
3737
SqlField(s"id$idx", ref, key = true, hidden = true)
3838
ObjectMapping(path)((idFields ++ List(SqlObject("p"), SqlObject("q")))*)
3939

40-
private lazy val CornerAPath: Path = GridOffsetGeneratorType / "cornerA"
41-
private lazy val CornerBPath: Path = GridOffsetGeneratorType / "cornerB"
40+
private lazy val CornerAPath: Path = UniformOffsetGeneratorType / "cornerA"
41+
private lazy val CornerBPath: Path = UniformOffsetGeneratorType / "cornerB"
4242
private lazy val EnumeratedPath: Path = EnumeratedOffsetGeneratorType / "values" / "offset"
4343
private lazy val RandomPath: Path = RandomOffsetGeneratorType / "center"
4444
private lazy val SpiralPath: Path = SpiralOffsetGeneratorType / "center"
@@ -50,13 +50,13 @@ trait OffsetMapping[F[_]] extends EnumeratedOffsetView[F]
5050
offsetComponentMappingAtPath(EnumeratedPath / "p", EnumeratedOffsetView.OffsetP, EnumeratedOffsetView.ObservationId, EnumeratedOffsetView.OffsetGeneratorRole, EnumeratedOffsetView.Index),
5151
offsetComponentMappingAtPath(EnumeratedPath / "q", EnumeratedOffsetView.OffsetQ, EnumeratedOffsetView.ObservationId, EnumeratedOffsetView.OffsetGeneratorRole, EnumeratedOffsetView.Index),
5252

53-
offsetMappingAtPath(CornerAPath, OffsetGeneratorView.Grid.ObservationId, OffsetGeneratorView.Grid.OffsetGeneratorRole),
54-
offsetComponentMappingAtPath(CornerAPath / "p", OffsetGeneratorView.GridCornerAP, OffsetGeneratorView.Grid.ObservationId, OffsetGeneratorView.Grid.OffsetGeneratorRole),
55-
offsetComponentMappingAtPath(CornerAPath / "q", OffsetGeneratorView.GridCornerAQ, OffsetGeneratorView.Grid.ObservationId, OffsetGeneratorView.Grid.OffsetGeneratorRole),
53+
offsetMappingAtPath(CornerAPath, OffsetGeneratorView.Uniform.ObservationId, OffsetGeneratorView.Uniform.OffsetGeneratorRole),
54+
offsetComponentMappingAtPath(CornerAPath / "p", OffsetGeneratorView.UniformCornerAP, OffsetGeneratorView.Uniform.ObservationId, OffsetGeneratorView.Uniform.OffsetGeneratorRole),
55+
offsetComponentMappingAtPath(CornerAPath / "q", OffsetGeneratorView.UniformCornerAQ, OffsetGeneratorView.Uniform.ObservationId, OffsetGeneratorView.Uniform.OffsetGeneratorRole),
5656

57-
offsetMappingAtPath(CornerBPath, OffsetGeneratorView.Grid.ObservationId, OffsetGeneratorView.Grid.OffsetGeneratorRole),
58-
offsetComponentMappingAtPath(CornerBPath / "p", OffsetGeneratorView.GridCornerBP, OffsetGeneratorView.Grid.ObservationId, OffsetGeneratorView.Grid.OffsetGeneratorRole),
59-
offsetComponentMappingAtPath(CornerBPath / "q", OffsetGeneratorView.GridCornerBQ, OffsetGeneratorView.Grid.ObservationId, OffsetGeneratorView.Grid.OffsetGeneratorRole),
57+
offsetMappingAtPath(CornerBPath, OffsetGeneratorView.Uniform.ObservationId, OffsetGeneratorView.Uniform.OffsetGeneratorRole),
58+
offsetComponentMappingAtPath(CornerBPath / "p", OffsetGeneratorView.UniformCornerBP, OffsetGeneratorView.Uniform.ObservationId, OffsetGeneratorView.Uniform.OffsetGeneratorRole),
59+
offsetComponentMappingAtPath(CornerBPath / "q", OffsetGeneratorView.UniformCornerBQ, OffsetGeneratorView.Uniform.ObservationId, OffsetGeneratorView.Uniform.OffsetGeneratorRole),
6060

6161
offsetMappingAtPath(RandomPath, OffsetGeneratorView.Random.ObservationId, OffsetGeneratorView.Random.OffsetGeneratorRole),
6262
offsetComponentMappingAtPath(RandomPath / "p", OffsetGeneratorView.CenterOffsetP, OffsetGeneratorView.Random.ObservationId, OffsetGeneratorView.Random.OffsetGeneratorRole),

0 commit comments

Comments
 (0)