Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion avaframe/out3Plot/outAIMEC.py
Original file line number Diff line number Diff line change
Expand Up @@ -703,7 +703,7 @@ def resultWrite(pathDict, cfg, rasterTransfo, resAnalysisDF):
'start of runout area Angle (SROA angle): ', str(round(startOfRunoutAreaAngle, 2)), ' °\n'])

outFileName = '_'.join(['Results', projectName, str(runoutResType), 'lim', str(thresholdValue), 'w',
str(domainWidth)]) + '.csv'
str(domainWidth)]) + 'resAnalysisDF' + '.csv'
outname = os.path.join(pathResult, outFileName)
outFileNameStats = '_'.join(['Results', projectName, str(runoutResType), 'lim', str(thresholdValue), 'w',
str(domainWidth)]) + 'stats.csv'
Expand Down
106 changes: 106 additions & 0 deletions avaframe/out3Plot/statsPlots.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import avaframe.in3Utils.fileHandlerUtils as fU
import avaframe.in2Trans.ascUtils as IOf
import avaframe.in1Data.getInput as gI
from avaframe.in3Utils import cfgHandling


# create local logger
Expand Down Expand Up @@ -399,3 +400,108 @@ def plotProbMap(avaDir, inDir, cfgFull, demPlot=False):
outFile = outDir / ('%s_probMap_lim%s.%s' % (avaName, cfgFull['GENERAL']['peakLim'], pU.outputFormat))
fig.savefig(outFile)
plt.close(fig)


def resultHistPlot(cfg, dataDF, xName='', scenario='', stat='count', parametersDict=''):
""" create a histogram of values and optional colorcode using scenario name

Parameters
-----------
cfg: configparser object
configuration info here used outDir
dataDF: dataFrame
dataFrame with info on simulation results and configuration one line per simulation
(e.g. aimec resAnalysisDF)
xName: str
column name for x axis
scenario: str
column name used to colorcode values
stat: str
statistical measure to show (percent, probability, density, count, frequency), default count
parametersDict: dict
optional - dictionary filter criteria


Returns
--------
plotPath: pathlib path
path to figure

"""

# filter DF
if parametersDict != '':
simNameList = cfgHandling.filterSims(cfg['avalancheDir'], parametersDict, specDir='', simDF=dataDF)
dataDF = dataDF[dataDF['simName'].isin(simNameList)]

# initialize figure
fig, ax = plt.subplots()

# create histogram
bars = sns.histplot(data=dataDF, x=xName, hue="scenario", stat=stat, ax=ax)

# create second y axis for ecdf
ax2 = ax.twinx()
cdf = sns.ecdfplot(data=dataDF, x=xName, hue='scenario', stat='count', ax=ax2)

ax.set_ylabel('histogram ' + stat)
ax2.set_ylabel('ecdf count')

outFileName = '%s_' % xName + 'histogram'
plotPath = pU.saveAndOrPlot({'pathResult': cfg['outDir']}, outFileName, fig)

return plotPath


def plotDistFromDF(cfg, dataDF, name1, name2, scenario='', parametersDict='', type=''):
""" create a dist plot from dataframe

Parameters
-----------
cfg: configparser object
configuration settings here outDir
dataDF: dataframe
dataframe with one line per simulation and info on model parameters and results
name1: str
column name of dataDF to use for plot
name2: str
column name of dataDF to use for plot
scenario: str
optional name of column used to colorcode points in plots
parametersDict: dict
optional - dictionary filter criteria
type: str
optional - type of plot dist or scatter

Returns
--------
plotPath: pathlib path
path to figure

"""

# filter DF
if parametersDict != '':
simNameList = cfgHandling.filterSims(cfg['avalancheDir'], parametersDict, specDir='', simDF=dataDF)
dataDF = dataDF[dataDF['simName'].isin(simNameList)]

# # create figure
if scenario !='':
if type == 'scatter':
fig, ax = plt.subplots()
ax = sns.scatterplot(data=dataDF[dataDF['simName'].isin(simNameList)], x=name1, y=name2, hue=scenario)
else:
dist = sns.jointplot(data=dataDF[dataDF['simName'].isin(simNameList)], x=name1, y=name2, hue=scenario)
ax = dist.ax_joint
fig = dist.fig
else:
dist = sns.jointplot(data=dataDF[dataDF['simName'].isin(simNameList)], x=name1, y=name2)
ax = dist.ax_joint
fig = dist.fig

