HPPT

The software is organized in a Model-View-Presenter pattern. The main (Tavi) model, view and presenter classes and their components interactions are described here.

Tavi Model

The TaviModel encapsulates the backend functionality of data calculations. The object fields are updated every time there are new valid values received from the user (front end).

        classDiagram
   TaviProject "1" -->"1" TaviData
   TaviData "1" --> "1" Scan

   class TaviProject{
       -TaviData tavi_data
       +load_raw_scan_from_folder()
   }


   class TaviData{
       -RawDataPtr rawdataptr:dict[str, Scan]
       -CombineDataPtr combinedataptr:dict[str, np.array]
       -process_selected_data:list[str]
       -show_selected_data:list[str]
       -FitPtr fitptr
       -PlotPtr plotptr
   }

   class Scan{
       -Data raw_data
       -MetaData meta_data
       -ErrorMessage error_message
   }
    

Tavi View

        classDiagram
   TaviView "1" -->"1" MainWindow

   class TaviView{
       -MainWindow:main_window
       -MainMenuBar:menu_bar
       +install_menu_bar()
       +closeEvent()
       +force_close()
       +exit_message_box()

   }

   class MainWindow{
       -ProjectView: load_view
       -Placeholder for other view widgets:Other
   }
    

Tavi Presenter

        classDiagram
   MainPresenter "1" -->"1" TaviProject
   MainPresenter "1" -->"1" TaviView
   TaviView "1" -->"2" MainWindow

   class MainPresenter{
       -TaviProject:model
       -TaviView:view
       +menu_bar()
       +install_menu_bar()
       +load_raw_scan_presenter(project_view, model_dict["TaviProjectProxy"])
       +exit()
   }

   class TaviProject{
       # from above
       -TaviData
       +load_raw_scan_from_folder()
   }

   class TaviView{
       # from above
       -MainWindow:main_window
       -MainMenuBar:menu_bar
       +install_menu_bar()
       +closeEvent()
       +force_close()
       +exit_message_box()

   }

   class MainWindow{
       # from above
       -ProjectView: load_view
       -Placeholder for other view widgets:Other
   }
    

