77import functools
88from abc import ABC , abstractmethod
99from functools import cached_property
10- from typing import Any , Callable , Iterable , TypeVar
1110from pathlib import Path
11+ from typing import Any , Callable , Iterable , TypeVar
1212
13+ import h5py
1314import numpy as np
1415import pandas as pd
15- import h5py
1616
1717from .utils import fetch
18+ from .utils .subject import Subject
1819
1920SDR_VERSIONED_URL : str = (
2021 "https://stacks.stanford.edu/v{version}/file/zz618yg1930/version/{version}/data"
@@ -219,13 +220,19 @@ def around(self, time_ms: int, t_before: int, t_after: int) -> "Span":
219220 Returns:
220221 New aligned span.
221222 """
223+ if t_before == 0 and t_after == 0 :
224+ raise ValueError ("Must specify non-zero t_before or t_after!" )
225+ if t_before < 0 :
226+ raise ValueError ("Cannot have negative t_before" )
227+ if t_after < 0 :
228+ raise ValueError ("Cannot have negative t_after" )
222229 start = time_ms - t_before
223- end = time_ms + t_after + 1
230+ end = time_ms + t_after
224231
225232 span = self
226233 if self .start + end > self .stop :
227234 span = span .extend (t_after = self .start + end - self .stop )
228- end = - 1
235+ end = - 1 # go to end of span
229236 if start < 0 :
230237 span = span .extend (t_before = abs (start ))
231238 if end != - 1 :
@@ -280,9 +287,7 @@ def spanset_cls(self) -> type["SpanSet"]:
280287 def spanarray_cls (self ) -> type ["SpanSet" ]:
281288 """SpanArray instantiation class."""
282289
283- def __init__ (
284- self , spans : list [Span ], ** kwargs : Any # pylint: disable=unused-argument
285- ) -> None :
290+ def __init__ (self , spans : list [Span ], ** kwargs : Any ) -> None :
286291 """Initialize SpanSet.
287292
288293 Args:
@@ -412,7 +417,12 @@ def around(
412417 target_t = list (time_ms )[index ]
413418 else :
414419 target_t = time_ms
415- span_arr .append (span .around (int (target_t ), t_before , t_after ))
420+ try :
421+ # Check to make sure we are number-like
422+ target_t = int (str (target_t ))
423+ except Exception as e :
424+ raise ValueError from e
425+ span_arr .append (span .around (target_t , t_before , t_after ))
416426 return self ._make_spanarray (span_arr )
417427
418428 def map (self , func : Callable , * args : Any , ** kwargs : Any ) -> list [Any ]:
@@ -449,8 +459,7 @@ class StudyMixin(ABC):
449459 quiet: Verbosity flag.
450460 """
451461
452- # For linting purposes!
453- # span_cls: type[Span]
462+ head : str
454463
455464 def __init__ (
456465 self , study_id : str , download_dir : str , quiet : bool = False , ** kwargs : Any
@@ -505,7 +514,7 @@ def __getitem__(self, key: Any) -> Any:
505514 """
506515 if self .df is None :
507516 return self .by_time (key )
508- return super ().__getitem__ (key ) # type : ignore[misc ]
517+ return super ().__getitem__ (key ) # ty : ignore[unresolved-attribute ]
509518
510519 @cached_property
511520 @abstractmethod
@@ -573,6 +582,7 @@ class HeadH5Study(StudyMixin):
573582 """Base class for studies with remote HDF5 head files."""
574583
575584 data_paths : dict [str , list [str ]] = {}
585+ subject : Subject
576586
577587 def __init__ (
578588 self ,
@@ -664,7 +674,7 @@ def _make_span(self, row: pd.Series) -> Span:
664674 """
665675 start = int (row ["ms_start" ])
666676 stop = int (row ["ms_end" ])
667- return self .span_cls (
677+ return self .span_cls ( # ty: ignore[unresolved-attribute]
668678 start = start , stop = stop , study_id = self .study_id , study = self , metadata = row
669679 )
670680
@@ -699,17 +709,21 @@ def __init__(
699709 """
700710 self .deposition_version = deposition_version
701711 super ().__init__ (
702- study_id = study_id ,
703- download_dir = f"{ download_dir } /{ study_id } " ,
704- quiet = quiet ,
705- spans = (),
712+ study_id = study_id , # ty: ignore[unknown-argument]
713+ download_dir = f"{ download_dir } /{ study_id } " , # ty: ignore[unknown-argument]
714+ quiet = quiet , # ty: ignore[unknown-argument]
715+ spans = (), # ty: ignore[unknown-argument]
706716 ** kwargs ,
707- ) # type: ignore[call-arg]
717+ )
708718
709719 @cached_property
710720 def fetcher (self ) -> fetch .FetcherHTTPS :
711721 """HTTPS fetch manager."""
712- return fetch .FetcherHTTPS (self .url , self .download_dir , quiet = self .quiet )
722+ return fetch .FetcherHTTPS (
723+ self .url , # ty: ignore[unresolved-attribute]
724+ self .download_dir , # ty: ignore[unresolved-attribute]
725+ quiet = self .quiet , # ty: ignore[unresolved-attribute]
726+ )
713727
714728 @property
715729 def _default_url (self ) -> str :
@@ -735,7 +749,7 @@ def __init__(self, spans: list[Span], *args: Any, **kwargs: Any) -> None:
735749 raise ValueError ("SpanArray requires spans of the same length" )
736750
737751 # init
738- super ().__init__ (spans = spans_list , * args , ** kwargs ) # type : ignore[call-arg ]
752+ super ().__init__ (spans = spans_list , * args , ** kwargs ) # ty : ignore[unknown-argument ]
739753
740754 def _wrap (self , func : str , * args : Any , ** kwargs : Any ) -> np .ndarray :
741755 """Wrap results into numpy array.
@@ -748,7 +762,7 @@ def _wrap(self, func: str, *args: Any, **kwargs: Any) -> np.ndarray:
748762 Returns:
749763 Numpy array of results.
750764 """
751- return np .array (super ()._wrap (func , * args , ** kwargs )) # type : ignore[misc ]
765+ return np .array (super ()._wrap (func , * args , ** kwargs )) # ty : ignore[unresolved-attribute ]
752766
753767
754768class DataCatalog :
0 commit comments