# put ava name on plot and save figure
pU.putAvaNameOnPlot(ax, cfg['avalancheDir'])
outFileName = '%s_vs_%s_' % (name1, name2) + 'distplot'
plotPath = pU.saveAndOrPlot({'pathResult': cfg['outDir']}, outFileName, fig)

return plotPath
85 changes: 85 additions & 0 deletions avaframe/runScripts/runStatsPlots.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
"""
Run script for computing statistics of results including the runout derived from aimec
"""

# Load modules
import os
import time
import glob
import configparser
import shutil
import pathlib
import pandas as pd
import numpy as np

# Local imports
from avaframe.out3Plot import statsPlots as sPlot
from avaframe.com1DFA import com1DFA
import avaframe.ana4Stats.probAna as probAna
from avaframe.ana4Stats import getStats
from avaframe.ana3AIMEC import ana3AIMEC, dfa2Aimec, aimecTools
from avaframe.in3Utils import initializeProject as initProj
from avaframe.in3Utils import fileHandlerUtils as fU
from avaframe.log2Report import generateReport as gR
from avaframe.out1Peak import outPlotAllPeak as oP
from avaframe.out3Plot import plotUtils
from avaframe.in3Utils import cfgUtils
from avaframe.in3Utils import logUtils
from avaframe.runScripts import runAna3AIMEC as rAimec


# log file name; leave empty to use default runLog.log
logName = 'runStatsPlots'
modName = 'com1DFA'

# Load general configuration filee
cfgMain = cfgUtils.getGeneralConfig()
flagShow = cfgMain['FLAGS'].getboolean('showPlot')

avaDir = cfgMain['MAIN']['avalancheDir']
cfgStats = cfgUtils.getModuleConfig(getStats)
cfg = cfgStats['GENERAL']

# set output directory, first ava in list
outDir = os.path.join(avaDir, 'Outputs', 'ana4Stats')
cfgStats['GENERAL']['outDir'] = outDir
cfgStats['GENERAL']['avalancheDir'] = avaDir

# Specify where you want the results to be stored
fU.makeADir(outDir)

# Start logging
log = logUtils.initiateLogger(outDir, logName)

# requires aimec output resAnalysisDF files if not already create set aimec flag to True
if cfgStats['GENERAL'].getboolean('aimec'):
# clean all existing aimec files first
initProj.cleanModuleFiles(avaDir, ana3AIMEC)
# fetch config for aimec
cfgAIMEC = cfgUtils.getModuleConfig(ana3AIMEC)
# run aimec
pathDict, rasterTransfo, resAnalysisDF, plotDict = rAimec.runAna3AIMEC(avaDir, cfgAIMEC)

# load results from aimec
pathToCsv = pathlib.Path(avaDir, 'Outputs', 'ana3AIMEC', modName)
resAnalysisDFFiles = list(pathToCsv.glob('*resAnalysisDF.csv'))
if len(resAnalysisDFFiles) > 1:
log.warning('Multiple resAnalysisDF files found, taking only first one: %s' % resAnalysisDFFiles[0])
elif len(resAnalysisDFFiles) == 0:
message = 'No resAnalysisDF file found'
log.error(message)
raise FileNotFoundError

# load dataframe
resAnalysisDF = pd.read_csv(resAnalysisDFFiles[0])

# filter simulations
parametersDict = fU.getFilterDict(cfgStats, 'FILTER')

# ------- runout histogram plot
sPlot.resultHistPlot(cfgStats['GENERAL'], resAnalysisDF, xName='sRunout', scenario='scenario',
stat='probability', parametersDict=parametersDict)

# -------- max result values scatter plot
sPlot.plotDistFromDF(cfgStats['GENERAL'], resAnalysisDF, name1='pftFieldMax',
name2='pfvFieldMax', scenario='scenario', parametersDict=parametersDict, type='')