Source code for xpcsviewer.fileIO.ftype_utils
"""
File type detection utilities for XPCS data files.
Provides functions to identify HDF5 file formats:
- isNeXusFile: Check for NeXus format (APS-8IDI beamline)
- isLegacyFile: Check for legacy XPCS format
- get_ftype: Determine file type ('nexus', 'legacy', or False)
"""
# Standard library imports
import os
# Third-party imports
import h5py
# Local imports
from xpcsviewer.utils.logging_config import get_logger
logger = get_logger(__name__)
[docs]
def isNeXusFile(fname):
"""Check if file is in NeXus format.
Args:
fname: Path to HDF5 file.
Returns:
True if file contains NeXus metadata structure.
"""
logger.debug(f"Checking if {fname} is NeXus file")
if not h5py.is_hdf5(fname):
return False
try:
with h5py.File(fname, "r") as f:
if "/entry/instrument/bluesky/metadata/" in f:
logger.debug(f"{fname} identified as NeXus file")
return True
logger.debug(f"{fname} is not a NeXus file")
return False
except Exception as e:
logger.error(f"Error checking NeXus file {fname}: {e}")
return False
[docs]
def isLegacyFile(fname):
logger.debug(f"Checking if {fname} is legacy file")
if not h5py.is_hdf5(fname):
return False
try:
with h5py.File(fname, "r") as f:
if "/xpcs/Version" in f:
logger.debug(f"{fname} identified as legacy file")
return True
except Exception as e:
logger.error(f"Error checking legacy file {fname}: {e}")
return False
[docs]
def get_ftype(fname: str):
logger.debug(f"Determining file type for {fname}")
if not os.path.isfile(fname):
logger.warning(f"File does not exist: {fname}")
return False
try:
if isLegacyFile(fname):
logger.info(f"File {fname} identified as legacy type")
return "legacy"
if isNeXusFile(fname):
logger.info(f"File {fname} identified as nexus type")
return "nexus"
logger.warning(f"Unknown file type for {fname}")
return False
except Exception as e:
logger.error(f"Error determining file type for {fname}: {e}")
return False