@@ -119,7 +119,7 @@ const flatObservations: () => Observation[] = createMemo(() => {
119119} ) ;
120120
121121const _allTimes = ( ) =>
122- new Set ( flatExperiments ( ) . flatMap ( ( e ) => e . output ?. t ?? [ ] ) ) ;
122+ new Set ( flatExperiments ( ) . flatMap ( ( e ) => e . output ?. utcTime ?? [ ] ) ) ;
123123const uniqueTimes = ( ) => [ ...new Set ( _allTimes ( ) ) ] . sort ( ( a , b ) => a - b ) ;
124124
125125// TODO: could memoize all reactive elements here, would it make a difference?
@@ -140,9 +140,15 @@ export function TimeSeriesPlot({ analysis }: { analysis: TimeseriesAnalysis }) {
140140 e . output ? e . output [ analysis . yVariable as OutputVariableKey ] : [ ] ,
141141 ) ;
142142
143- const granularity = ( ) => ( analysis . xVariable === "t" ? 600 : undefined ) ;
144- const xLim = ( ) => getNiceAxisLimits ( allX ( ) , 0 , granularity ( ) ) ;
145- const yLim = ( ) => getNiceAxisLimits ( allY ( ) ) ;
143+ const granularities : Record < string , number | undefined > = {
144+ t : 600 , // 10 minutes in seconds
145+ utcTime : 60_000 , // 1 minute in milliseconds
146+ default : undefined ,
147+ } ;
148+
149+ const roundTo = ( v : string ) => granularities [ v ] ?? granularities . default ;
150+ const xLim = ( ) => getNiceAxisLimits ( allX ( ) , 0 , roundTo ( analysis . xVariable ) ) ;
151+ const yLim = ( ) => getNiceAxisLimits ( allY ( ) , 0 , roundTo ( analysis . yVariable ) ) ;
146152
147153 const chartData = ( ) =>
148154 flatExperiments ( ) . map ( ( e ) => {
@@ -185,11 +191,14 @@ export function TimeSeriesPlot({ analysis }: { analysis: TimeseriesAnalysis }) {
185191 setResetPlot ( analysis . id ) ;
186192 } ;
187193
188- const formatX = ( ) =>
189- analysis . xVariable === "t" ? formatSeconds : d3 . format ( ".4" ) ;
190- const formatY = ( ) =>
191- analysis . yVariable === "t" ? formatSeconds : d3 . format ( ".4" ) ;
192-
194+ // Define axis format
195+ const formatters : Record < string , ( value : number ) => string > = {
196+ t : formatSeconds ,
197+ utcTime : formatUTC ,
198+ default : d3 . format ( ".4" ) ,
199+ } ;
200+ const formatX = ( ) => formatters [ analysis . xVariable ] ?? formatters . default ;
201+ const formatY = ( ) => formatters [ analysis . yVariable ] ?? formatters . default ;
193202 return (
194203 < >
195204 { /* TODO: get label for yVariable from model config */ }
@@ -264,7 +273,7 @@ export function VerticalProfilePlot({
264273 const profileData = ( ) =>
265274 flatExperiments ( ) . map ( ( e ) => {
266275 const { config, output, ...formatting } = e ;
267- const t = output ?. t . indexOf ( uniqueTimes ( ) [ analysis . time ] ) ;
276+ const t = output ?. utcTime . indexOf ( uniqueTimes ( ) [ analysis . time ] ) ;
268277 if ( config . sw_ml && output && t !== undefined && t !== - 1 ) {
269278 const outputAtTime = getOutputAtTime ( output , t ) ;
270279 return { ...formatting , data : generateProfiles ( config , outputAtTime ) } ;
@@ -407,6 +416,10 @@ function formatSeconds(seconds: number): string {
407416 return `${ hours . toString ( ) . padStart ( 2 , "0" ) } :${ minutes . toString ( ) . padStart ( 2 , "0" ) } ` ;
408417}
409418
419+ function formatUTC ( milliseconds : number ) : string {
420+ return d3 . utcFormat ( "%H:%M" ) ( new Date ( milliseconds ) ) ;
421+ }
422+
410423function TimeSlider (
411424 time : Accessor < number > ,
412425 timeOptions : Accessor < number [ ] > ,
@@ -429,12 +442,12 @@ function TimeSlider(
429442 class = "w-full max-w-md"
430443 >
431444 < div class = "flex w-full items-center gap-5" >
432- < p > Time: </ p >
445+ < p class = "whitespace-nowrap" > Time (UTC) : </ p >
433446 < SliderTrack >
434447 < SliderFill />
435448 < SliderThumb />
436449 </ SliderTrack >
437- < p > { formatSeconds ( timeOptions ( ) [ time ( ) ] ) } </ p >
450+ < p > { formatUTC ( timeOptions ( ) [ time ( ) ] ) } </ p >
438451 </ div >
439452 </ Slider >
440453 ) ;
@@ -468,7 +481,7 @@ export function ThermodynamicPlot({ analysis }: { analysis: SkewTAnalysis }) {
468481 const profileData = ( ) =>
469482 flatExperiments ( ) . map ( ( e ) => {
470483 const { config, output, ...formatting } = e ;
471- const t = output ?. t . indexOf ( uniqueTimes ( ) [ analysis . time ] ) ;
484+ const t = output ?. utcTime . indexOf ( uniqueTimes ( ) [ analysis . time ] ) ;
472485 if ( config . sw_ml && output && t !== undefined && t !== - 1 ) {
473486 const outputAtTime = getOutputAtTime ( output , t ) ;
474487 return { ...formatting , data : generateProfiles ( config , outputAtTime ) } ;
0 commit comments