The Hppt Model and View are unaware of one another. The Presenter is the connecting link that has a direct access and interacts with both. The Presenter describes the main workflows that require communication and coordination between the Model and View through the Presenter. Additionally, the widgets’ data initialization come from the model initialization and passed to the View. Any value processing and/or filtering to match the requirements and logic of the View and Model side should happen on the Presenter.

  1. Application Start - TaviView Initialization. All default settings (if there is any) are retrieved from the settings file.

            sequenceDiagram
        participant View
        participant Presenter
        participant Model
    
        Note over View,Model:  TaviView Initialization
        Note left of View: User clicks "File"->"Load Experiment Folder"
        View->>View: Pop up a QDialog that allows user to view files and traverse system directories
        View->>Presenter: Return a single string of folder directory path
        Presenter->>Model: Pass experiment folder directory to load_raw_scan_from_folder(folder)
        Note right of Model: load_raw_scan_from_folder(folder) perform loading
    
        Model->>View: TO BE FILLED WITH BACKEND STORY
        
  2. PLACEHOLDER MERMAID DIAGRAM

    • Valid Status:

              sequenceDiagram
          participant View
          participant Presenter
          participant Model
      
          Note over View,Model: Updates due to switching to Single Crystal Mode
          Note left of View: User selects the Single Crystal radio button
          View->>Presenter: Trigger the update
          Presenter->>View: Update fields' visibility for single crystal case(field_visibility_in_SC)
          Note left of View: Display the SingleCrystalWidget
          Note left of View: Make crosshair_mod_q_edit field readonly
          Presenter->>Model: Set crosshair parameters with the experiment_type="SingleCrystal" (set_crosshair_data)
          Note right of Model: Store the crosshair data
          Presenter->>Model: Get crosshair parameters with the experiment_type="SingleCrystal"(get_crosshair_data)
          Note right of Model: Calculate the mod_q from the single crystal parameters and return it with the delta_e value
          Model->>Presenter: Return the crosshair data
          Presenter->>View: Return the crosshair data
          Note left of View: Display the data in the crosshair_widget
          Presenter->>Model: Get experiment parameters (get_experiment_data)
          Presenter->>View: Set experiment parameters (experiment_widget.set_values)
          Note left of View: Display experiment parameters values
          Note left of View: handle_field_values_update is triggered
          Presenter->>Model: Get single crystal parameters (get_single_crystal_data)
          Presenter->>Model: Get momentum transfer angle
          Model->>Presenter: Return momentum transfer angle
          Presenter->>View: Set single crystal parameters (singlecrystal_widget.set_parameters)
          Note left of View: Display SingleCrystal parameters values
          Note left of View: handle_field_values_update is triggered
          Presenter->>View: Display momentum transfer angle
          Note left of View: Update momentum transfer angle
          
    • Invalid Status:

              sequenceDiagram
          participant View
          participant Presenter
          participant Model
      
          Note over View,Model: Updates due to switching to Single Crystal Mode
          Note left of View: User selects the Single Crystal radio button
          View->>Presenter: Triggers the update
          Presenter->>View: Update fields' visibility for single crystal case (field_visibility_in_SC)
          Note left of View: Display the SingleCrystalWidget
          Note left of View: Make crosshair_mod_q_edit field readonly
          Presenter->>Model: Set crosshair parameters with the experiment_type="SingleCrystal" (set_crosshair_data)
          Note right of Model: Store the crosshair data
          Presenter->>Model: Get crosshair parameters with the experiment_type="SingleCrystal"(get_crosshair_data)
          Note right of Model: Calculate the mod_q from the single crystal parameters and return it with the delta_e value
          Model->>Presenter: Return the crosshair data
          Presenter->>View: Return the crosshair data
          Presenter->>Model: Get experiment parameters (get_experiment_data)
          Presenter->>View: Set experiment parameters (experiment_widget.set_values)
          Note left of View: Display experiment parameters values
          Note left of View: handle_field_values_update is triggered
          Presenter->>Model: Get single crystal parameters (get_single_crystal_data)
          Presenter->>View: Set single crystal parameters (singlecrystal_widget.set_parameters)
          Note left of View: Display SingleCrystal parameters values
          Note left of View: handle_field_values_update is triggered
          

Experiment Settings

Placveholder for tavi settings, leaving HYSPECPPT’s template here for reference. Update accordingly.

  • Experiment type options
    class ExperimentType(Enum):
        POWDER = "Powder"
        SINGLECRYSTAL = "Single Crystal"
    
  • plot type options
    class PlotType(Enum):
        ALPHA = "alpha_s"
        COSALPHA = "cos^2(alpha_s)"
        COSALPHAPLUS1 = "1+cos^2(alpha_s))/2"
        COS2ALPHA = (cos" + square + alpha + subscript_s + "-sin" + square + alpha + subscript_s + ")",
    
  • DEFAULT_MODE:dict =
    • experiment_type=”single_crystal”

  • DEFAULT_CROSSHAIR: dict =
    • delta_e = 0

    • mod_q = 0

  • DEFAULT_EXPERIMENT:dict =
    • plot_type = PlotType.COS_2_ALPHA_S

    • incident_energy_e = 20

    • detector_tank_angle_s = 30

    • polarization_direction_angle_p = 0

  • DEFAULT_LATTICE:dict =
    • a = 1

    • b = 1

    • c = 1

    • alpha = 90

    • beta = 90

    • gamma = 90

    • h = 0

    • k = 0

    • l = 0

  • MAX_MODQ = 15 – maximum momentum transfer

  • N_POINTS = 200 – number of points in the plot

  • TANK_HALF_WIDTH = 30.0 – tank half-width