====== Planning Results API ====== Below is a list of provided Results API functions for the planning application. Each function must be called using a Thinknode meta request. For more information on Thinknode meta requests, please visit the [[https://developers.thinknode.com/guides/calculations#meta|Thinknode documentation]]. For an example in calling a Planning Results API function, please refer to the //planning_results_api_example.py// in the [[https://github.com/dotdecimal/astroid-script-library|.decimal astroid-script-library]]. ===== Results API Types ===== // PLAN RESULTS API // Some general notes about the API... // // All API functions here are exposed as request generators. This is for // multiple reasons... // // * It allows the implementation to return (possibly chained) 'meta' // requests that retrieve information that's needed to actually get the // results. // // * It allows users to inspect the intermediate requests to see how result // calculations are composed. // // 'xx_summary' structures give a light-weight summary of an 'xx'. // It includes only textual information and IDs. There's no real data. // The real data is retrieved separately through other API calls. // // A 'report' is general information about an object. This can include both // user commentary and parameters that are automatically captured by the app. // // A report has no prescribed structure. It's only meant to be consumed // visually by humans. The generating app version has full flexibility in what // it chooses to include. Thus, apps that use this API should NOT analyze the // contents of the report. If apps need information that's not directly // available outside the report, then either this API is missing information // or they're looking for information that's specific to a particular version // of the planning app (in which case they should be using that version's data // structures directly). // // There's some redundancy in the API (for example, the fact that you can get // the DVHs for structures even though you have enough info to compute them // yourself). This is not just a matter of convenience but is a way of ensuring // that important results are captured as they were originally computed. api(struct) struct ct_summary { double window; double level; vector3d slice_positions; markup_document report; }; api(struct) struct structure_summary { value internal_id; // stringified version of the internal id string id; // display label of the structure styled_text label; rgb8 color; bool visible; double opacity; structure_render_mode render_mode; markup_document report; }; api(struct) struct point_summary { value internal_id; styled_text label; rgb8 color; markup_document report; }; api(struct) struct aperture_summary { styled_text label; markup_document report; aperture_parameters parameters; }; api(struct) struct degrader_summary { styled_text label; markup_document report; double thickness; }; api(struct) struct beam_summary { styled_text label; rgb8 color; markup_document report; styled_text isocenter; styled_text geometric_target_label; styled_text spot_target_label; double couch_angle; double gantry_angle; double air_gap; // optional snout name for this beam optional snout_name; // optional aperture for this beam optional aperture; // list of degraders for this beam std::vector degraders; }; api(struct) struct course_summary { markup_document report; styled_text label; }; api(struct) struct intent_summary { // a report about what the plan was intended to accomplish // (e.g., prescription, goals, etc.) markup_document report; // Name of the patient external structure (from the disease site template) string patient_structure_name; // Name of the treatment_site string treatment_site; }; api(struct) struct patient_model_summary { markup_document report; styled_text label; }; api(struct) struct constraint_summary { string constraint_type; styled_text structure_label; double dose; }; api(struct) struct fraction_group_summary { styled_text label; rgb8 color; markup_document report; unsigned fraction_count; // The scale factor to apply to the rx_statement for the fraction group. Set as follows: // IMPT Fraction Group: 1.0 // SFO Fraction Group: 1.0 / # of beamsets // Advanced Fraction Group: 1.0 double rx_scale_factor; std::vector constraints; std::vector beams; }; api(struct) struct prescription_summary { styled_text label; rgb8 color; markup_document report; // the number of fractions this prescription is specified to implement unsigned fraction_count; // map of the index of the structure from the structure summary and it's Rx dose std::map prescriptions; std::vector fraction_groups; }; api(struct) struct spot_placement_summary { double distal_margin; double lateral_margin; double spot_spacing; string spot_strategy; double layer_spacing; string layer_strategy; }; api(struct) struct objective_summary { string objective_type; styled_text structure_label; optional dose; }; api(struct) struct solver_parameter_summary { bool intelligent_stopping_solver; unsigned solver_iterations; bool intelligent_stopping_optimizer; unsigned optimizer_iterations; }; api(struct) struct dicom_summary { string study_instance_uid; string study_description; string study_id; string series_instance_uid; string series_description; string ref_structure_set_uid; }; api(struct) struct rsp_image_summary { markup_document report; string rsp_image_id; }; api(struct) struct plan_summary { // A summary of the DICOM study/series information dicom_summary dcm_summary; // the treatment plan name styled_text label; // the plan description styled_text description; // the patient information // (e.g., name, mrn, demographics) patient_info patient; // the snapshot patient position patient_position_type patient_position; // info from the course level course_summary course_info; // info from the intent level intent_summary intent_info; // info from the patient model level patient_model_summary patient_model_info; // a summary about the CT image associated with the treatment plan ct_summary ct_image_summary; // a report about the high-level creation of the plan // (e.g., calculation settings, optimization parameters, etc.) markup_document creation_report; // a summary about the RSP image associated with the treatment plan rsp_image_summary rsp_image_info; // a report about the calculation grid used in creating the treatment plan markup_document calc_grid_report; // a report about the results of the plan // (e.g., dose statistics that were considered important) markup_document results_report; // the list of structures relevant to this treatment plan std::vector structures; // the list of points relevant to this treatment plan std::vector points; // ID of the machine on which this plan is intended to be treated string machine_id; // ID of the treatment room on which this plan is intended to be treated string treatment_room_id; // the list of prescriptions intended to be delivered by this plan std::vector prescriptions; // the spot placement parameters used at the plan level spot_placement_summary spot_placement; // the list of constraints to be used for calculating MCO in this plan std::vector constraints; // the list of objectives to be used for calculating MCO in this plan std::vector objectives; // the iteration counts used for MCO calculations in this plan solver_parameter_summary solver_params; }; ===== Results API Functions ===== // Generate the request for the site_info used for constructing the treatment plan. api(fun) calculation_request generate_site_info_request(treatment_plan const& plan); // Generate the request for the dicom rt_ion_plan for a treatment_plan api(fun) calculation_request generate_rt_ion_plan_request( treatment_plan const& plan, rt_approval const& approval, rt_tolerance_table const& tol_table, rt_patient_setup const& patient_setup, std::vector const& prescription_data, unsigned fraction_cycle_length, unsigned fractions_per_day, string const& fraction_pattern); // Generate the request for the summary info for a plan. api(fun) calculation_request generate_plan_summary_request(treatment_plan const& plan); // Generate the request for the CT image used for constructing a plan. // Image is returned in IEC 61217 (DICOM) patient space coordinates. api(fun) calculation_request generate_ct_image_request(treatment_plan const& plan); // Generate the request for the RSP image used for constructing a plan. // The spatial coordinate system is that of the CT image. // TODO: This currently returns the merged EPF image because we don't actually // construct the sliced one as an intermediate step, which is also incorrect. // Once that's fixed, this should return the sliced EPF. api(fun) calculation_request generate_rsp_image_request(treatment_plan const& plan); // Generate the request for the machine used for constructing a plan. api(fun) calculation_request generate_machine_request(treatment_plan const& plan); // Generate the request for the geometry associated with a treatment plan // structure. // structure_index is the index of the structure in the plan summary's // `structures` list. // The spatial coordinate system of the structure is that of the CT image. api(fun) calculation_request generate_structure_geometry_request( treatment_plan const& plan, size_t structure_index); // Generate the request for the geometry associated with a treatment plan // point. api(fun) calculation_request generate_point_geometry_request( treatment_plan const& plan, size_t point_index); // Generate the request for the list of voxels making up the calculation grid // used for a plan. api(fun) calculation_request generate_calc_grid_voxels_request( treatment_plan const& plan); // Generate the request for the dose delivered by a treatment plan. // The units of the dose image are Gy(RBE). // The spatial coordinate system is that of the CT image. api(fun) calculation_request generate_plan_dose_request(treatment_plan const& plan); // Generate the request for the DVH for a structure within a treatment plan. // The DVH is cumulative and includes the full plan dose. // The image-space dimension of the DVH is dose and is in Gy(RBE). // The value-space dimension of the DVH is volume and is fractional (not percent). api(fun) calculation_request generate_plan_dvh_request(treatment_plan const& plan, size_t structure_index); // Generate the request for the dose delivered by a treatment plan for a // particular prescription. // The units of the dose image are Gy(RBE). // The spatial coordinate system is that of the CT image. api(fun) calculation_request generate_prescription_dose_request( treatment_plan const& plan, size_t prescription_index); // Generate the request for the dose delivered by a fraction group within a // treatment plan. // The fraction group is specified by the index of its prescription within the plan // and the index of the fraction group within its prescription. // The units of the dose image are Gy(RBE). // The spatial coordinate system is that of the CT image. api(fun) calculation_request generate_fraction_group_dose_request( treatment_plan const& plan, size_t prescription_index, size_t fraction_group_index); // Generate the request for the dose delivered by a beam within a treatment // plan. // The beam is identified by the index of its prescription within the prescription, its // fraction group within that prescription, and finally the actual beam's index // within its fraction group. // The units of the dose image are Gy(RBE). // The spatial coordinate system is that of the CT image. api(fun) calculation_request generate_beam_dose_request( treatment_plan const& plan, size_t prescription_index, size_t fraction_group_index, size_t beam_index); // Generate the request for the geometry for a beam in a treatment plan. api(fun) calculation_request generate_beam_geometry_request( treatment_plan const& plan, size_t prescription_index, size_t fraction_group_index, size_t beam_index); // Generate the request for the aperture used by a beam within a treatment // plan. // // The generated request will yield an aperture as modeled by the dosimetry // app. // // If the specified beam has no aperture, this is an error. api(fun) calculation_request generate_beam_aperture_request( treatment_plan const& plan, size_t prescription_index, size_t fraction_group_index, size_t beam_index); // Generate the request for the aperture mesh for a beam within a treatment // plan. // // The generated request will yield a 3D mesh that describes the shape that // the planning app believes the aperture to be. The mesh is oriented in beam // space with its downstream edge at the isocentric plane. // // If the specified beam has no aperture, this is an error. api(fun) calculation_request generate_beam_aperture_mesh_request( treatment_plan const& plan, size_t prescription_index, size_t fraction_group_index, size_t beam_index, optional thickness_override); // Generate the request for a degrader used by a beam within a treatment plan. api(fun) calculation_request generate_beam_degrader_request( treatment_plan const& plan, size_t prescription_index, size_t fraction_group_index, size_t beam_index, size_t degrader_index); // Generate the request for the 3D mesh for a degrader used by a beam within a // treatment plan. // // The generated request will yield a 3D mesh that describes the shape that // the planning app believes the degrader to be. The mesh is oriented in beam // space with its downstream edge at the isocentric plane. // /// TODO: Again, I'm not sure that this should really be a separate request. /// api(fun) calculation_request generate_beam_degrader_mesh_request( treatment_plan const& plan, size_t prescription_index, size_t fraction_group_index, size_t beam_index, size_t degrader_index); // Generate the request for the spot list for a beam within a treatment plan. api(fun) calculation_request generate_beam_spot_list_request( treatment_plan const& plan, size_t prescription_index, size_t fraction_group_index, size_t beam_index); // Generate the request for the snout position for a beam within a treatment plan. api(fun) calculation_request generate_beam_snout_position_request( treatment_plan const& plan, size_t prescription_index, size_t fraction_group_index, size_t beam_index);