1919
2020# Key type aliases
2121SurfaceAtlasKey = tuple [str , str , str , str ]
22- SurfaceTransformKey = tuple [str , str , str , str , str ]
22+ SurfaceTransformKey = tuple [str , str , str , str , str , str ]
2323VolumeAtlasKey = tuple [str , str , str ]
24- VolumeTransformKey = tuple [str , str , str , str ]
24+ VolumeTransformKey = tuple [str , str , str , str , str ]
2525
2626
2727class GraphCache (BaseModel ):
@@ -38,13 +38,13 @@ class GraphCache(BaseModel):
3838 Maps ``(space, density, hemisphere, resource_type)`` to a
3939 :class:`SurfaceAtlas`.
4040 surface_transform:
41- Maps ``(source, target, density, hemisphere, resource_type)`` to a
41+ Maps ``(source, target, density, hemisphere, resource_type, provider )`` to a
4242 :class:`SurfaceTransform`.
4343 volume_atlas:
4444 Maps ``(space, resolution, resource_type)`` to a
4545 :class:`VolumeAtlas`.
4646 volume_transform:
47- Maps ``(source, target, resolution, resource_type)`` to a
47+ Maps ``(source, target, resolution, resource_type, provider )`` to a
4848 :class:`VolumeTransform`.
4949 """
5050
@@ -150,6 +150,7 @@ def add_surface_transform(self, transform: SurfaceTransform) -> None:
150150 transform .density ,
151151 transform .hemisphere .lower (),
152152 transform .resource_type ,
153+ transform .provider ,
153154 )
154155 ] = transform
155156
@@ -160,11 +161,30 @@ def get_surface_transform(
160161 density : str ,
161162 hemisphere : Literal ["left" , "right" ],
162163 resource_type : str ,
164+ provider : str | None = None ,
163165 ) -> SurfaceTransform | None :
164- """Return the matching :class:`SurfaceTransform`, or ``None``."""
165- return self .surface_transform .get (
166- (source , target , density , hemisphere .lower (), resource_type )
167- )
166+ """Return the matching :class:`SurfaceTransform`, or ``None``.
167+
168+ If *provider* is ``None`` or not found, falls back to the first
169+ registered transform matching the other fields.
170+ """
171+ if provider is not None :
172+ result = self .surface_transform .get (
173+ (source , target , density , hemisphere .lower (), resource_type , provider )
174+ )
175+ if result is not None :
176+ return result
177+ # Fallback: first match ignoring provider
178+ for (src , tgt , d , h , rt , _ ), transform in self .surface_transform .items ():
179+ if (
180+ src == source
181+ and tgt == target
182+ and d == density
183+ and h == hemisphere .lower ()
184+ and rt == resource_type
185+ ):
186+ return transform
187+ return None
168188
169189 def get_surface_transforms (
170190 self ,
@@ -173,6 +193,7 @@ def get_surface_transforms(
173193 density : str | None = None ,
174194 hemisphere : Literal ["left" , "right" ] | None = None ,
175195 resource_type : str | None = None ,
196+ provider : str | None = None ,
176197 ) -> list [SurfaceTransform ]:
177198 """Return all surface transforms between two spaces with optional filters.
178199
@@ -182,18 +203,20 @@ def get_surface_transforms(
182203 density: Optional density filter.
183204 hemisphere: Optional hemisphere filter.
184205 resource_type: Optional resource type filter.
206+ provider: Optional provider filter.
185207
186208 Returns:
187209 All matching :class:`SurfaceTransform` entries (may be empty).
188210 """
189211 return [
190212 transform
191- for (src , tgt , d , h , rt ), transform in self .surface_transform .items ()
213+ for (src , tgt , d , h , rt , prov ), transform in self .surface_transform .items ()
192214 if src == source
193215 and tgt == target
194216 and (density is None or d == density )
195217 and (hemisphere is None or h == hemisphere .lower ())
196218 and (resource_type is None or rt == resource_type )
219+ and (provider is None or prov == provider )
197220 ]
198221
199222 # ------------------------------------------------------------------ #
@@ -246,21 +269,47 @@ def add_volume_transform(self, transform: VolumeTransform) -> None:
246269 transform .target_space ,
247270 transform .resolution ,
248271 transform .resource_type ,
272+ transform .provider ,
249273 )
250274 ] = transform
251275
252276 def get_volume_transform (
253- self , source : str , target : str , resolution : str , resource_type : str
277+ self ,
278+ source : str ,
279+ target : str ,
280+ resolution : str ,
281+ resource_type : str ,
282+ provider : str | None ,
254283 ) -> VolumeTransform | None :
255- """Return the matching :class:`VolumeTransform`, or ``None``."""
256- return self .volume_transform .get ((source , target , resolution , resource_type ))
284+ """Return the matching :class:`VolumeTransform`, or ``None``.
285+
286+ If *provider* is ``None`` or not found, falls back to the first
287+ registered transform matching the other fields.
288+ """
289+ if provider is not None :
290+ result = self .volume_transform .get (
291+ (source , target , resolution , resource_type , provider )
292+ )
293+ if result is not None :
294+ return result
295+ # Fallback: first match ignoring provider
296+ for (src , tgt , res , rt , _ ), transform in self .volume_transform .items ():
297+ if (
298+ src == source
299+ and tgt == target
300+ and res == resolution
301+ and rt == resource_type
302+ ):
303+ return transform
304+ return None
257305
258306 def get_volume_transforms (
259307 self ,
260308 source : str ,
261309 target : str ,
262310 resolution : str | None = None ,
263311 resource_type : str | None = None ,
312+ provider : str | None = None ,
264313 ) -> list [VolumeTransform ]:
265314 """Return all volume transforms between two spaces with optional filters.
266315
@@ -269,17 +318,19 @@ def get_volume_transforms(
269318 target: Target brain template space name.
270319 resolution: Optional resolution filter.
271320 resource_type: Optional resource type filter.
321+ provider: Optional provider filter.
272322
273323 Returns:
274324 All matching :class:`VolumeTransform` entries (may be empty).
275325 """
276326 return [
277327 transform
278- for (src , tgt , res , rt ), transform in self .volume_transform .items ()
328+ for (src , tgt , res , rt , prov ), transform in self .volume_transform .items ()
279329 if src == source
280330 and tgt == target
281331 and (resolution is None or res == resolution )
282332 and (resource_type is None or rt == resource_type )
333+ and (provider is None or prov == provider )
283334 ]
284335
285336 # ------------------------------------------------------------------ #
0 commit comments