@@ -612,30 +612,38 @@ def configure_dask(self):
612612 dconf .set (scheduler = "threads" , pool = ThreadPool (n_cpu ))
613613
614614 @classmethod
615- def start (cls , filepath : str | Path | InputFile ):
615+ def start (
616+ cls , filepath : str | Path | InputFile , driver_class = None , ** kwargs
617+ ) -> InversionDriver :
618+ """
619+ Start the inversion driver.
620+
621+ :param filepath: Path to the input file or InputFile object.
622+ :param driver_class: Optional driver class to use instead of the default.
623+ :param kwargs: Additional keyword arguments for InputFile read_ui_json.
624+
625+ :return: InversionDriver instance with the specified parameters.
626+ """
616627 if isinstance (filepath , InputFile ):
617628 ifile = filepath
618629 else :
619- ifile = InputFile .read_ui_json (filepath )
630+ ifile = InputFile .read_ui_json (filepath , ** kwargs )
620631
621- forward_only = ifile .data ["forward_only" ]
622- inversion_type = ifile .ui_json .get ("inversion_type" , None )
623-
624- driver_class = cls .driver_class_from_name (
625- inversion_type , forward_only = forward_only
626- )
627-
628- with ifile .data ["geoh5" ].open (mode = "r+" ):
629- params = driver_class ._options_class .build (ifile )
630- driver = driver_class (params )
632+ if driver_class is None :
633+ driver = cls .from_input_file (ifile )
634+ else :
635+ with ifile .data ["geoh5" ].open (mode = "r+" ):
636+ params = driver_class ._options_class .build (ifile )
637+ driver = driver_class (params )
631638
632639 driver .run ()
640+
633641 return driver
634642
635643 @staticmethod
636644 def driver_class_from_name (
637645 name : str , forward_only : bool = False
638- ) -> InversionDriver :
646+ ) -> type [ InversionDriver ] :
639647 if name not in DRIVER_MAP :
640648 msg = f"Inversion type { name } is not supported."
641649 msg += f" Valid inversions are: { (* list (DRIVER_MAP ),)} ."
@@ -649,6 +657,26 @@ def driver_class_from_name(
649657 module = __import__ (mod_name , fromlist = [class_name ])
650658 return getattr (module , class_name )
651659
660+ @classmethod
661+ def from_input_file (cls , ifile : InputFile ) -> InversionDriver :
662+ forward_only = ifile .data ["forward_only" ]
663+ inversion_type = ifile .ui_json .get ("inversion_type" , None )
664+ if inversion_type is None :
665+ raise GeoAppsError (
666+ "Key/value 'inversion_type' not found in the input file. "
667+ "Please specify the inversion type in the UI JSON."
668+ )
669+
670+ driver_class = cls .driver_class_from_name (
671+ inversion_type , forward_only = forward_only
672+ )
673+
674+ with ifile .data ["geoh5" ].open (mode = "r+" ):
675+ params = driver_class ._options_class .build (ifile )
676+ driver = driver_class (params )
677+
678+ return driver
679+
652680
653681class InversionLogger :
654682 def __init__ (self , logfile , driver ):
0 commit comments