Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
itk.py
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file itk.py
1 from pathlib import Path
2 from typing import Optional
3 import math
4 
5 import acts
6 import acts.examples
7 from acts.examples import TGeoDetector
8 
10  SeedFinderConfigArg,
11  SeedFinderOptionsArg,
12  SeedFilterConfigArg,
13  SpacePointGridConfigArg,
14  SeedingAlgorithmConfigArg,
15 )
16 
17 u = acts.UnitConstants
18 
19 from enum import Enum
20 
21 
23  PixelSpacePoints = 0
24  StripSpacePoints = 1
25 
26 
28  geo_dir: Path,
29  customMaterialFile: Optional[str] = None,
30  material: bool = True,
31  jsonconfig: bool = False,
32  logLevel=acts.logging.WARNING,
33 ):
34 
35  customLogLevel = acts.examples.defaultLogging(logLevel=logLevel)
36  logger = acts.logging.getLogger("buildITkGeometry")
37 
38  matDeco = None
39  if material:
40  file = None
41  if customMaterialFile:
42  file = customMaterialFile
43  logger.info("Adding custom material from %s", file)
44  else:
45  file = geo_dir / "itk-hgtd/material-maps-ITk-HGTD.json"
46  logger.info("Adding material from %s", file.absolute())
47  matDeco = acts.IMaterialDecorator.fromFile(
48  file,
49  level=customLogLevel(maxLevel=acts.logging.INFO),
50  )
51 
52  tgeo_fileName = geo_dir / "itk-hgtd/ATLAS-ITk-HGTD.tgeo.root"
53 
54  if jsonconfig:
55  jsonFile = geo_dir / "itk-hgtd/tgeo-atlas-itk-hgtd.json"
56  logger.info("Create geometry from %s", jsonFile.absolute())
57  return TGeoDetector.create(
58  jsonFile=str(jsonFile),
59  fileName=str(tgeo_fileName),
60  surfaceLogLevel=customLogLevel(),
61  layerLogLevel=customLogLevel(),
62  volumeLogLevel=customLogLevel(),
63  mdecorator=matDeco,
64  )
65 
66  Volume = TGeoDetector.Config.Volume
67  LayerTriplet = TGeoDetector.Config.LayerTriplet
68  equidistant = TGeoDetector.Config.BinningType.equidistant
69  arbitrary = TGeoDetector.Config.BinningType.arbitrary
70 
71  # ## Create TGeo geometry from `tgeo_fileName = itk-hgtd/ATLAS-ITk-HGTD.tgeo.root`.
72  # The `subVolumeName` and `sensitiveNames` specified below may change with new geometry versions
73  # in the root file (it changed ATLAS-P2-23 -> ATLAS-P2-RUN4-01-00-00).
74  # `TGeoParser` searches the tree below `subVolumeName` for all elements that match any of the
75  # list of `sensitiveNames` wildcards and also fall inside the `rRange`/`zRange` selections.
76  # If no `TGeoDetectorElements`` are found for an ACTS `Volume()`, then `TGeoDetector.create()`
77  # raises an exception along the lines of:
78  # 1. Missing tracking geometry - or
79  # 2. Incorrect binning configuration found: Number of configurations does not match number of protolayers
80  # Unless you know in advance, working out what names to change may not be trivial.
81  # I (@timadye) used a combination of
82  # * adding `printf`s in `Acts::TGeoParser::select()` (useful to find what it found with the old version),
83  # * printing object descendants from root (good for making long lists, but navigation cumbersome), and
84  # * browsing `TGeoManager` with ROOT's `TBrowser` (easy to navigate, but have to scan through long lists by eye).
85  # If the detector has moved significantly, it may be necessary to change the `rRange`/`zRange`.
86  # This specification should be kept in sync with `itk-hgtd/tgeo-atlas-itk-hgtd.json`.
87  return TGeoDetector.create(
88  fileName=str(tgeo_fileName),
89  mdecorator=matDeco,
90  buildBeamPipe=True,
91  unitScalor=1.0, # explicit units
92  beamPipeRadius=23.934 * u.mm,
93  beamPipeHalflengthZ=3000.0 * u.mm,
94  beamPipeLayerThickness=0.8 * u.mm,
95  surfaceLogLevel=customLogLevel(),
96  layerLogLevel=customLogLevel(),
97  volumeLogLevel=customLogLevel(),
98  volumes=[
99  Volume(
100  name="InnerPixels",
101  binToleranceR=(5 * u.mm, 5 * u.mm),
102  binToleranceZ=(5 * u.mm, 5 * u.mm),
103  binTolerancePhi=(0.025 * u.mm, 0.025 * u.mm),
104  layers=LayerTriplet(True),
105  subVolumeName=LayerTriplet("ITkPixel__ITkPixelDetector"),
106  sensitiveNames=LayerTriplet(["ITkPixel__*_Sensor"]),
107  sensitiveAxes=LayerTriplet("YZX"),
108  rRange=LayerTriplet((0 * u.mm, 135 * u.mm)),
109  zRange=LayerTriplet(
110  negative=(-3000 * u.mm, -250 * u.mm),
111  central=(-250 * u.mm, 250 * u.mm),
112  positive=(250 * u.mm, 3000 * u.mm),
113  ),
114  splitTolR=LayerTriplet(negative=-1.0, central=5 * u.mm, positive=-1.0),
115  splitTolZ=LayerTriplet(
116  negative=10 * u.mm, central=-1.0, positive=10 * u.mm
117  ),
118  binning0=LayerTriplet(
119  negative=[(0, equidistant)],
120  central=[(6, equidistant), (10, equidistant)],
121  positive=[(0, equidistant)],
122  ),
123  binning1=LayerTriplet(
124  negative=[(0, equidistant)],
125  central=[(12, equidistant), (6, equidistant)],
126  positive=[(0, equidistant)],
127  ),
128  cylinderDiscSplit=False,
129  cylinderNZSegments=0,
130  cylinderNPhiSegments=0,
131  discNRSegments=0,
132  discNPhiSegments=0,
133  itkModuleSplit=False,
134  barrelMap={},
135  discMap={},
136  ),
137  Volume(
138  name="OuterPixels",
139  binToleranceR=(5 * u.mm, 5 * u.mm),
140  binToleranceZ=(5 * u.mm, 5 * u.mm),
141  binTolerancePhi=(0.025 * u.mm, 0.025 * u.mm),
142  layers=LayerTriplet(True),
143  subVolumeName=LayerTriplet("ITkPixel__ITkPixelDetector"),
144  sensitiveNames=LayerTriplet(["ITkPixel__*_Sensor"]),
145  sensitiveAxes=LayerTriplet("YZX"),
146  rRange=LayerTriplet((135 * u.mm, 350 * u.mm)),
147  zRange=LayerTriplet(
148  negative=(-3000 * u.mm, -377 * u.mm),
149  central=(-377 * u.mm, 377 * u.mm),
150  positive=(377 * u.mm, 3000 * u.mm),
151  ),
152  splitTolR=LayerTriplet(
153  negative=15 * u.mm, central=5 * u.mm, positive=15 * u.mm
154  ),
155  splitTolZ=LayerTriplet(
156  negative=20 * u.mm, central=-1.0, positive=20 * u.mm
157  ),
158  binning0=LayerTriplet(
159  negative=[(0, equidistant)],
160  central=[(0, equidistant)],
161  positive=[(0, equidistant)],
162  ),
163  binning1=LayerTriplet(
164  negative=[(0, equidistant)],
165  central=[(0, equidistant)],
166  positive=[(0, equidistant)],
167  ),
168  cylinderDiscSplit=False,
169  cylinderNZSegments=0,
170  cylinderNPhiSegments=0,
171  discNRSegments=0,
172  discNPhiSegments=0,
173  itkModuleSplit=False,
174  barrelMap={},
175  discMap={},
176  ),
177  Volume(
178  name="Strips",
179  binToleranceR=(5 * u.mm, 5 * u.mm),
180  binToleranceZ=(5 * u.mm, 5 * u.mm),
181  binTolerancePhi=(0.025 * u.mm, 0.025 * u.mm),
182  layers=LayerTriplet(True),
183  subVolumeName=LayerTriplet("ITkStrip__ITkStrip"),
184  sensitiveNames=LayerTriplet(
185  negative=["ITkStrip__ECSensor*"],
186  central=["ITkStrip__BRLSensor*"],
187  positive=["ITkStrip__ECSensor*"],
188  ),
189  sensitiveAxes=LayerTriplet("XYZ"),
190  rRange=LayerTriplet(
191  negative=(-1.0, 1050 * u.mm),
192  central=(380 * u.mm, 1050 * u.mm),
193  positive=(-1.0, 1050 * u.mm),
194  ),
195  zRange=LayerTriplet(
196  negative=(-3000 * u.mm, -1400 * u.mm),
197  central=(-1400 * u.mm, 1400 * u.mm),
198  positive=(1400 * u.mm, 3000 * u.mm),
199  ),
200  splitTolR=LayerTriplet(
201  negative=-1.0,
202  central=35 * u.mm,
203  positive=-1.0,
204  ),
205  splitTolZ=LayerTriplet(
206  negative=35 * u.mm, central=-1.0, positive=35 * u.mm
207  ),
208  binning0=LayerTriplet(
209  negative=[(-1, arbitrary)],
210  central=[(0, equidistant)],
211  positive=[(-1, arbitrary)],
212  ),
213  binning1=LayerTriplet(
214  negative=[(-1, arbitrary)],
215  central=[(28, equidistant)] * 4,
216  positive=[(-1, arbitrary)],
217  ),
218  cylinderDiscSplit=False,
219  cylinderNZSegments=0,
220  cylinderNPhiSegments=0,
221  discNRSegments=0,
222  discNPhiSegments=0,
223  itkModuleSplit=True,
224  barrelMap={"MS": 2, "SS": 4},
225  discMap={
226  "EC0": [
227  [384.5, 403.481],
228  [403.481, 427.462],
229  [427.462, 456.442],
230  [456.442, 488.423],
231  ],
232  "EC1": [
233  [489.823, 507.916],
234  [507.916, 535.009],
235  [535.009, 559.101],
236  [559.101, 574.194],
237  ],
238  "EC2": [[575.594, 606.402], [606.402, 637.209]],
239  "EC3": [
240  [638.609, 670.832],
241  [670.832, 697.055],
242  [697.055, 723.278],
243  [723.278, 755.501],
244  ],
245  "EC4": [[756.901, 811.482], [811.482, 866.062]],
246  "EC5": [[867.462, 907.623], [907.623, 967.785]],
247  },
248  splitPatterns={
249  ".*BRL.*MS.*": "MS",
250  ".*BRL.*SS.*": "SS",
251  ".*EC.*Sensor(|Back)0.*": "EC0",
252  ".*EC.*Sensor(|Back)1.*": "EC1",
253  ".*EC.*Sensor(|Back)2.*": "EC2",
254  ".*EC.*Sensor(|Back)3.*": "EC3",
255  ".*EC.*Sensor(|Back)4.*": "EC4",
256  ".*EC.*Sensor(|Back)5.*": "EC5",
257  },
258  ),
259  Volume(
260  name="HGTD",
261  binToleranceR=(15 * u.mm, 15 * u.mm),
262  binToleranceZ=(5 * u.mm, 5 * u.mm),
263  binTolerancePhi=(0.25 * u.mm, 0.25 * u.mm),
264  layers=LayerTriplet(positive=True, central=False, negative=True),
265  subVolumeName=LayerTriplet("HGTD__HGTD"),
266  sensitiveNames=LayerTriplet(["HGTD__HGTDSiSensor*"]),
267  sensitiveAxes=LayerTriplet("XYZ"),
268  rRange=LayerTriplet(
269  negative=(0 * u.mm, 1050 * u.mm),
270  positive=(0 * u.mm, 1050 * u.mm),
271  ),
272  zRange=LayerTriplet(
273  negative=(-4000 * u.mm, -3000 * u.mm),
274  positive=(3000 * u.mm, 4000 * u.mm),
275  ),
276  splitTolR=LayerTriplet(-1.0),
277  splitTolZ=LayerTriplet(negative=10 * u.mm, positive=10 * u.mm),
278  binning0=LayerTriplet(
279  negative=[(0, equidistant)],
280  central=[(0, equidistant)],
281  positive=[(0, equidistant)],
282  ),
283  binning1=LayerTriplet(
284  negative=[(0, equidistant)],
285  central=[(0, equidistant)],
286  positive=[(0, equidistant)],
287  ),
288  cylinderDiscSplit=False,
289  cylinderNZSegments=0,
290  cylinderNPhiSegments=0,
291  discNRSegments=0,
292  discNPhiSegments=0,
293  itkModuleSplit=False,
294  barrelMap={},
295  discMap={},
296  ),
297  ],
298  )
299 
300 
302  inputSpacePointsType: InputSpacePointsType, highOccupancyConfig=False
303 ):
304  assert isinstance(inputSpacePointsType, InputSpacePointsType)
305 
306  # variables that do not change for pixel and strip SPs:
307  zMax = 3000 * u.mm
308  zMin = -3000 * u.mm
309  zOutermostLayers = (-2700 * u.mm, 2700 * u.mm)
310  beamPos = (0 * u.mm, 0 * u.mm)
311  collisionRegionMin = -200 * u.mm
312  collisionRegionMax = 200 * u.mm
313  maxSeedsPerSpM = 4
314  cotThetaMax = 27.2899 # (4.0 eta) --> 27.2899 = 1/tan(2*arctan(exp(-4)))
315  sigmaScattering = 2
316  radLengthPerSeed = 0.0975
317  minPt = 900 * u.MeV
318  bFieldInZ = 2 * u.T
319  deltaRMin = 20 * u.mm
320  maxPtScattering = float("inf") * u.GeV
321  zBinEdges = [
322  -3000.0,
323  -2500.0,
324  -1400.0,
325  -925.0,
326  -500.0,
327  -250.0,
328  250.0,
329  500.0,
330  925.0,
331  1400.0,
332  2500.0,
333  3000.0,
334  ] # zBinEdges enables non-equidistant binning in z, in case the binning is not defined the edges are evaluated automatically using equidistant binning
335  rRangeMiddleSP = [
336  [40.0, 90.0],
337  [40.0, 200.0],
338  [46.0, 200.0],
339  [46.0, 200.0],
340  [46.0, 250.0],
341  [46.0, 250.0],
342  [46.0, 250.0],
343  [46.0, 200.0],
344  [46.0, 200.0],
345  [40.0, 200.0],
346  [40.0, 90.0],
347  ] # if useVariableMiddleSPRange is set to false, the vector rRangeMiddleSP can be used to define a fixed r range for each z bin: {{rMin, rMax}, ...}. If useVariableMiddleSPRange is set to false and the vector is empty, the cuts won't be applied
348  useVariableMiddleSPRange = True # if useVariableMiddleSPRange is true, the values in rRangeMiddleSP will be calculated based on r values of the SPs and deltaRMiddleSPRange
349  binSizeR = 1 * u.mm
350  seedConfirmation = True
351  centralSeedConfirmationRange = acts.SeedConfirmationRangeConfig(
352  zMinSeedConf=-500 * u.mm,
353  zMaxSeedConf=500 * u.mm,
354  rMaxSeedConf=140 * u.mm,
355  nTopForLargeR=1,
356  nTopForSmallR=2,
357  seedConfMinBottomRadius=60.0 * u.mm,
358  seedConfMaxZOrigin=150.0 * u.mm,
359  minImpactSeedConf=1.0 * u.mm,
360  ) # contains parameters for seed confirmation
361  forwardSeedConfirmationRange = acts.SeedConfirmationRangeConfig(
362  zMinSeedConf=-3000 * u.mm,
363  zMaxSeedConf=3000 * u.mm,
364  rMaxSeedConf=140 * u.mm,
365  nTopForLargeR=1,
366  nTopForSmallR=2,
367  seedConfMinBottomRadius=60.0 * u.mm,
368  seedConfMaxZOrigin=150.0 * u.mm,
369  minImpactSeedConf=1.0 * u.mm,
370  )
371  zOriginWeightFactor = 1
372  compatSeedWeight = 100
373  phiMin = 0
374  phiMax = 2 * math.pi
375  phiBinDeflectionCoverage = 3
376  numPhiNeighbors = 1
377  maxPhiBins = 200
378  # only used in orthogonal seeding
379  deltaPhiMax = 0.025
380 
381  # variables that change for pixel and strip SPs:
382  if inputSpacePointsType is InputSpacePointsType.PixelSpacePoints:
383  outputSeeds = "PixelSeeds"
384  allowSeparateRMax = False
385  rMaxGridConfig = 320 * u.mm
386  rMaxSeedFinderConfig = rMaxGridConfig
387  deltaRMinSP = 6 * u.mm
388  deltaRMax = 280 * u.mm
389  deltaRMaxTopSP = 280 * u.mm
390  deltaRMaxBottomSP = 150 * u.mm
391  deltaZMax = float("inf") * u.mm
392  interactionPointCut = True
393  impactMax = 2 * u.mm
394  zBinsCustomLooping = [
395  1,
396  2,
397  3,
398  4,
399  11,
400  10,
401  9,
402  8,
403  6,
404  5,
405  7,
406  ] # enable custom z looping when searching for SPs, must contain numbers from 1 to the total number of bin in zBinEdges
407  zBinNeighborsTop = [
408  [0, 0],
409  [-1, 0],
410  [-1, 0],
411  [-1, 0],
412  [-1, 0],
413  [-1, 1],
414  [0, 1],
415  [0, 1],
416  [0, 1],
417  [0, 1],
418  [0, 0],
419  ] # allows to specify the number of neighbors desired for each bin, [-1,1] means one neighbor on the left and one on the right, if the vector is empty the algorithm returns the 8 surrounding bins
420  zBinNeighborsBottom = [
421  [0, 1],
422  [0, 1],
423  [0, 1],
424  [0, 1],
425  [0, 1],
426  [0, 0],
427  [-1, 0],
428  [-1, 0],
429  [-1, 0],
430  [-1, 0],
431  [-1, 0],
432  ]
433  deltaRMiddleMinSPRange = 10 * u.mm
434  deltaRMiddleMaxSPRange = 10 * u.mm
435  seedConfirmationFilter = True
436  impactWeightFactor = 100
437  compatSeedLimit = 3
438  numSeedIncrement = 100
439  seedWeightIncrement = 0
440  useDetailedDoubleMeasurementInfo = False
441  maxSeedsPerSpMConf = 5
442  maxQualitySeedsPerSpMConf = 5
443  useDeltaRorTopRadius = True
444 
445  if highOccupancyConfig == True:
446  rMaxGridConfig = 250 * u.mm
447  deltaRMax = 200 * u.mm
448  zBinsCustomLooping = [1, 11, 2, 10, 3, 9, 6, 4, 8, 5, 7]
449  # variables that are only used for highOccupancyConfig configuration:
450  skipZMiddleBinSearch = 2
451 
452  elif inputSpacePointsType is InputSpacePointsType.StripSpacePoints:
453  outputSeeds = "StripSeeds"
454  allowSeparateRMax = True
455  rMaxGridConfig = 1000.0 * u.mm
456  rMaxSeedFinderConfig = 1200.0 * u.mm
457  deltaRMinSP = 20 * u.mm
458  deltaRMax = 600 * u.mm
459  deltaRMaxTopSP = 300 * u.mm
460  deltaRMaxBottomSP = deltaRMaxTopSP
461  deltaZMax = 900 * u.mm
462  interactionPointCut = False
463  impactMax = 20 * u.mm
464  zBinsCustomLooping = [6, 7, 5, 8, 4, 9, 3, 10, 2, 11, 1]
465  zBinNeighborsTop = [
466  [0, 0],
467  [-1, 0],
468  [-1, 0],
469  [-1, 0],
470  [-1, 0],
471  [-1, 1],
472  [0, 1],
473  [0, 1],
474  [0, 1],
475  [0, 1],
476  [0, 0],
477  ]
478  zBinNeighborsBottom = [
479  [0, 1],
480  [0, 1],
481  [0, 1],
482  [0, 2],
483  [0, 1],
484  [0, 0],
485  [-1, 0],
486  [-2, 0],
487  [-1, 0],
488  [-1, 0],
489  [-1, 0],
490  ]
491  deltaRMiddleMinSPRange = 30 * u.mm
492  deltaRMiddleMaxSPRange = 150 * u.mm
493  seedConfirmationFilter = False
494  impactWeightFactor = 1
495  compatSeedLimit = 4
496  numSeedIncrement = 1
497  seedWeightIncrement = 10100
498  useDetailedDoubleMeasurementInfo = True
499  maxSeedsPerSpMConf = 100
500  maxQualitySeedsPerSpMConf = 100
501  useDeltaRorTopRadius = False
502 
503  if highOccupancyConfig == True:
504  minPt = 1000 * u.MeV
505  collisionRegionMin = -150 * u.mm
506  collisionRegionMax = 150 * u.mm
507  rRangeMiddleSP = [
508  [40.0, 80.0],
509  [40.0, 200.0],
510  [70.0, 200.0],
511  [70.0, 200.0],
512  [70.0, 250.0],
513  [70.0, 250.0],
514  [70.0, 250.0],
515  [70.0, 200.0],
516  [70.0, 200.0],
517  [40.0, 200.0],
518  [40.0, 80.0],
519  ]
520  useVariableMiddleSPRange = False
521  else:
522  skipZMiddleBinSearch = 0
523 
524  # fill namedtuples
525  seedFinderConfigArg = SeedFinderConfigArg(
526  maxSeedsPerSpM=maxSeedsPerSpM,
527  cotThetaMax=cotThetaMax,
528  sigmaScattering=sigmaScattering,
529  radLengthPerSeed=radLengthPerSeed,
530  minPt=minPt,
531  impactMax=impactMax,
532  deltaPhiMax=deltaPhiMax,
533  interactionPointCut=interactionPointCut,
534  deltaZMax=deltaZMax,
535  maxPtScattering=maxPtScattering,
536  zBinEdges=zBinEdges,
537  zBinsCustomLooping=zBinsCustomLooping,
538  skipZMiddleBinSearch=skipZMiddleBinSearch,
539  rRangeMiddleSP=rRangeMiddleSP,
540  useVariableMiddleSPRange=useVariableMiddleSPRange,
541  binSizeR=binSizeR,
542  seedConfirmation=seedConfirmation,
543  centralSeedConfirmationRange=centralSeedConfirmationRange,
544  forwardSeedConfirmationRange=forwardSeedConfirmationRange,
545  deltaR=(deltaRMin, deltaRMax),
546  deltaRBottomSP=(deltaRMinSP, deltaRMaxBottomSP),
547  deltaRTopSP=(deltaRMinSP, deltaRMaxTopSP),
548  deltaRMiddleSPRange=(deltaRMiddleMinSPRange, deltaRMiddleMaxSPRange),
549  collisionRegion=(collisionRegionMin, collisionRegionMax),
550  r=(None, rMaxSeedFinderConfig),
551  z=(zMin, zMax),
552  zOutermostLayers=zOutermostLayers,
553  )
554 
555  seedFinderOptionsArg = SeedFinderOptionsArg(bFieldInZ=bFieldInZ, beamPos=beamPos)
556 
557  seedFilterConfigArg = SeedFilterConfigArg(
558  impactWeightFactor=impactWeightFactor,
559  zOriginWeightFactor=zOriginWeightFactor,
560  compatSeedWeight=compatSeedWeight,
561  compatSeedLimit=compatSeedLimit,
562  numSeedIncrement=numSeedIncrement,
563  seedWeightIncrement=seedWeightIncrement,
564  seedConfirmation=seedConfirmation,
565  maxSeedsPerSpMConf=maxSeedsPerSpMConf,
566  maxQualitySeedsPerSpMConf=maxQualitySeedsPerSpMConf,
567  useDeltaRorTopRadius=useDeltaRorTopRadius,
568  )
569  spacePointGridConfigArg = SpacePointGridConfigArg(
570  rMax=rMaxGridConfig,
571  deltaRMax=deltaRMax,
572  zBinEdges=zBinEdges,
573  phiBinDeflectionCoverage=phiBinDeflectionCoverage,
574  phi=(phiMin, phiMax),
575  impactMax=impactMax,
576  maxPhiBins=maxPhiBins,
577  )
578  seedingAlgorithmConfigArg = SeedingAlgorithmConfigArg(
579  allowSeparateRMax=allowSeparateRMax,
580  zBinNeighborsTop=zBinNeighborsTop,
581  zBinNeighborsBottom=zBinNeighborsBottom,
582  numPhiNeighbors=numPhiNeighbors,
583  )
584 
585  return (
586  seedingAlgorithmConfigArg,
587  seedFinderConfigArg,
588  seedFinderOptionsArg,
589  seedFilterConfigArg,
590  spacePointGridConfigArg,
591  )