ssscoring.ssscoremultiple

Experimental

Process a group of jumps uploaded from a file uploader.

  1# See: https://github.com/pr3d4t0r/SSScoring/blob/master/LICENSE.txt
  2
  3"""
  4## Experimental
  5
  6Process a group of jumps uploaded from a file uploader.
  7"""
  8
  9from ssscoring.appcommon import displayJumpDataIn
 10from ssscoring.appcommon import displayTrackOnMap
 11from ssscoring.appcommon import initFileUploaderState
 12from ssscoring.appcommon import interpretJumpResult
 13from ssscoring.appcommon import isStreamlitHostedApp
 14from ssscoring.appcommon import plotJumpResult
 15from ssscoring.appcommon import setSideBarAndMain
 16from ssscoring.calc import aggregateResults
 17from ssscoring.calc import processAllJumpFiles
 18from ssscoring.calc import totalResultsFrom
 19from ssscoring.datatypes import JumpStatus
 20from ssscoring.mapview import speedJumpTrajectory
 21from ssscoring.notebook import SPEED_COLORS
 22from ssscoring.notebook import graphJumpResult
 23from ssscoring.notebook import initializePlot
 24
 25import pandas as pd
 26import streamlit as st
 27
 28
 29# +++ implementation +++
 30
 31def _selectDZState(*args, **kwargs):
 32    if st.session_state.elevation:
 33        st.session_state.uploaderKey += 1
 34        st.session_state.trackFiles = None
 35
 36
 37def _styleShowMaxIn(scores: pd.Series) -> pd.DataFrame:
 38    return [
 39        'background-color: mediumseagreen' if v == scores.max() else \
 40        '' for v in scores ]
 41
 42
 43def _styleShowMinMaxIn(scores: pd.Series) -> pd.DataFrame:
 44    return [
 45        'background-color: green' if v == scores.max() else \
 46        'background-color: orangered' if v == scores.min() else \
 47        '' for v in scores ]
 48
 49
 50def main():
 51    if not isStreamlitHostedApp():
 52        st.set_page_config(layout = 'wide')
 53    initFileUploaderState('trackFiles')
 54    setSideBarAndMain('🔢', False, _selectDZState)
 55
 56    col0, col1 = st.columns([0.5, 0.5, ])
 57    if st.session_state.trackFiles:
 58        jumpResults = processAllJumpFiles(st.session_state.trackFiles, altitudeDZMeters=st.session_state.elevation)
 59        allJumpsPlot = initializePlot('All jumps', backgroundColorName='#2c2c2c')
 60        mixColor = 0
 61        jumpResultsSubset = dict()
 62        with col1:
 63            st.write('**Jump results detail and charts are displayed most recent first unless _Reverse_ order is selected**')
 64            st.session_state.reverseDisplay = st.checkbox('Reverse', value=False, help='Display jump results in ascending order by track file tag name.')
 65        for tag in sorted(list(jumpResults.keys()), reverse=(not st.session_state.reverseDisplay)):
 66            jumpResult = jumpResults[tag]
 67            mixColor = (mixColor+1)%len(SPEED_COLORS)
 68            with col1:
 69                jumpStatusInfo,\
 70                scoringInfo,\
 71                badJumpLegend,\
 72                jumpStatus = interpretJumpResult(tag, jumpResult, st.session_state.processBadJump)
 73                if jumpStatus != JumpStatus.OK:
 74                    st.toast('#### %s - %s' % (tag, str(jumpStatus)), icon='⚠️')
 75                if (st.session_state.processBadJump and jumpStatus != JumpStatus.OK) or jumpStatus == JumpStatus.OK:
 76                    jumpResultsSubset[tag] = jumpResult
 77                st.html('<hr><h3>'+jumpStatusInfo+scoringInfo+(badJumpLegend if badJumpLegend else '')+'</h3>')
 78                if (st.session_state.processBadJump and jumpStatus != JumpStatus.OK) or jumpStatus == JumpStatus.OK:
 79                    displayJumpDataIn(jumpResult.table)
 80                    plotJumpResult(tag, jumpResult)
 81                    graphJumpResult(
 82                        allJumpsPlot,
 83                        jumpResult,
 84                        lineColor=SPEED_COLORS[mixColor],
 85                        legend='%s = %.2f' % (tag, jumpResult.score),
 86                        showIt=False
 87                    )
 88                    displayTrackOnMap(speedJumpTrajectory(jumpResult))
 89        with col0:
 90            st.html('<h2>Jumps in this set</h2>')
 91            if (st.session_state.processBadJump and jumpStatus != JumpStatus.OK) or jumpStatus == JumpStatus.OK:
 92                aggregate = aggregateResults(jumpResultsSubset)
 93                displayAggregate = aggregate.style.apply(_styleShowMinMaxIn, subset=[ 'score', ]).apply(_styleShowMaxIn, subset=[ 'maxSpeed', ]).format(precision=2)
 94                st.dataframe(displayAggregate)
 95                st.html('<h2>Summary</h2>')
 96                st.dataframe(totalResultsFrom(aggregate), hide_index = True)
 97                st.bokeh_chart(allJumpsPlot, use_container_width=True)
 98
 99
