@@ -137,6 +137,8 @@ def __init__(self, port=8887, mode='user'):
137137 (r"/wsTest" , WsTest ),
138138 (r"/imupath" , IMUPathHandler ),
139139 (r"/api/imupath/data" , IMUPathDataAPI ),
140+ (r"/api/imupath/fields" , IMUPathFieldsAPI ),
141+ (r"/api/imupath/stats" , IMUPathStatsAPI ),
140142 (r"/api/imupath/shutdown" , IMUPathShutdownAPI ),
141143
142144 (r"/static/(.*)" , StaticFileHandler ,
@@ -410,6 +412,83 @@ async def get(self):
410412 await self .render ("templates/imupath.html" , ** data )
411413
412414
415+ class IMUPathFieldsAPI (RequestHandler ):
416+ """
417+ API endpoint for getting available fields from tub data.
418+ Returns list of fields with metadata (type, dimensions, etc.)
419+ """
420+
421+ async def get (self ):
422+ # Check if data is available
423+ if self .application .imupath_builder is None :
424+ self .set_status (404 )
425+ self .write ({'error' : 'No IMU path data loaded' })
426+ return
427+
428+ try :
429+ fields = self .application .imupath_builder .get_available_fields ()
430+ self .set_header ('Content-Type' , 'application/json' )
431+ self .write (json .dumps ({'fields' : fields }, ensure_ascii = False ,
432+ separators = (',' , ':' )))
433+ except Exception as e :
434+ logger .error (f"Error getting available fields: { e } " ,
435+ exc_info = True )
436+ self .set_status (500 )
437+ self .write ({'error' : str (e )})
438+
439+
440+ class IMUPathStatsAPI (RequestHandler ):
441+ """
442+ API endpoint for computing segment statistics on-demand.
443+ Query parameters:
444+ - field: Field name (required)
445+ - method: Aggregation method (required)
446+ - dimension: Vector component index (optional, for vector fields)
447+ """
448+
449+ async def get (self ):
450+ # Check if data is available
451+ if self .application .imupath_builder is None :
452+ self .set_status (404 )
453+ self .write ({'error' : 'No IMU path data loaded' })
454+ return
455+
456+ # Get query parameters
457+ field_name = self .get_argument ('field' , default = None )
458+ method = self .get_argument ('method' , default = None )
459+ dimension_str = self .get_argument ('dimension' , default = None )
460+
461+ # Validate required parameters
462+ if not field_name or not method :
463+ self .set_status (400 )
464+ self .write ({'error' : 'Missing required parameters: field, method' })
465+ return
466+
467+ # Parse dimension parameter
468+ dimension = None
469+ if dimension_str is not None and dimension_str != 'null' and dimension_str != '' :
470+ try :
471+ dimension = int (dimension_str )
472+ except ValueError :
473+ self .set_status (400 )
474+ self .write ({'error' : 'Invalid dimension parameter: must be integer' })
475+ return
476+
477+ try :
478+ # Compute segment statistics
479+ rankings = self .application .imupath_builder .compute_segment_statistics (
480+ field_name , method , dimension )
481+
482+ self .set_header ('Content-Type' , 'application/json' )
483+ self .write (json .dumps ({'rankings' : rankings }, ensure_ascii = False ,
484+ separators = (',' , ':' )))
485+ except Exception as e :
486+ logger .error (f"Error computing segment statistics: { e } " ,
487+ exc_info = True )
488+ self .set_status (500 )
489+ self .write ({'error' : str (e )})
490+
491+
413492class IMUPathShutdownAPI (RequestHandler ):
414493 """
415494 API endpoint to shutdown the server.
0 commit comments