diff --git a/avaframe/com7Regional/com7Regional.py b/avaframe/com7Regional/com7Regional.py index 90f8f393e..72e4a8936 100644 --- a/avaframe/com7Regional/com7Regional.py +++ b/avaframe/com7Regional/com7Regional.py @@ -15,6 +15,8 @@ from rasterio.merge import merge +from avaframe.in3Utils.fileHandlerUtils import findAvaDirsBasedOnInputsDir + # create local logger log = logging.getLogger(__name__) @@ -57,7 +59,7 @@ def com7RegionalMain(cfgMain, cfg): regionalDir = pathlib.Path(cfgMain["MAIN"]["avalancheDir"]) / regionalDirFromCfg # List valid avalanche directories within the regional directory - avaDirs = findAvaDirs(regionalDir) + avaDirs = findAvaDirsBasedOnInputsDir(regionalDir) # Get total number of simulations log.info(f"Getting total number of simulations to perform...") @@ -113,29 +115,6 @@ def com7RegionalMain(cfgMain, cfg): return allPeakFilesDir, mergedRastersDir -def findAvaDirs(Dir): - """Find all valid avalanche directories within a given directory. - - A directory is considered a valid avalanche directory if it contains an "Inputs" folder. - - Parameters - ---------- - Dir : pathlib.Path or str - Path to the directory to search in - - Returns - ------- - avaDirs : list - List of pathlib.Path objects pointing to valid avalanche directories - """ - avaDirs = [pathlib.Path(p).parent for p in pathlib.Path(Dir).glob("*/Inputs")] - log.info(f"Found a total of '{len(avaDirs)}' avalanche directories in: {Dir}:") - for avaDir in avaDirs: - log.info(f"'{avaDir.name}'") - - return avaDirs - - def getTotalNumberOfSims(avaDirs, cfgMain, cfgCom7): """Get total number of simulations across all avalanche directories. @@ -252,7 +231,7 @@ def moveOrCopyPeakFiles(cfg, avalancheDir): # Get avalanche directories # with logUtils.silentLogger(): - avaDirs = findAvaDirs(avalancheDir) + avaDirs = findAvaDirsBasedOnInputsDir(avalancheDir) if not avaDirs: log.warning("No avalanche directories found to copy/move files from") return None, None @@ -404,7 +383,7 @@ def mergeOutputRasters(cfg, avalancheDir): # Get all avalanche directories # with logUtils.silentLogger(): - avaDirs = findAvaDirs(avalancheDir) + avaDirs = findAvaDirsBasedOnInputsDir(avalancheDir) if not avaDirs: log.warning("No avalanche directories found to merge") return None diff --git a/avaframe/in3Utils/fileHandlerUtils.py b/avaframe/in3Utils/fileHandlerUtils.py index 96b67ebd6..3139cfcfb 100644 --- a/avaframe/in3Utils/fileHandlerUtils.py +++ b/avaframe/in3Utils/fileHandlerUtils.py @@ -1,5 +1,5 @@ """ - Directory and file handling helper functions +Directory and file handling helper functions """ # Load modules @@ -455,9 +455,9 @@ def exportcom1DFAOrigOutput(avaDir, cfg="", addTSteps=False): "%s_fd.asc" % logDict["simName"][k], ) pathTo = ( - outDirPF - / "timeSteps" - / ("%s_%.05f_tLast_ft.asc" % (logDict["simName"][k], logDict[varPar][k])) + outDirPF + / "timeSteps" + / ("%s_%.05f_tLast_ft.asc" % (logDict["simName"][k], logDict[varPar][k])) ) shutil.copy(pathFrom, pathTo) pathFrom = pathlib.Path( @@ -488,9 +488,9 @@ def exportcom1DFAOrigOutput(avaDir, cfg="", addTSteps=False): "%s%.05f" % (resPath, logDict[varPar][k]), "%s_tFirst_fd.txt" % logDict["simName"][k] ) pathTo = ( - outDirPF - / "timeSteps" - / ("%s_%.05f_tFirst_fd.asc" % (logDict["simName"][k], logDict[varPar][k])) + outDirPF + / "timeSteps" + / ("%s_%.05f_tFirst_fd.asc" % (logDict["simName"][k], logDict[varPar][k])) ) shutil.copy(pathFrom, pathTo) @@ -633,7 +633,7 @@ def makeSimDF(inputDir, avaDir="", simID="simID"): data["simType"].append(infoParts[2 + j]) data["modelType"].append(infoParts[3 + j]) data["resType"].append(infoParts[4 + j]) - data["simName"].append(fNamePart + "_" + ("_".join(infoParts[0: (4 + j)]))) + data["simName"].append(fNamePart + "_" + ("_".join(infoParts[0 : (4 + j)]))) header = IOf.readRasterHeader(datafiles[m]) data["cellSize"].append(header["cellsize"]) @@ -720,14 +720,14 @@ def makeSimFromResDF(avaDir, comModule, inputDir="", simName=""): # build the result data frame resTypeListFromFiles = list(set([file.stem.split("_")[-1] for file in datafiles])) columnsList = [ - "simName", - "releaseArea", - "simHash", - "simModified", - "simType", - "modelType", - "cellSize", - ] + resTypeListFromFiles + "simName", + "releaseArea", + "simHash", + "simModified", + "simType", + "modelType", + "cellSize", + ] + resTypeListFromFiles dataDF = pd.DataFrame(columns=columnsList) resTypeListOne = [] @@ -791,3 +791,26 @@ def makeSimFromResDF(avaDir, comModule, inputDir="", simName=""): resTypeListAll.append(resType) return dataDF, resTypeListAll + + +def findAvaDirsBasedOnInputsDir(Dir): + """Find all valid avalanche directories within a given directory. + + A directory is considered a valid avalanche directory if it contains an "Inputs" folder. + + Parameters + ---------- + Dir : pathlib.Path or str + Path to the directory to search in + + Returns + ------- + avaDirs : list + List of pathlib.Path objects pointing to valid avalanche directories + """ + avaDirs = [pathlib.Path(p).parent for p in pathlib.Path(Dir).glob("*/Inputs")] + log.info(f"Found a total of '{len(avaDirs)}' avalanche directories in: {Dir}:") + for avaDir in avaDirs: + log.info(f"'{avaDir.name}'") + + return avaDirs diff --git a/avaframe/runCom1DFA.py b/avaframe/runCom1DFA.py index 4d72def6e..3d295b088 100644 --- a/avaframe/runCom1DFA.py +++ b/avaframe/runCom1DFA.py @@ -16,7 +16,6 @@ from avaframe.in3Utils import logUtils from avaframe.in3Utils import fileHandlerUtils as fU - def runCom1DFA(avalancheDir='', calibration=''): """ Run com1DFA in the default configuration with only an avalanche directory as input and the (optional) friction calibration diff --git a/avaframe/runCom7Regional.py b/avaframe/runCom7Regional.py index 56f13f942..bd806e2e0 100644 --- a/avaframe/runCom7Regional.py +++ b/avaframe/runCom7Regional.py @@ -4,20 +4,26 @@ """ import time +import pathlib import argparse from avaframe.com7Regional import com7Regional as com7 +from avaframe.com7Regional import splitInputs as sI from avaframe.in3Utils import cfgUtils from avaframe.in3Utils import logUtils -def runCom7Regional(avalancheDir=""): +def runCom7Regional(avalancheDir="", splitInputs=False, runComputations=False): """Run regional avalanche simulations in parallel. Parameters ---------- avalancheDir : str, optional Path to the main avalanche directory. If not provided, uses the path from general configuration. + splitInputs : bool, optional + Whether to run the split inputs preprocessor before running regional simulations. Default is False. + runComputations : bool, optional + Whether to run the main regional computations. Default is False. Returns ------- @@ -43,11 +49,33 @@ def runCom7Regional(avalancheDir=""): log = logUtils.initiateLogger(str(avalancheDir), logName="runCom7Regional") log.info("MAIN SCRIPT") - # Load module configuration - cfg = cfgUtils.getModuleConfig(com7, fileOverride="", toPrint=False, onlyDefault=False) + # Run split inputs preprocessing if requested + if splitInputs: + log.info("Running split inputs preprocessor...") + splitStartTime = time.time() - # Call main function - allPeakFilesDir, mergedRastersDir = com7.com7RegionalMain(cfgMain, cfg) + # Define the output directory for split inputs + outputDir = pathlib.Path(avalancheDir) / "com7Regional" + + # Load split inputs module configuration + splitCfg = cfgUtils.getModuleConfig(sI) + + # Run splitting process + sI.splitInputsMain(pathlib.Path(avalancheDir), outputDir, splitCfg, cfgMain) + + splitEndTime = time.time() + log.info(f"Split inputs preprocessing completed after {splitEndTime - splitStartTime:.1f} seconds.") + + # Initialize return values + allPeakFilesDir, mergedRastersDir = None, None + + # Run main computations if requested + if runComputations: + # Load module configuration + cfg = cfgUtils.getModuleConfig(com7, fileOverride="", toPrint=False, onlyDefault=False) + + # Call main function + allPeakFilesDir, mergedRastersDir = com7.com7RegionalMain(cfgMain, cfg) # Print time needed endTime = time.time() @@ -62,6 +90,16 @@ def runCom7Regional(avalancheDir=""): parser.add_argument( "avadir", metavar="avalancheDir", type=str, nargs="?", default="", help="the avalanche directory" ) + parser.add_argument( + "--split-inputs", + action="store_true", + help="run split inputs preprocessor before regional simulations", + ) + parser.add_argument( + "--run-computations", + action="store_true", + help="run the main regional computations", + ) args = parser.parse_args() - runCom7Regional(str(args.avadir)) + runCom7Regional(str(args.avadir), splitInputs=args.split_inputs, runComputations=args.run_computations) diff --git a/avaframe/runScripts/runSplitInputs.py b/avaframe/runScripts/runSplitInputs.py deleted file mode 100644 index 076567077..000000000 --- a/avaframe/runScripts/runSplitInputs.py +++ /dev/null @@ -1,57 +0,0 @@ -"""runScript for splitting avalanche input data into multiple folders based on individual release areas""" - -import time -import pathlib -import argparse - -from avaframe.in3Utils import cfgUtils, logUtils -from avaframe.com7Regional import splitInputs - -def runSplitInputs(avalancheDir=''): - """Main function to split input data for avalanche scenarios. - - Parameters - ---------- - avalancheDir : str - Path to the avalanche directory. If not provided, the function will - retrieve it from the general configuration file. - - Returns - ------- - None - - """ - # Time the whole routine - startTime = time.time() - - # Load the avalanche directory from general configuration file - cfgMain = cfgUtils.getGeneralConfig() - if avalancheDir != '': - cfgMain['MAIN']['avalancheDir'] = avalancheDir - else: - avalancheDir = cfgMain['MAIN']['avalancheDir'] - - # Start logging - log = logUtils.initiateLogger(avalancheDir, logName='runSplitInputs') - log.info('MAIN SCRIPT') - - # Define the output directory - outputDir = pathlib.Path(avalancheDir) / 'com7Regional' - - # Load module configuration - cfg = cfgUtils.getModuleConfig(splitInputs) - - # Run splitting process - splitInputs.splitInputsMain(pathlib.Path(avalancheDir), outputDir, cfg, cfgMain) - - # Print time needed - endTime = time.time() - log.info(f"Completed splitting input data after "f"{endTime - startTime:.1f} seconds.") - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description="Run split inputs for avalanche directories") - parser.add_argument('avalancheDir', type=str, nargs='?', default='', - help="Directory containing the main avalanche data") - - args = parser.parse_args() - runSplitInputs(args.avalancheDir)