100if '__main__' == __name__:
101    main()
def main():
51def main():
52    if not isStreamlitHostedApp():
53        st.set_page_config(layout = 'wide')
54    initFileUploaderState('trackFiles')
55    setSideBarAndMain('🔢', False, _selectDZState)
56
57    col0, col1 = st.columns([0.5, 0.5, ])
58    if st.session_state.trackFiles:
59        jumpResults = processAllJumpFiles(st.session_state.trackFiles, altitudeDZMeters=st.session_state.elevation)
60        allJumpsPlot = initializePlot('All jumps', backgroundColorName='#2c2c2c')
61        mixColor = 0
62        jumpResultsSubset = dict()
63        with col1:
64            st.write('**Jump results detail and charts are displayed most recent first unless _Reverse_ order is selected**')
65            st.session_state.reverseDisplay = st.checkbox('Reverse', value=False, help='Display jump results in ascending order by track file tag name.')
66        for tag in sorted(list(jumpResults.keys()), reverse=(not st.session_state.reverseDisplay)):
67            jumpResult = jumpResults[tag]
68            mixColor = (mixColor+1)%len(SPEED_COLORS)
69            with col1:
70                jumpStatusInfo,\
71                scoringInfo,\
72                badJumpLegend,\
73                jumpStatus = interpretJumpResult(tag, jumpResult, st.session_state.processBadJump)
74                if jumpStatus != JumpStatus.OK:
75                    st.toast('#### %s - %s' % (tag, str(jumpStatus)), icon='⚠️')
76                if (st.session_state.processBadJump and jumpStatus != JumpStatus.OK) or jumpStatus == JumpStatus.OK:
77                    jumpResultsSubset[tag] = jumpResult
78                st.html('<hr><h3>'+jumpStatusInfo+scoringInfo+(badJumpLegend if badJumpLegend else '')+'</h3>')
79                if (st.session_state.processBadJump and jumpStatus != JumpStatus.OK) or jumpStatus == JumpStatus.OK:
80                    displayJumpDataIn(jumpResult.table)
81                    plotJumpResult(tag, jumpResult)
82                    graphJumpResult(
83                        allJumpsPlot,
84                        jumpResult,
85                        lineColor=SPEED_COLORS[mixColor],
86                        legend='%s = %.2f' % (tag, jumpResult.score),
87                        showIt=False
88                    )
89                    displayTrackOnMap(speedJumpTrajectory(jumpResult))
90        with col0:
91            st.html('<h2>Jumps in this set</h2>')
92            if (st.session_state.processBadJump and jumpStatus != JumpStatus.OK) or jumpStatus == JumpStatus.OK:
93                aggregate = aggregateResults(jumpResultsSubset)
94                displayAggregate = aggregate.style.apply(_styleShowMinMaxIn, subset=[ 'score', ]).apply(_styleShowMaxIn, subset=[ 'maxSpeed', ]).format(precision=2)
95                st.dataframe(displayAggregate)
96                st.html('<h2>Summary</h2>')
97                st.dataframe(totalResultsFrom(aggregate), hide_index = True)
98                st.bokeh_chart(allJumpsPlot, use_container_width=True)