From b31cf721cc4547f4ed8c90532e18c491ac237783 Mon Sep 17 00:00:00 2001 From: markasoftware Date: Thu, 16 Nov 2023 22:58:35 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20UWCubeSa?= =?UTF-8?q?t/lost@cb1842be99d6820766d1fc3cf53fadddff6ec562=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- annotated.html | 2 +- attitude-estimators_8cpp.html | 2 +- attitude-estimators_8cpp_source.html | 2 +- attitude-estimators_8hpp.html | 2 +- attitude-estimators_8hpp_source.html | 2 +- attitude-utils_8cpp.html | 2 +- attitude-utils_8cpp_source.html | 2 +- attitude-utils_8hpp.html | 2 +- attitude-utils_8hpp_source.html | 2 +- camera_8cpp.html | 2 +- camera_8cpp_source.html | 2 +- camera_8hpp.html | 2 +- camera_8hpp_source.html | 2 +- centroiders_8cpp.html | 2 +- centroiders_8cpp_source.html | 2 +- centroiders_8hpp.html | 2 +- centroiders_8hpp_source.html | 2 +- classes.html | 2 +- classlost_1_1_attitude-members.html | 2 +- classlost_1_1_attitude.html | 2 +- ...attitude_estimation_algorithm-members.html | 2 +- ...ost_1_1_attitude_estimation_algorithm.html | 2 +- classlost_1_1_camera-members.html | 2 +- classlost_1_1_camera.html | 2 +- classlost_1_1_catalog_star-members.html | 2 +- classlost_1_1_catalog_star.html | 2 +- ...1_center_of_gravity_algorithm-members.html | 2 +- ...slost_1_1_center_of_gravity_algorithm.html | 2 +- classlost_1_1_centroid_algorithm-members.html | 2 +- classlost_1_1_centroid_algorithm.html | 2 +- ...slost_1_1_centroid_comparison-members.html | 2 +- classlost_1_1_centroid_comparison.html | 12 +- classlost_1_1_database_options.html | 2 +- ...ost_1_1_davenport_q_algorithm-members.html | 2 +- classlost_1_1_davenport_q_algorithm.html | 2 +- ...slost_1_1_deserialize_context-members.html | 2 +- classlost_1_1_deserialize_context.html | 2 +- ..._1_1_dummy_centroid_algorithm-members.html | 2 +- classlost_1_1_dummy_centroid_algorithm.html | 2 +- ...t_1_1_dummy_star_id_algorithm-members.html | 2 +- classlost_1_1_dummy_star_id_algorithm.html | 2 +- classlost_1_1_euler_angles-members.html | 2 +- classlost_1_1_euler_angles.html | 2 +- ..._1_1_generated_pipeline_input-members.html | 2 +- classlost_1_1_generated_pipeline_input.html | 2 +- classlost_1_1_generated_star-members.html | 2 +- classlost_1_1_generated_star.html | 2 +- ...tric_voting_star_id_algorithm-members.html | 2 +- ..._1_geometric_voting_star_id_algorithm.html | 2 +- ...1_1_i_r_unidentified_centroid-members.html | 2 +- classlost_1_1_i_r_unidentified_centroid.html | 2 +- classlost_1_1_image-members.html | 2 +- classlost_1_1_image.html | 2 +- ...d_center_of_gravity_algorithm-members.html | 2 +- ..._weighted_center_of_gravity_algorithm.html | 2 +- classlost_1_1_k_vector_index-members.html | 2 +- classlost_1_1_k_vector_index.html | 2 +- classlost_1_1_mat3-members.html | 2 +- classlost_1_1_mat3.html | 2 +- classlost_1_1_multi_database-members.html | 2 +- classlost_1_1_multi_database.html | 2 +- ...lost_1_1_multi_database_entry-members.html | 2 +- classlost_1_1_multi_database_entry.html | 2 +- ...r_distance_involving_iterator-members.html | 2 +- ..._1_1_pair_distance_involving_iterator.html | 2 +- ...ir_distance_k_vector_database-members.html | 2 +- ...t_1_1_pair_distance_k_vector_database.html | 2 +- classlost_1_1_pipeline-members.html | 2 +- classlost_1_1_pipeline.html | 10 +- classlost_1_1_pipeline_input-members.html | 2 +- classlost_1_1_pipeline_input.html | 2 +- classlost_1_1_pipeline_options.html | 2 +- classlost_1_1_png_pipeline_input-members.html | 2 +- classlost_1_1_png_pipeline_input.html | 2 +- ...1_1_pyramid_star_id_algorithm-members.html | 2 +- classlost_1_1_pyramid_star_id_algorithm.html | 2 +- classlost_1_1_quaternion-members.html | 2 +- classlost_1_1_quaternion.html | 2 +- classlost_1_1_quest_algorithm-members.html | 2 +- classlost_1_1_quest_algorithm.html | 2 +- classlost_1_1_serialize_context-members.html | 2 +- classlost_1_1_serialize_context.html | 2 +- classlost_1_1_star-members.html | 2 +- classlost_1_1_star.html | 2 +- classlost_1_1_star_id_algorithm-members.html | 2 +- classlost_1_1_star_id_algorithm.html | 2 +- classlost_1_1_star_identifier-members.html | 2 +- classlost_1_1_star_identifier.html | 2 +- classlost_1_1_triad_algorithm-members.html | 2 +- classlost_1_1_triad_algorithm.html | 2 +- ..._user_specified_output_stream-members.html | 2 +- ...lost_1_1_user_specified_output_stream.html | 2 +- classlost_1_1_vec3-members.html | 2 +- classlost_1_1_vec3.html | 2 +- database-options_8hpp.html | 2 +- database-options_8hpp_source.html | 2 +- databases_8cpp.html | 2 +- databases_8cpp_source.html | 2 +- databases_8hpp.html | 2 +- databases_8hpp_source.html | 2 +- dir_138aff360eb965c43b94267b8d1ce09e.html | 2 +- dir_68267d1309a1af8e8297ef4c3efbcdba.html | 2 +- doxygen__splash_8md.html | 2 +- files.html | 2 +- functions.html | 2 +- functions_b.html | 2 +- functions_c.html | 2 +- functions_d.html | 2 +- functions_e.html | 2 +- functions_f.html | 2 +- functions_func.html | 2 +- functions_g.html | 2 +- functions_h.html | 2 +- functions_i.html | 2 +- functions_j.html | 2 +- functions_k.html | 2 +- functions_m.html | 2 +- functions_n.html | 2 +- functions_o.html | 2 +- functions_p.html | 2 +- functions_q.html | 2 +- functions_r.html | 2 +- functions_rela.html | 2 +- functions_s.html | 2 +- functions_t.html | 2 +- functions_u.html | 2 +- functions_v.html | 2 +- functions_vars.html | 2 +- functions_w.html | 2 +- functions_x.html | 2 +- functions_y.html | 2 +- functions_z.html | 2 +- functions_~.html | 2 +- globals.html | 2 +- globals_defs.html | 2 +- globals_func.html | 2 +- graph_legend.html | 2 +- hierarchy.html | 2 +- index.html | 2 +- inherits.html | 2 +- io_8cpp.html | 8 +- io_8cpp.js | 2 +- io_8cpp_source.html | 2229 ++++++++--------- io_8hpp.html | 2 +- io_8hpp_source.html | 14 +- main_8cpp.html | 2 +- main_8cpp_source.html | 8 +- namespacelost.html | 60 +- namespacelost.js | 2 +- ...7d67bec758d4922935c84b8a0f8526_icgraph.map | 2 +- ...7d67bec758d4922935c84b8a0f8526_icgraph.md5 | 2 +- ...2e465adc8dcb532e46b956261bf93fe_cgraph.map | 2 +- ...2e465adc8dcb532e46b956261bf93fe_cgraph.md5 | 2 +- ...eaa81a9fc5f13a447e4209b5b230308_cgraph.map | 0 ...eaa81a9fc5f13a447e4209b5b230308_cgraph.md5 | 0 ...eaa81a9fc5f13a447e4209b5b230308_cgraph.png | Bin ...aa81a9fc5f13a447e4209b5b230308_icgraph.map | 0 ...aa81a9fc5f13a447e4209b5b230308_icgraph.md5 | 0 ...aa81a9fc5f13a447e4209b5b230308_icgraph.png | Bin ...3a90819d379c9a4d0c48f385f52613_icgraph.map | 2 +- ...3a90819d379c9a4d0c48f385f52613_icgraph.md5 | 2 +- ...01d904e4a6bf5aed4a1b8f97f1416c5_cgraph.map | 2 +- ...01d904e4a6bf5aed4a1b8f97f1416c5_cgraph.md5 | 2 +- ...c3a2012bf028c749ba53a46a50ad172_cgraph.map | 2 +- ...c3a2012bf028c749ba53a46a50ad172_cgraph.md5 | 2 +- namespacemembers.html | 4 +- namespacemembers_func.html | 4 +- namespacemembers_type.html | 2 +- namespacemembers_vars.html | 2 +- namespaces.html | 2 +- navtreeindex1.js | 4 +- pages.html | 2 +- pipeline-options_8hpp.html | 2 +- pipeline-options_8hpp_source.html | 2 +- search/all_6.js | 2 +- search/functions_5.js | 2 +- serialize-helpers_8hpp.html | 2 +- serialize-helpers_8hpp_source.html | 2 +- star-id-private_8hpp.html | 2 +- star-id-private_8hpp_source.html | 2 +- star-id_8cpp.html | 2 +- star-id_8cpp_source.html | 2 +- star-id_8hpp.html | 2 +- star-id_8hpp_source.html | 2 +- star-utils_8cpp.html | 2 +- star-utils_8cpp_source.html | 2 +- star-utils_8hpp.html | 2 +- star-utils_8hpp_source.html | 2 +- structlost_1_1_centroid_params-members.html | 2 +- structlost_1_1_centroid_params.html | 2 +- structlost_1_1_i_w_co_g_params-members.html | 2 +- structlost_1_1_i_w_co_g_params.html | 2 +- structlost_1_1_k_vector_pair-members.html | 2 +- structlost_1_1_k_vector_pair.html | 2 +- structlost_1_1_pipeline_output-members.html | 2 +- structlost_1_1_pipeline_output.html | 2 +- ...ctlost_1_1_star_id_comparison-members.html | 2 +- structlost_1_1_star_id_comparison.html | 2 +- structlost_1_1_vec2-members.html | 2 +- structlost_1_1_vec2.html | 2 +- todo.html | 2 +- 201 files changed, 1366 insertions(+), 1357 deletions(-) rename namespacelost_a1187da9a83232a720a84bef1b99c5b58_cgraph.map => namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_cgraph.map (100%) rename namespacelost_a1187da9a83232a720a84bef1b99c5b58_cgraph.md5 => namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_cgraph.md5 (100%) rename namespacelost_a1187da9a83232a720a84bef1b99c5b58_cgraph.png => namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_cgraph.png (100%) rename namespacelost_a1187da9a83232a720a84bef1b99c5b58_icgraph.map => namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_icgraph.map (100%) rename namespacelost_a1187da9a83232a720a84bef1b99c5b58_icgraph.md5 => namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_icgraph.md5 (100%) rename namespacelost_a1187da9a83232a720a84bef1b99c5b58_icgraph.png => namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_icgraph.png (100%) diff --git a/annotated.html b/annotated.html index c0cdc966..c9aa50ce 100644 --- a/annotated.html +++ b/annotated.html @@ -142,7 +142,7 @@ diff --git a/attitude-estimators_8cpp.html b/attitude-estimators_8cpp.html index a63e412e..a6393d53 100644 --- a/attitude-estimators_8cpp.html +++ b/attitude-estimators_8cpp.html @@ -166,7 +166,7 @@

    - +
diff --git a/attitude-estimators_8cpp_source.html b/attitude-estimators_8cpp_source.html index ea78889b..0720bb33 100644 --- a/attitude-estimators_8cpp_source.html +++ b/attitude-estimators_8cpp_source.html @@ -325,7 +325,7 @@ diff --git a/attitude-estimators_8hpp.html b/attitude-estimators_8hpp.html index ba8b1790..8658e9e7 100644 --- a/attitude-estimators_8hpp.html +++ b/attitude-estimators_8hpp.html @@ -157,7 +157,7 @@ diff --git a/attitude-estimators_8hpp_source.html b/attitude-estimators_8hpp_source.html index 1d5ba424..af03e293 100644 --- a/attitude-estimators_8hpp_source.html +++ b/attitude-estimators_8hpp_source.html @@ -146,7 +146,7 @@ diff --git a/attitude-utils_8cpp.html b/attitude-utils_8cpp.html index 317050b6..441a8373 100644 --- a/attitude-utils_8cpp.html +++ b/attitude-utils_8cpp.html @@ -210,7 +210,7 @@

    - +
diff --git a/attitude-utils_8cpp_source.html b/attitude-utils_8cpp_source.html index 2dc01dd9..08f7321b 100644 --- a/attitude-utils_8cpp_source.html +++ b/attitude-utils_8cpp_source.html @@ -600,7 +600,7 @@ diff --git a/attitude-utils_8hpp.html b/attitude-utils_8hpp.html index fd7798d9..1a32a533 100644 --- a/attitude-utils_8hpp.html +++ b/attitude-utils_8hpp.html @@ -213,7 +213,7 @@ diff --git a/attitude-utils_8hpp_source.html b/attitude-utils_8hpp_source.html index 34dc9662..255206f8 100644 --- a/attitude-utils_8hpp_source.html +++ b/attitude-utils_8hpp_source.html @@ -331,7 +331,7 @@ diff --git a/camera_8cpp.html b/camera_8cpp.html index 26c3a0f7..08aba5a8 100644 --- a/camera_8cpp.html +++ b/camera_8cpp.html @@ -134,7 +134,7 @@ diff --git a/camera_8cpp_source.html b/camera_8cpp_source.html index 9b780936..f1824938 100644 --- a/camera_8cpp_source.html +++ b/camera_8cpp_source.html @@ -166,7 +166,7 @@ diff --git a/camera_8hpp.html b/camera_8hpp.html index 4ea13df6..be7bdbf6 100644 --- a/camera_8hpp.html +++ b/camera_8hpp.html @@ -150,7 +150,7 @@ diff --git a/camera_8hpp_source.html b/camera_8hpp_source.html index a8cfddc9..6ce0ea38 100644 --- a/camera_8hpp_source.html +++ b/camera_8hpp_source.html @@ -161,7 +161,7 @@ diff --git a/centroiders_8cpp.html b/centroiders_8cpp.html index 0493e616..fd920e77 100644 --- a/centroiders_8cpp.html +++ b/centroiders_8cpp.html @@ -166,7 +166,7 @@ diff --git a/centroiders_8cpp_source.html b/centroiders_8cpp_source.html index 720cd5a5..a46168a9 100644 --- a/centroiders_8cpp_source.html +++ b/centroiders_8cpp_source.html @@ -453,7 +453,7 @@ diff --git a/centroiders_8hpp.html b/centroiders_8hpp.html index aa0329f1..71893bef 100644 --- a/centroiders_8hpp.html +++ b/centroiders_8hpp.html @@ -157,7 +157,7 @@ diff --git a/centroiders_8hpp_source.html b/centroiders_8hpp_source.html index 4956cc62..c3a1c421 100644 --- a/centroiders_8hpp_source.html +++ b/centroiders_8hpp_source.html @@ -148,7 +148,7 @@ diff --git a/classes.html b/classes.html index 3d6097f1..56d51e73 100644 --- a/classes.html +++ b/classes.html @@ -137,7 +137,7 @@ diff --git a/classlost_1_1_attitude-members.html b/classlost_1_1_attitude-members.html index b253a188..891a2187 100644 --- a/classlost_1_1_attitude-members.html +++ b/classlost_1_1_attitude-members.html @@ -103,7 +103,7 @@ diff --git a/classlost_1_1_attitude.html b/classlost_1_1_attitude.html index e72aa5f3..1e167e2e 100644 --- a/classlost_1_1_attitude.html +++ b/classlost_1_1_attitude.html @@ -418,7 +418,7 @@

    - +
diff --git a/classlost_1_1_attitude_estimation_algorithm-members.html b/classlost_1_1_attitude_estimation_algorithm-members.html index 2f6886bf..c472322a 100644 --- a/classlost_1_1_attitude_estimation_algorithm-members.html +++ b/classlost_1_1_attitude_estimation_algorithm-members.html @@ -97,7 +97,7 @@ diff --git a/classlost_1_1_attitude_estimation_algorithm.html b/classlost_1_1_attitude_estimation_algorithm.html index 3be6ed0e..dfcf24aa 100644 --- a/classlost_1_1_attitude_estimation_algorithm.html +++ b/classlost_1_1_attitude_estimation_algorithm.html @@ -211,7 +211,7 @@

diff --git a/classlost_1_1_camera-members.html b/classlost_1_1_camera-members.html index e780c7f1..e7c1ffb8 100644 --- a/classlost_1_1_camera-members.html +++ b/classlost_1_1_camera-members.html @@ -106,7 +106,7 @@ diff --git a/classlost_1_1_camera.html b/classlost_1_1_camera.html index b3f7f884..7688af10 100644 --- a/classlost_1_1_camera.html +++ b/classlost_1_1_camera.html @@ -580,7 +580,7 @@

    - +
diff --git a/classlost_1_1_catalog_star-members.html b/classlost_1_1_catalog_star-members.html index 5a4ef86c..f9b591a2 100644 --- a/classlost_1_1_catalog_star-members.html +++ b/classlost_1_1_catalog_star-members.html @@ -101,7 +101,7 @@ diff --git a/classlost_1_1_catalog_star.html b/classlost_1_1_catalog_star.html index a6e8fd69..a2c173d3 100644 --- a/classlost_1_1_catalog_star.html +++ b/classlost_1_1_catalog_star.html @@ -329,7 +329,7 @@

    - +
diff --git a/classlost_1_1_center_of_gravity_algorithm-members.html b/classlost_1_1_center_of_gravity_algorithm-members.html index a8fe72d8..3837c6eb 100644 --- a/classlost_1_1_center_of_gravity_algorithm-members.html +++ b/classlost_1_1_center_of_gravity_algorithm-members.html @@ -98,7 +98,7 @@ diff --git a/classlost_1_1_center_of_gravity_algorithm.html b/classlost_1_1_center_of_gravity_algorithm.html index 49b75d2c..f6b5b0fd 100644 --- a/classlost_1_1_center_of_gravity_algorithm.html +++ b/classlost_1_1_center_of_gravity_algorithm.html @@ -234,7 +234,7 @@

    - +
diff --git a/classlost_1_1_centroid_algorithm-members.html b/classlost_1_1_centroid_algorithm-members.html index 92ed468f..99e72606 100644 --- a/classlost_1_1_centroid_algorithm-members.html +++ b/classlost_1_1_centroid_algorithm-members.html @@ -97,7 +97,7 @@ diff --git a/classlost_1_1_centroid_algorithm.html b/classlost_1_1_centroid_algorithm.html index 7dce51c5..d4f279b3 100644 --- a/classlost_1_1_centroid_algorithm.html +++ b/classlost_1_1_centroid_algorithm.html @@ -210,7 +210,7 @@

    - +
diff --git a/classlost_1_1_centroid_comparison-members.html b/classlost_1_1_centroid_comparison-members.html index 6cc3fd24..50a7a21c 100644 --- a/classlost_1_1_centroid_comparison-members.html +++ b/classlost_1_1_centroid_comparison-members.html @@ -99,7 +99,7 @@ diff --git a/classlost_1_1_centroid_comparison.html b/classlost_1_1_centroid_comparison.html index 884582fb..26790d39 100644 --- a/classlost_1_1_centroid_comparison.html +++ b/classlost_1_1_centroid_comparison.html @@ -115,7 +115,7 @@

Detailed Description

The result of comparing actual and expected centroids Used for debugging and benchmarking.

-

Definition at line 1022 of file io.cpp.

+

Definition at line 1021 of file io.cpp.

Constructor & Destructor Documentation

◆ CentroidComparison()

@@ -140,7 +140,7 @@

-

Definition at line 1024 of file io.cpp.

+

Definition at line 1023 of file io.cpp.

@@ -159,7 +159,7 @@

Definition at line 1029 of file io.cpp.

+

Definition at line 1028 of file io.cpp.

@@ -177,7 +177,7 @@

Definition at line 1034 of file io.cpp.

+

Definition at line 1033 of file io.cpp.

@@ -196,7 +196,7 @@

Definition at line 1040 of file io.cpp.

+

Definition at line 1039 of file io.cpp.

@@ -209,7 +209,7 @@

    - +
diff --git a/classlost_1_1_database_options.html b/classlost_1_1_database_options.html index 7e5e2b20..3780c67b 100644 --- a/classlost_1_1_database_options.html +++ b/classlost_1_1_database_options.html @@ -105,7 +105,7 @@ diff --git a/classlost_1_1_davenport_q_algorithm-members.html b/classlost_1_1_davenport_q_algorithm-members.html index 9d29ce78..71253f5a 100644 --- a/classlost_1_1_davenport_q_algorithm-members.html +++ b/classlost_1_1_davenport_q_algorithm-members.html @@ -97,7 +97,7 @@ diff --git a/classlost_1_1_davenport_q_algorithm.html b/classlost_1_1_davenport_q_algorithm.html index d927fc8f..7ff0c9f6 100644 --- a/classlost_1_1_davenport_q_algorithm.html +++ b/classlost_1_1_davenport_q_algorithm.html @@ -204,7 +204,7 @@

    - +
diff --git a/classlost_1_1_deserialize_context-members.html b/classlost_1_1_deserialize_context-members.html index b67fa616..4f1d721f 100644 --- a/classlost_1_1_deserialize_context-members.html +++ b/classlost_1_1_deserialize_context-members.html @@ -99,7 +99,7 @@ diff --git a/classlost_1_1_deserialize_context.html b/classlost_1_1_deserialize_context.html index 7395ffe4..054a0798 100644 --- a/classlost_1_1_deserialize_context.html +++ b/classlost_1_1_deserialize_context.html @@ -258,7 +258,7 @@

    - +
diff --git a/classlost_1_1_dummy_centroid_algorithm-members.html b/classlost_1_1_dummy_centroid_algorithm-members.html index 3c0a5795..93080a4b 100644 --- a/classlost_1_1_dummy_centroid_algorithm-members.html +++ b/classlost_1_1_dummy_centroid_algorithm-members.html @@ -98,7 +98,7 @@ diff --git a/classlost_1_1_dummy_centroid_algorithm.html b/classlost_1_1_dummy_centroid_algorithm.html index 83b6379a..29453233 100644 --- a/classlost_1_1_dummy_centroid_algorithm.html +++ b/classlost_1_1_dummy_centroid_algorithm.html @@ -224,7 +224,7 @@

    - +
diff --git a/classlost_1_1_dummy_star_id_algorithm-members.html b/classlost_1_1_dummy_star_id_algorithm-members.html index 406610d3..94889f31 100644 --- a/classlost_1_1_dummy_star_id_algorithm-members.html +++ b/classlost_1_1_dummy_star_id_algorithm-members.html @@ -97,7 +97,7 @@ diff --git a/classlost_1_1_dummy_star_id_algorithm.html b/classlost_1_1_dummy_star_id_algorithm.html index e0e656c0..206592bd 100644 --- a/classlost_1_1_dummy_star_id_algorithm.html +++ b/classlost_1_1_dummy_star_id_algorithm.html @@ -192,7 +192,7 @@

    - +
diff --git a/classlost_1_1_euler_angles-members.html b/classlost_1_1_euler_angles-members.html index 25d137dd..2dd587d5 100644 --- a/classlost_1_1_euler_angles-members.html +++ b/classlost_1_1_euler_angles-members.html @@ -99,7 +99,7 @@ diff --git a/classlost_1_1_euler_angles.html b/classlost_1_1_euler_angles.html index f4a15df3..23fea2d6 100644 --- a/classlost_1_1_euler_angles.html +++ b/classlost_1_1_euler_angles.html @@ -228,7 +228,7 @@

    - +
diff --git a/classlost_1_1_generated_pipeline_input-members.html b/classlost_1_1_generated_pipeline_input-members.html index b1696d1c..102b8a68 100644 --- a/classlost_1_1_generated_pipeline_input-members.html +++ b/classlost_1_1_generated_pipeline_input-members.html @@ -107,7 +107,7 @@ diff --git a/classlost_1_1_generated_pipeline_input.html b/classlost_1_1_generated_pipeline_input.html index db591a1c..7c302acf 100644 --- a/classlost_1_1_generated_pipeline_input.html +++ b/classlost_1_1_generated_pipeline_input.html @@ -573,7 +573,7 @@

    - +
diff --git a/classlost_1_1_generated_star-members.html b/classlost_1_1_generated_star-members.html index b0c91a78..af514e75 100644 --- a/classlost_1_1_generated_star-members.html +++ b/classlost_1_1_generated_star-members.html @@ -105,7 +105,7 @@ diff --git a/classlost_1_1_generated_star.html b/classlost_1_1_generated_star.html index d8bb46ec..6a53908a 100644 --- a/classlost_1_1_generated_star.html +++ b/classlost_1_1_generated_star.html @@ -245,7 +245,7 @@

    - +
diff --git a/classlost_1_1_geometric_voting_star_id_algorithm-members.html b/classlost_1_1_geometric_voting_star_id_algorithm-members.html index b36baafe..64cad8b0 100644 --- a/classlost_1_1_geometric_voting_star_id_algorithm-members.html +++ b/classlost_1_1_geometric_voting_star_id_algorithm-members.html @@ -98,7 +98,7 @@ diff --git a/classlost_1_1_geometric_voting_star_id_algorithm.html b/classlost_1_1_geometric_voting_star_id_algorithm.html index d2f57599..1627367c 100644 --- a/classlost_1_1_geometric_voting_star_id_algorithm.html +++ b/classlost_1_1_geometric_voting_star_id_algorithm.html @@ -247,7 +247,7 @@

diff --git a/classlost_1_1_i_r_unidentified_centroid-members.html b/classlost_1_1_i_r_unidentified_centroid-members.html index 1706ca2f..ad7701ae 100644 --- a/classlost_1_1_i_r_unidentified_centroid-members.html +++ b/classlost_1_1_i_r_unidentified_centroid-members.html @@ -103,7 +103,7 @@ diff --git a/classlost_1_1_i_r_unidentified_centroid.html b/classlost_1_1_i_r_unidentified_centroid.html index af958814..16b55909 100644 --- a/classlost_1_1_i_r_unidentified_centroid.html +++ b/classlost_1_1_i_r_unidentified_centroid.html @@ -339,7 +339,7 @@

    - +
diff --git a/classlost_1_1_image-members.html b/classlost_1_1_image-members.html index 30ab3e86..cf9d3a66 100644 --- a/classlost_1_1_image-members.html +++ b/classlost_1_1_image-members.html @@ -98,7 +98,7 @@ diff --git a/classlost_1_1_image.html b/classlost_1_1_image.html index 5edeabdc..e15bbf51 100644 --- a/classlost_1_1_image.html +++ b/classlost_1_1_image.html @@ -171,7 +171,7 @@

    - +
diff --git a/classlost_1_1_iterative_weighted_center_of_gravity_algorithm-members.html b/classlost_1_1_iterative_weighted_center_of_gravity_algorithm-members.html index fa9558aa..f5c4d8f2 100644 --- a/classlost_1_1_iterative_weighted_center_of_gravity_algorithm-members.html +++ b/classlost_1_1_iterative_weighted_center_of_gravity_algorithm-members.html @@ -98,7 +98,7 @@ diff --git a/classlost_1_1_iterative_weighted_center_of_gravity_algorithm.html b/classlost_1_1_iterative_weighted_center_of_gravity_algorithm.html index 2270d13d..c83afed7 100644 --- a/classlost_1_1_iterative_weighted_center_of_gravity_algorithm.html +++ b/classlost_1_1_iterative_weighted_center_of_gravity_algorithm.html @@ -234,7 +234,7 @@

diff --git a/classlost_1_1_k_vector_index-members.html b/classlost_1_1_k_vector_index-members.html index f968a0b9..79486eed 100644 --- a/classlost_1_1_k_vector_index-members.html +++ b/classlost_1_1_k_vector_index-members.html @@ -101,7 +101,7 @@ diff --git a/classlost_1_1_k_vector_index.html b/classlost_1_1_k_vector_index.html index 6f48cecc..4a86f4aa 100644 --- a/classlost_1_1_k_vector_index.html +++ b/classlost_1_1_k_vector_index.html @@ -366,7 +366,7 @@

    - +
diff --git a/classlost_1_1_mat3-members.html b/classlost_1_1_mat3-members.html index 86ab646b..13db028f 100644 --- a/classlost_1_1_mat3-members.html +++ b/classlost_1_1_mat3-members.html @@ -107,7 +107,7 @@ diff --git a/classlost_1_1_mat3.html b/classlost_1_1_mat3.html index 25110fde..20a3eb5b 100644 --- a/classlost_1_1_mat3.html +++ b/classlost_1_1_mat3.html @@ -579,7 +579,7 @@

    - +
diff --git a/classlost_1_1_multi_database-members.html b/classlost_1_1_multi_database-members.html index c78370c8..9e6ec2f9 100644 --- a/classlost_1_1_multi_database-members.html +++ b/classlost_1_1_multi_database-members.html @@ -97,7 +97,7 @@ diff --git a/classlost_1_1_multi_database.html b/classlost_1_1_multi_database.html index 052cd8d5..628bdad7 100644 --- a/classlost_1_1_multi_database.html +++ b/classlost_1_1_multi_database.html @@ -194,7 +194,7 @@

    - +
diff --git a/classlost_1_1_multi_database_entry-members.html b/classlost_1_1_multi_database_entry-members.html index 7b842a2b..8d50ea42 100644 --- a/classlost_1_1_multi_database_entry-members.html +++ b/classlost_1_1_multi_database_entry-members.html @@ -98,7 +98,7 @@ diff --git a/classlost_1_1_multi_database_entry.html b/classlost_1_1_multi_database_entry.html index e05975aa..1784330d 100644 --- a/classlost_1_1_multi_database_entry.html +++ b/classlost_1_1_multi_database_entry.html @@ -190,7 +190,7 @@

    - +
diff --git a/classlost_1_1_pair_distance_involving_iterator-members.html b/classlost_1_1_pair_distance_involving_iterator-members.html index 9d763de0..f707e3b3 100644 --- a/classlost_1_1_pair_distance_involving_iterator-members.html +++ b/classlost_1_1_pair_distance_involving_iterator-members.html @@ -100,7 +100,7 @@ diff --git a/classlost_1_1_pair_distance_involving_iterator.html b/classlost_1_1_pair_distance_involving_iterator.html index 407d6814..a2c049ab 100644 --- a/classlost_1_1_pair_distance_involving_iterator.html +++ b/classlost_1_1_pair_distance_involving_iterator.html @@ -321,7 +321,7 @@

diff --git a/classlost_1_1_pair_distance_k_vector_database-members.html b/classlost_1_1_pair_distance_k_vector_database-members.html index efd19867..bd4dfdec 100644 --- a/classlost_1_1_pair_distance_k_vector_database-members.html +++ b/classlost_1_1_pair_distance_k_vector_database-members.html @@ -103,7 +103,7 @@ diff --git a/classlost_1_1_pair_distance_k_vector_database.html b/classlost_1_1_pair_distance_k_vector_database.html index eff07206..703359e0 100644 --- a/classlost_1_1_pair_distance_k_vector_database.html +++ b/classlost_1_1_pair_distance_k_vector_database.html @@ -514,7 +514,7 @@

diff --git a/classlost_1_1_pipeline-members.html b/classlost_1_1_pipeline-members.html index 6bb2d325..db85938c 100644 --- a/classlost_1_1_pipeline-members.html +++ b/classlost_1_1_pipeline-members.html @@ -100,7 +100,7 @@ diff --git a/classlost_1_1_pipeline.html b/classlost_1_1_pipeline.html index 9c7dc8d3..c0118473 100644 --- a/classlost_1_1_pipeline.html +++ b/classlost_1_1_pipeline.html @@ -194,7 +194,7 @@

Definition at line 814 of file io.cpp.

+

Definition at line 813 of file io.cpp.

@@ -218,7 +218,7 @@

PipelineInput will contain only an InputImage. In this case, Go runs each star tracking algorithm in turn, passing the result of each step into the next one. When running on a generated image (or any pipeline input where methods other than InputImage are available), or using a Pipeline where some algorithms are not set, the behavior is more nuanced. Each algorithm will be run on the return value of the corresponding input method from the PipelineInput object, unless an earlier algorithm in the Pipeline returned a result, in which case that intermediate value is used instead of the value from the PipelineInput.

-

Definition at line 901 of file io.cpp.

+

Definition at line 900 of file io.cpp.

Here is the call graph for this function:
@@ -266,7 +266,7 @@

Pipeline::Go function on each input.

-

Definition at line 1003 of file io.cpp.

+

Definition at line 1002 of file io.cpp.

Here is the call graph for this function:
@@ -315,7 +315,7 @@

Definition at line 835 of file io.cpp.

+

Definition at line 834 of file io.cpp.

@@ -329,7 +329,7 @@

    - +
diff --git a/classlost_1_1_pipeline_input-members.html b/classlost_1_1_pipeline_input-members.html index 0c8e9682..46f0114d 100644 --- a/classlost_1_1_pipeline_input-members.html +++ b/classlost_1_1_pipeline_input-members.html @@ -106,7 +106,7 @@ diff --git a/classlost_1_1_pipeline_input.html b/classlost_1_1_pipeline_input.html index eb5df07b..0739af91 100644 --- a/classlost_1_1_pipeline_input.html +++ b/classlost_1_1_pipeline_input.html @@ -568,7 +568,7 @@

    - +
diff --git a/classlost_1_1_pipeline_options.html b/classlost_1_1_pipeline_options.html index b277d617..8bca6562 100644 --- a/classlost_1_1_pipeline_options.html +++ b/classlost_1_1_pipeline_options.html @@ -105,7 +105,7 @@ diff --git a/classlost_1_1_png_pipeline_input-members.html b/classlost_1_1_png_pipeline_input-members.html index b50cef43..02f35f78 100644 --- a/classlost_1_1_png_pipeline_input-members.html +++ b/classlost_1_1_png_pipeline_input-members.html @@ -108,7 +108,7 @@ diff --git a/classlost_1_1_png_pipeline_input.html b/classlost_1_1_png_pipeline_input.html index 0e9a3922..11222a84 100644 --- a/classlost_1_1_png_pipeline_input.html +++ b/classlost_1_1_png_pipeline_input.html @@ -328,7 +328,7 @@

    - +
diff --git a/classlost_1_1_pyramid_star_id_algorithm-members.html b/classlost_1_1_pyramid_star_id_algorithm-members.html index 5de6f823..68b1287e 100644 --- a/classlost_1_1_pyramid_star_id_algorithm-members.html +++ b/classlost_1_1_pyramid_star_id_algorithm-members.html @@ -98,7 +98,7 @@ diff --git a/classlost_1_1_pyramid_star_id_algorithm.html b/classlost_1_1_pyramid_star_id_algorithm.html index 5183e111..08178010 100644 --- a/classlost_1_1_pyramid_star_id_algorithm.html +++ b/classlost_1_1_pyramid_star_id_algorithm.html @@ -285,7 +285,7 @@

    - +
diff --git a/classlost_1_1_quaternion-members.html b/classlost_1_1_quaternion-members.html index 4a0bb0da..647c2594 100644 --- a/classlost_1_1_quaternion-members.html +++ b/classlost_1_1_quaternion-members.html @@ -114,7 +114,7 @@ diff --git a/classlost_1_1_quaternion.html b/classlost_1_1_quaternion.html index 48ad0c9d..78857981 100644 --- a/classlost_1_1_quaternion.html +++ b/classlost_1_1_quaternion.html @@ -769,7 +769,7 @@

    - +
diff --git a/classlost_1_1_quest_algorithm-members.html b/classlost_1_1_quest_algorithm-members.html index 9d49399e..a2ccbbbc 100644 --- a/classlost_1_1_quest_algorithm-members.html +++ b/classlost_1_1_quest_algorithm-members.html @@ -97,7 +97,7 @@ diff --git a/classlost_1_1_quest_algorithm.html b/classlost_1_1_quest_algorithm.html index 9b7051dc..5d0e72c7 100644 --- a/classlost_1_1_quest_algorithm.html +++ b/classlost_1_1_quest_algorithm.html @@ -214,7 +214,7 @@

    - +
diff --git a/classlost_1_1_serialize_context-members.html b/classlost_1_1_serialize_context-members.html index 0531183f..4f7a0bfa 100644 --- a/classlost_1_1_serialize_context-members.html +++ b/classlost_1_1_serialize_context-members.html @@ -100,7 +100,7 @@ diff --git a/classlost_1_1_serialize_context.html b/classlost_1_1_serialize_context.html index 6fec9808..ba72b9c9 100644 --- a/classlost_1_1_serialize_context.html +++ b/classlost_1_1_serialize_context.html @@ -237,7 +237,7 @@

    - +
diff --git a/classlost_1_1_star-members.html b/classlost_1_1_star-members.html index 7d6c50af..1ff8f22f 100644 --- a/classlost_1_1_star-members.html +++ b/classlost_1_1_star-members.html @@ -102,7 +102,7 @@ diff --git a/classlost_1_1_star.html b/classlost_1_1_star.html index 352898a0..9c3f0447 100644 --- a/classlost_1_1_star.html +++ b/classlost_1_1_star.html @@ -361,7 +361,7 @@

    - +
diff --git a/classlost_1_1_star_id_algorithm-members.html b/classlost_1_1_star_id_algorithm-members.html index 8114c519..6b0caf73 100644 --- a/classlost_1_1_star_id_algorithm-members.html +++ b/classlost_1_1_star_id_algorithm-members.html @@ -97,7 +97,7 @@ diff --git a/classlost_1_1_star_id_algorithm.html b/classlost_1_1_star_id_algorithm.html index 9e171d02..68fa504c 100644 --- a/classlost_1_1_star_id_algorithm.html +++ b/classlost_1_1_star_id_algorithm.html @@ -210,7 +210,7 @@

    - +
diff --git a/classlost_1_1_star_identifier-members.html b/classlost_1_1_star_identifier-members.html index 6608b264..4816accf 100644 --- a/classlost_1_1_star_identifier-members.html +++ b/classlost_1_1_star_identifier-members.html @@ -101,7 +101,7 @@ diff --git a/classlost_1_1_star_identifier.html b/classlost_1_1_star_identifier.html index af0c825b..36b920a9 100644 --- a/classlost_1_1_star_identifier.html +++ b/classlost_1_1_star_identifier.html @@ -302,7 +302,7 @@

    - +
diff --git a/classlost_1_1_triad_algorithm-members.html b/classlost_1_1_triad_algorithm-members.html index c86b2f85..9e1e3e86 100644 --- a/classlost_1_1_triad_algorithm-members.html +++ b/classlost_1_1_triad_algorithm-members.html @@ -97,7 +97,7 @@ diff --git a/classlost_1_1_triad_algorithm.html b/classlost_1_1_triad_algorithm.html index a3d5182f..aa6558ce 100644 --- a/classlost_1_1_triad_algorithm.html +++ b/classlost_1_1_triad_algorithm.html @@ -206,7 +206,7 @@

    - +
diff --git a/classlost_1_1_user_specified_output_stream-members.html b/classlost_1_1_user_specified_output_stream-members.html index ddce27c2..168bbcea 100644 --- a/classlost_1_1_user_specified_output_stream-members.html +++ b/classlost_1_1_user_specified_output_stream-members.html @@ -98,7 +98,7 @@ diff --git a/classlost_1_1_user_specified_output_stream.html b/classlost_1_1_user_specified_output_stream.html index ecf245e0..c007d9f8 100644 --- a/classlost_1_1_user_specified_output_stream.html +++ b/classlost_1_1_user_specified_output_stream.html @@ -211,7 +211,7 @@

diff --git a/classlost_1_1_vec3-members.html b/classlost_1_1_vec3-members.html index 0160d47d..753db4be 100644 --- a/classlost_1_1_vec3-members.html +++ b/classlost_1_1_vec3-members.html @@ -107,7 +107,7 @@ diff --git a/classlost_1_1_vec3.html b/classlost_1_1_vec3.html index 798ad21f..9e207b69 100644 --- a/classlost_1_1_vec3.html +++ b/classlost_1_1_vec3.html @@ -489,7 +489,7 @@

    - +
diff --git a/database-options_8hpp.html b/database-options_8hpp.html index c5da8c46..ace71f8f 100644 --- a/database-options_8hpp.html +++ b/database-options_8hpp.html @@ -116,7 +116,7 @@ diff --git a/database-options_8hpp_source.html b/database-options_8hpp_source.html index d6d652cf..c7513991 100644 --- a/database-options_8hpp_source.html +++ b/database-options_8hpp_source.html @@ -110,7 +110,7 @@ diff --git a/databases_8cpp.html b/databases_8cpp.html index a9911825..19a93fe1 100644 --- a/databases_8cpp.html +++ b/databases_8cpp.html @@ -162,7 +162,7 @@ diff --git a/databases_8cpp_source.html b/databases_8cpp_source.html index dc4b12d5..10b4a870 100644 --- a/databases_8cpp_source.html +++ b/databases_8cpp_source.html @@ -403,7 +403,7 @@ diff --git a/databases_8hpp.html b/databases_8hpp.html index b5ea9463..360bc392 100644 --- a/databases_8hpp.html +++ b/databases_8hpp.html @@ -177,7 +177,7 @@ diff --git a/databases_8hpp_source.html b/databases_8hpp_source.html index c6b9d9ca..b5326cfe 100644 --- a/databases_8hpp_source.html +++ b/databases_8hpp_source.html @@ -227,7 +227,7 @@ diff --git a/dir_138aff360eb965c43b94267b8d1ce09e.html b/dir_138aff360eb965c43b94267b8d1ce09e.html index 4d4b98bf..4b2a6cfb 100644 --- a/dir_138aff360eb965c43b94267b8d1ce09e.html +++ b/dir_138aff360eb965c43b94267b8d1ce09e.html @@ -93,7 +93,7 @@ diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/dir_68267d1309a1af8e8297ef4c3efbcdba.html index 3af650ff..fd21501d 100644 --- a/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -139,7 +139,7 @@ diff --git a/doxygen__splash_8md.html b/doxygen__splash_8md.html index 26750171..2e6a8617 100644 --- a/doxygen__splash_8md.html +++ b/doxygen__splash_8md.html @@ -93,7 +93,7 @@ diff --git a/files.html b/files.html index 99486273..a8a2d1f3 100644 --- a/files.html +++ b/files.html @@ -119,7 +119,7 @@ diff --git a/functions.html b/functions.html index e474b817..d46473f3 100644 --- a/functions.html +++ b/functions.html @@ -110,7 +110,7 @@

- a -

    diff --git a/functions_b.html b/functions_b.html index 4c127aae..12072193 100644 --- a/functions_b.html +++ b/functions_b.html @@ -107,7 +107,7 @@

    - b -

      diff --git a/functions_c.html b/functions_c.html index 880f53cb..6062d420 100644 --- a/functions_c.html +++ b/functions_c.html @@ -136,7 +136,7 @@

      - c -

        diff --git a/functions_d.html b/functions_d.html index 8df2fd2b..3fdc74cf 100644 --- a/functions_d.html +++ b/functions_d.html @@ -110,7 +110,7 @@

        - d -

          diff --git a/functions_e.html b/functions_e.html index b9c88e70..fe1647e0 100644 --- a/functions_e.html +++ b/functions_e.html @@ -106,7 +106,7 @@

          - e -

            diff --git a/functions_f.html b/functions_f.html index 89d42067..26fa58d0 100644 --- a/functions_f.html +++ b/functions_f.html @@ -104,7 +104,7 @@

            - f -

              diff --git a/functions_func.html b/functions_func.html index 03669118..dc8c5779 100644 --- a/functions_func.html +++ b/functions_func.html @@ -507,7 +507,7 @@

              - ~ -

                diff --git a/functions_g.html b/functions_g.html index a3c0a3a0..023f471a 100644 --- a/functions_g.html +++ b/functions_g.html @@ -136,7 +136,7 @@

                - g -

                  diff --git a/functions_h.html b/functions_h.html index dfb2587a..3ad14f8f 100644 --- a/functions_h.html +++ b/functions_h.html @@ -98,7 +98,7 @@

                  - h -

                    diff --git a/functions_i.html b/functions_i.html index 93fa793d..c3f6d5b0 100644 --- a/functions_i.html +++ b/functions_i.html @@ -154,7 +154,7 @@

                    - i -

                      diff --git a/functions_j.html b/functions_j.html index a545dd44..451c9683 100644 --- a/functions_j.html +++ b/functions_j.html @@ -95,7 +95,7 @@

                      - j -

                        diff --git a/functions_k.html b/functions_k.html index 2909c78b..05642272 100644 --- a/functions_k.html +++ b/functions_k.html @@ -101,7 +101,7 @@

                        - k -

                          diff --git a/functions_m.html b/functions_m.html index 0205fbe3..033c594c 100644 --- a/functions_m.html +++ b/functions_m.html @@ -137,7 +137,7 @@

                          - m -

                            diff --git a/functions_n.html b/functions_n.html index ac72030b..93290e70 100644 --- a/functions_n.html +++ b/functions_n.html @@ -123,7 +123,7 @@

                            - n -

                              diff --git a/functions_o.html b/functions_o.html index 78ab747d..6c06e6c2 100644 --- a/functions_o.html +++ b/functions_o.html @@ -116,7 +116,7 @@

                              - o -

                                diff --git a/functions_p.html b/functions_p.html index 17c323d9..fb6c1f2d 100644 --- a/functions_p.html +++ b/functions_p.html @@ -113,7 +113,7 @@

                                - p -

                                  diff --git a/functions_q.html b/functions_q.html index 89267c91..33123319 100644 --- a/functions_q.html +++ b/functions_q.html @@ -98,7 +98,7 @@

                                  - q -

                                    diff --git a/functions_r.html b/functions_r.html index 8aaab226..f5aed683 100644 --- a/functions_r.html +++ b/functions_r.html @@ -114,7 +114,7 @@

                                    - r -

                                      diff --git a/functions_rela.html b/functions_rela.html index af0bdf9a..822c9686 100644 --- a/functions_rela.html +++ b/functions_rela.html @@ -93,7 +93,7 @@ diff --git a/functions_s.html b/functions_s.html index 2770880e..69fdd365 100644 --- a/functions_s.html +++ b/functions_s.html @@ -152,7 +152,7 @@

                                      - s -

                                        diff --git a/functions_t.html b/functions_t.html index 6e03c565..d89e881a 100644 --- a/functions_t.html +++ b/functions_t.html @@ -102,7 +102,7 @@

                                        - t -

                                          diff --git a/functions_u.html b/functions_u.html index da008e83..d525c57a 100644 --- a/functions_u.html +++ b/functions_u.html @@ -95,7 +95,7 @@

                                          - u -

                                            diff --git a/functions_v.html b/functions_v.html index 9837ef4f..d44aff07 100644 --- a/functions_v.html +++ b/functions_v.html @@ -95,7 +95,7 @@

                                            - v -

                                              diff --git a/functions_vars.html b/functions_vars.html index 7478bd08..ed596b60 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -360,7 +360,7 @@

                                              - z -

                                                diff --git a/functions_w.html b/functions_w.html index 1475e40e..d22f2908 100644 --- a/functions_w.html +++ b/functions_w.html @@ -98,7 +98,7 @@

                                                - w -

                                                  diff --git a/functions_x.html b/functions_x.html index 8e81817a..7687d5c9 100644 --- a/functions_x.html +++ b/functions_x.html @@ -111,7 +111,7 @@

                                                  - x -

                                                    diff --git a/functions_y.html b/functions_y.html index d5cb7efd..3b267f73 100644 --- a/functions_y.html +++ b/functions_y.html @@ -110,7 +110,7 @@

                                                    - y -

                                                      diff --git a/functions_z.html b/functions_z.html index 3fabddf6..eff29c18 100644 --- a/functions_z.html +++ b/functions_z.html @@ -95,7 +95,7 @@

                                                      - z -

                                                        diff --git a/functions_~.html b/functions_~.html index d740377f..ea031321 100644 --- a/functions_~.html +++ b/functions_~.html @@ -110,7 +110,7 @@

                                                        - ~ -

                                                          diff --git a/globals.html b/globals.html index b3dc91c2..25169fc0 100644 --- a/globals.html +++ b/globals.html @@ -115,7 +115,7 @@ diff --git a/globals_defs.html b/globals_defs.html index 3e32d25f..5187a85e 100644 --- a/globals_defs.html +++ b/globals_defs.html @@ -112,7 +112,7 @@ diff --git a/globals_func.html b/globals_func.html index 87330009..6c622419 100644 --- a/globals_func.html +++ b/globals_func.html @@ -93,7 +93,7 @@ diff --git a/graph_legend.html b/graph_legend.html index dddafafb..f88ee490 100644 --- a/graph_legend.html +++ b/graph_legend.html @@ -152,7 +152,7 @@ diff --git a/hierarchy.html b/hierarchy.html index 8bad5cc3..7f5c9715 100644 --- a/hierarchy.html +++ b/hierarchy.html @@ -143,7 +143,7 @@ diff --git a/index.html b/index.html index 23750635..11166c3b 100644 --- a/index.html +++ b/index.html @@ -111,7 +111,7 @@

                                                          diff --git a/inherits.html b/inherits.html index c3a1b78b..abaa9f9b 100644 --- a/inherits.html +++ b/inherits.html @@ -273,7 +273,7 @@ diff --git a/io_8cpp.html b/io_8cpp.html index 053095d8..8dd73b09 100644 --- a/io_8cpp.html +++ b/io_8cpp.html @@ -223,9 +223,9 @@ std::ostream & lost::operator<< (std::ostream &os, const Camera &camera)  Print information about the camera in machine and human-readable form. More...
                                                            -float lost::FocalLengthFromOptions (const PipelineOptions &values) - Calculate the focal length, in pixels, based on the given command line options. More...
                                                          -  +float lost::FocalLengthFromOptions (const PipelineOptions &values, int xResolution) + Calculate the focal length, in pixels, based on the given command line options. More...
                                                          +  PipelineInputList lost::GetPngPipelineInput (const PipelineOptions &values)  Create a PngPipelineInput using command line options. More...
                                                            @@ -336,7 +336,7 @@

                                                            - +
                                                          diff --git a/io_8cpp.js b/io_8cpp.js index 1cca8e55..83fe31fe 100644 --- a/io_8cpp.js +++ b/io_8cpp.js @@ -13,7 +13,7 @@ var io_8cpp = [ "CatalogRead", "io_8cpp.html#a41f5bb669129790c12bd70e1d641441f", null ], [ "CentroidComparisonsCombine", "io_8cpp.html#a0fe01051c958fa8ced02e772aefdc991", null ], [ "CentroidsCompare", "io_8cpp.html#afd017fba4090829c28c431509c4cfc1c", null ], - [ "FocalLengthFromOptions", "io_8cpp.html#a1187da9a83232a720a84bef1b99c5b58", null ], + [ "FocalLengthFromOptions", "io_8cpp.html#a9eaa81a9fc5f13a447e4209b5b230308", null ], [ "GenerateDatabases", "io_8cpp.html#ac0ac19dd0e9f2f1ce471617d9c837949", null ], [ "GetGeneratedPipelineInput", "io_8cpp.html#aec3a2012bf028c749ba53a46a50ad172", null ], [ "GetPipelineInput", "io_8cpp.html#ad01d904e4a6bf5aed4a1b8f97f1416c5", null ], diff --git a/io_8cpp_source.html b/io_8cpp_source.html index 0ecbc724..f3c95a81 100644 --- a/io_8cpp_source.html +++ b/io_8cpp_source.html @@ -380,7 +380,7 @@
                                                          304 
                                                          305 // PIPELINE INPUT STUFF
                                                          306 
                                                          - +
                                                          311 float FocalLengthFromOptions(const PipelineOptions &values, int xResolution) {
                                                          312  if ((values.pixelSize != -1) ^ (values.focalLength != 0)) {
                                                          313  std::cerr << "ERROR: Exactly one of --pixel-size or --focal-length were set." << std::endl;
                                                          314  exit(1);
                                                          @@ -393,7 +393,7 @@
                                                          321  }
                                                          322 
                                                          323  if (values.pixelSize == -1) {
                                                          -
                                                          324  return FovToFocalLength(DegToRad(values.fov), values.generateXRes);
                                                          +
                                                          324  return FovToFocalLength(DegToRad(values.fov), xResolution);
                                                          325  } else {
                                                          326  return values.focalLength * 1000 / values.pixelSize;
                                                          327  }
                                                          @@ -446,7 +446,7 @@
                                                          383 
                                                          384  int xResolution = cairo_image_surface_get_width(cairoSurface);
                                                          385  int yResolution = cairo_image_surface_get_height(cairoSurface);
                                                          -
                                                          386  float focalLengthPixels = FocalLengthFromOptions(values);
                                                          +
                                                          386  float focalLengthPixels = FocalLengthFromOptions(values, xResolution);
                                                          387  Camera cam = Camera(focalLengthPixels, xResolution, yResolution);
                                                          388 
                                                          389  result.push_back(std::unique_ptr<PipelineInput>(new PngPipelineInput(cairoSurface, cam, CatalogRead())));
                                                          @@ -779,1109 +779,1108 @@
                                                          748  DegToRad(values.generateBlurRoll)));
                                                          749  PipelineInputList result;
                                                          750 
                                                          -
                                                          751  float focalLength = FocalLengthFromOptions(values);
                                                          +
                                                          751  float focalLength = FocalLengthFromOptions(values, values.generateXRes);
                                                          752 
                                                          753 
                                                          -
                                                          754 
                                                          -
                                                          755  for (int i = 0; i < values.generate; i++) {
                                                          +
                                                          754  for (int i = 0; i < values.generate; i++) {
                                                          +
                                                          755 
                                                          756 
                                                          -
                                                          757 
                                                          -
                                                          758  Attitude inputAttitude;
                                                          -
                                                          759  if (values.generateRandomAttitudes) {
                                                          -
                                                          760  inputAttitude = RandomAttitude(&attitudeRng);
                                                          -
                                                          761  } else {
                                                          -
                                                          762  inputAttitude = attitude;
                                                          -
                                                          763  }
                                                          -
                                                          764 
                                                          - -
                                                          766  CatalogRead(),
                                                          -
                                                          767  inputAttitude,
                                                          -
                                                          768  Camera(focalLength, values.generateXRes, values.generateYRes),
                                                          -
                                                          769  &noiseRng,
                                                          -
                                                          770 
                                                          -
                                                          771  values.generateCentroidsOnly,
                                                          -
                                                          772  values.generateZeroMagPhotons,
                                                          -
                                                          773  values.generateSpreadStdDev,
                                                          -
                                                          774  values.generateSaturationPhotons,
                                                          -
                                                          775  values.generateDarkCurrent,
                                                          -
                                                          776  values.generateReadNoiseStdDev,
                                                          -
                                                          777  motionBlurDirection,
                                                          -
                                                          778  values.generateExposure,
                                                          -
                                                          779  values.generateReadoutTime,
                                                          -
                                                          780  values.generateShotNoise,
                                                          -
                                                          781  values.generateOversampling,
                                                          -
                                                          782  values.generateNumFalseStars,
                                                          -
                                                          783  (values.generateFalseMinMag * 100),
                                                          -
                                                          784  (values.generateFalseMaxMag * 100),
                                                          -
                                                          785  (values.generateCutoffMag * 100),
                                                          -
                                                          786  values.generatePerturbationStddev);
                                                          -
                                                          787 
                                                          -
                                                          788  result.push_back(std::unique_ptr<PipelineInput>(curr));
                                                          +
                                                          757  Attitude inputAttitude;
                                                          +
                                                          758  if (values.generateRandomAttitudes) {
                                                          +
                                                          759  inputAttitude = RandomAttitude(&attitudeRng);
                                                          +
                                                          760  } else {
                                                          +
                                                          761  inputAttitude = attitude;
                                                          +
                                                          762  }
                                                          +
                                                          763 
                                                          + +
                                                          765  CatalogRead(),
                                                          +
                                                          766  inputAttitude,
                                                          +
                                                          767  Camera(focalLength, values.generateXRes, values.generateYRes),
                                                          +
                                                          768  &noiseRng,
                                                          +
                                                          769 
                                                          +
                                                          770  values.generateCentroidsOnly,
                                                          +
                                                          771  values.generateZeroMagPhotons,
                                                          +
                                                          772  values.generateSpreadStdDev,
                                                          +
                                                          773  values.generateSaturationPhotons,
                                                          +
                                                          774  values.generateDarkCurrent,
                                                          +
                                                          775  values.generateReadNoiseStdDev,
                                                          +
                                                          776  motionBlurDirection,
                                                          +
                                                          777  values.generateExposure,
                                                          +
                                                          778  values.generateReadoutTime,
                                                          +
                                                          779  values.generateShotNoise,
                                                          +
                                                          780  values.generateOversampling,
                                                          +
                                                          781  values.generateNumFalseStars,
                                                          +
                                                          782  (values.generateFalseMinMag * 100),
                                                          +
                                                          783  (values.generateFalseMaxMag * 100),
                                                          +
                                                          784  (values.generateCutoffMag * 100),
                                                          +
                                                          785  values.generatePerturbationStddev);
                                                          +
                                                          786 
                                                          +
                                                          787  result.push_back(std::unique_ptr<PipelineInput>(curr));
                                                          +
                                                          788 
                                                          789 
                                                          -
                                                          790 
                                                          -
                                                          791  }
                                                          +
                                                          790  }
                                                          +
                                                          791 
                                                          792 
                                                          793 
                                                          -
                                                          794 
                                                          -
                                                          795  return result;
                                                          -
                                                          796 }
                                                          -
                                                          797 
                                                          - -
                                                          799 
                                                          - -
                                                          802 
                                                          -
                                                          803  if (values.png != "") {
                                                          -
                                                          804  return GetPngPipelineInput(values);
                                                          -
                                                          805  } else {
                                                          -
                                                          806  return GetGeneratedPipelineInput(values);
                                                          -
                                                          807  }
                                                          -
                                                          808 }
                                                          -
                                                          809 
                                                          - -
                                                          815  StarIdAlgorithm *starIdAlgorithm,
                                                          -
                                                          816  AttitudeEstimationAlgorithm *attitudeEstimationAlgorithm,
                                                          -
                                                          817  unsigned char *database)
                                                          -
                                                          818  : Pipeline() {
                                                          -
                                                          819  if (centroidAlgorithm) {
                                                          -
                                                          820  this->centroidAlgorithm = std::unique_ptr<CentroidAlgorithm>(centroidAlgorithm);
                                                          -
                                                          821  }
                                                          -
                                                          822  if (starIdAlgorithm) {
                                                          -
                                                          823  this->starIdAlgorithm = std::unique_ptr<StarIdAlgorithm>(starIdAlgorithm);
                                                          -
                                                          824  }
                                                          -
                                                          825  if (attitudeEstimationAlgorithm) {
                                                          -
                                                          826  this->attitudeEstimationAlgorithm = std::unique_ptr<AttitudeEstimationAlgorithm>(attitudeEstimationAlgorithm);
                                                          -
                                                          827  }
                                                          -
                                                          828  if (database) {
                                                          -
                                                          829  this->database = std::unique_ptr<unsigned char[]>(database);
                                                          -
                                                          830  }
                                                          -
                                                          831 }
                                                          +
                                                          794  return result;
                                                          +
                                                          795 }
                                                          +
                                                          796 
                                                          + +
                                                          798 
                                                          + +
                                                          801 
                                                          +
                                                          802  if (values.png != "") {
                                                          +
                                                          803  return GetPngPipelineInput(values);
                                                          +
                                                          804  } else {
                                                          +
                                                          805  return GetGeneratedPipelineInput(values);
                                                          +
                                                          806  }
                                                          +
                                                          807 }
                                                          +
                                                          808 
                                                          + +
                                                          814  StarIdAlgorithm *starIdAlgorithm,
                                                          +
                                                          815  AttitudeEstimationAlgorithm *attitudeEstimationAlgorithm,
                                                          +
                                                          816  unsigned char *database)
                                                          +
                                                          817  : Pipeline() {
                                                          +
                                                          818  if (centroidAlgorithm) {
                                                          +
                                                          819  this->centroidAlgorithm = std::unique_ptr<CentroidAlgorithm>(centroidAlgorithm);
                                                          +
                                                          820  }
                                                          +
                                                          821  if (starIdAlgorithm) {
                                                          +
                                                          822  this->starIdAlgorithm = std::unique_ptr<StarIdAlgorithm>(starIdAlgorithm);
                                                          +
                                                          823  }
                                                          +
                                                          824  if (attitudeEstimationAlgorithm) {
                                                          +
                                                          825  this->attitudeEstimationAlgorithm = std::unique_ptr<AttitudeEstimationAlgorithm>(attitudeEstimationAlgorithm);
                                                          +
                                                          826  }
                                                          +
                                                          827  if (database) {
                                                          +
                                                          828  this->database = std::unique_ptr<unsigned char[]>(database);
                                                          +
                                                          829  }
                                                          +
                                                          830 }
                                                          +
                                                          831 
                                                          832 
                                                          -
                                                          833 
                                                          - -
                                                          836  Pipeline result;
                                                          -
                                                          837 
                                                          -
                                                          838  // TODO: more flexible or sth
                                                          -
                                                          839  // TODO: don't allow setting star-id until database is set, and perhaps limit the star-id
                                                          -
                                                          840  // choices to those compatible with the database?
                                                          -
                                                          841 
                                                          -
                                                          842  // centroid algorithm stage
                                                          -
                                                          843  if (values.centroidAlgo == "dummy") {
                                                          -
                                                          844  result.centroidAlgorithm = std::unique_ptr<CentroidAlgorithm>(new DummyCentroidAlgorithm(values.centroidDummyNumStars));
                                                          -
                                                          845  } else if (values.centroidAlgo == "cog") {
                                                          -
                                                          846  result.centroidAlgorithm = std::unique_ptr<CentroidAlgorithm>(new CenterOfGravityAlgorithm());
                                                          -
                                                          847  } else if (values.centroidAlgo == "iwcog") {
                                                          -
                                                          848  result.centroidAlgorithm = std::unique_ptr<CentroidAlgorithm>(new IterativeWeightedCenterOfGravityAlgorithm());
                                                          -
                                                          849  } else if (values.centroidAlgo != "") {
                                                          -
                                                          850  std::cout << "Illegal centroid algorithm." << std::endl;
                                                          -
                                                          851  exit(1);
                                                          -
                                                          852  }
                                                          -
                                                          853 
                                                          -
                                                          854  // centroid magnitude filter stage
                                                          -
                                                          855  if (values.centroidMagFilter > 0) result.centroidMinMagnitude = values.centroidMagFilter;
                                                          -
                                                          856  if (values.centroidFilterBrightest > 0) result.centroidMinStars = values.centroidFilterBrightest;
                                                          -
                                                          857 
                                                          -
                                                          858  // database stage
                                                          -
                                                          859  if (values.databasePath != "") {
                                                          -
                                                          860  std::fstream fs;
                                                          -
                                                          861  fs.open(values.databasePath, std::fstream::in | std::fstream::binary);
                                                          -
                                                          862  fs.seekg(0, fs.end);
                                                          -
                                                          863  long length = fs.tellg();
                                                          -
                                                          864  fs.seekg(0, fs.beg);
                                                          -
                                                          865  std::cerr << "Reading " << length << " bytes of database" << std::endl;
                                                          -
                                                          866  result.database = std::unique_ptr<unsigned char[]>(new unsigned char[length]);
                                                          -
                                                          867  fs.read((char *)result.database.get(), length);
                                                          -
                                                          868  std::cerr << "Done" << std::endl;
                                                          -
                                                          869  }
                                                          -
                                                          870 
                                                          -
                                                          871  if (values.idAlgo == "dummy") {
                                                          -
                                                          872  result.starIdAlgorithm = std::unique_ptr<StarIdAlgorithm>(new DummyStarIdAlgorithm());
                                                          -
                                                          873  } else if (values.idAlgo == "gv") {
                                                          -
                                                          874  result.starIdAlgorithm = std::unique_ptr<StarIdAlgorithm>(new GeometricVotingStarIdAlgorithm(DegToRad(values.angularTolerance)));
                                                          -
                                                          875  } else if (values.idAlgo == "py") {
                                                          -
                                                          876  result.starIdAlgorithm = std::unique_ptr<StarIdAlgorithm>(new PyramidStarIdAlgorithm(DegToRad(values.angularTolerance), values.estimatedNumFalseStars, values.maxMismatchProb, 1000));
                                                          -
                                                          877  } else if (values.idAlgo != "") {
                                                          -
                                                          878  std::cout << "Illegal id algorithm." << std::endl;
                                                          -
                                                          879  exit(1);
                                                          -
                                                          880  }
                                                          -
                                                          881 
                                                          -
                                                          882  if (values.attitudeAlgo == "dqm") {
                                                          -
                                                          883  result.attitudeEstimationAlgorithm = std::unique_ptr<AttitudeEstimationAlgorithm>(new DavenportQAlgorithm());
                                                          -
                                                          884  } else if (values.attitudeAlgo == "triad") {
                                                          -
                                                          885  result.attitudeEstimationAlgorithm = std::unique_ptr<AttitudeEstimationAlgorithm>(new TriadAlgorithm());
                                                          -
                                                          886  } else if (values.attitudeAlgo == "quest") {
                                                          -
                                                          887  result.attitudeEstimationAlgorithm = std::unique_ptr<AttitudeEstimationAlgorithm>(new QuestAlgorithm());
                                                          -
                                                          888  } else if (values.attitudeAlgo != "") {
                                                          -
                                                          889  std::cout << "Illegal attitude algorithm." << std::endl;
                                                          -
                                                          890  exit(1);
                                                          -
                                                          891  }
                                                          -
                                                          892 
                                                          -
                                                          893  return result;
                                                          -
                                                          894 }
                                                          -
                                                          895 
                                                          - -
                                                          902  // Start executing the pipeline at the first stage that has both input and an algorithm. From
                                                          -
                                                          903  // there, execute each successive stage of the pipeline using the output of the last stage
                                                          -
                                                          904  // (human centipede) until there are no more stages set.
                                                          -
                                                          905  PipelineOutput result;
                                                          -
                                                          906 
                                                          -
                                                          907  const Image *inputImage = input.InputImage();
                                                          -
                                                          908  const Stars *inputStars = input.InputStars();
                                                          -
                                                          909  const StarIdentifiers *inputStarIds = input.InputStarIds();
                                                          -
                                                          910 
                                                          -
                                                          911  // if database is provided, that's where we get catalog from.
                                                          -
                                                          912  if (database) {
                                                          -
                                                          913  MultiDatabase multiDatabase(database.get());
                                                          -
                                                          914  const unsigned char *catalogBuffer = multiDatabase.SubDatabasePointer(kCatalogMagicValue);
                                                          -
                                                          915  if (catalogBuffer != NULL) {
                                                          -
                                                          916  DeserializeContext des(catalogBuffer);
                                                          -
                                                          917  result.catalog = DeserializeCatalog(&des, NULL, NULL);
                                                          -
                                                          918  } else {
                                                          -
                                                          919  std::cerr << "WARNING: That database does not include a catalog. Proceeding with the full catalog." << std::endl;
                                                          -
                                                          920  result.catalog = input.GetCatalog();
                                                          -
                                                          921  }
                                                          -
                                                          922  } else {
                                                          -
                                                          923  result.catalog = input.GetCatalog();
                                                          -
                                                          924  }
                                                          -
                                                          925 
                                                          -
                                                          926  if (centroidAlgorithm && inputImage) {
                                                          -
                                                          927 
                                                          -
                                                          928  // run centroiding, keeping track of the time it takes
                                                          -
                                                          929  std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();
                                                          -
                                                          930 
                                                          -
                                                          931  // TODO: we should probably modify Go to just take an image argument
                                                          -
                                                          932  Stars unfilteredStars = centroidAlgorithm->Go(inputImage->image, inputImage->width, inputImage->height);
                                                          -
                                                          933 
                                                          -
                                                          934  std::chrono::time_point<std::chrono::steady_clock> end = std::chrono::steady_clock::now();
                                                          -
                                                          935  result.centroidingTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
                                                          -
                                                          936 
                                                          -
                                                          937  // MAGNITUDE FILTERING
                                                          -
                                                          938  int minMagnitude = centroidMinMagnitude;
                                                          -
                                                          939  if (centroidMinStars > 0
                                                          -
                                                          940  // don't need to filter if we don't even have that many stars
                                                          -
                                                          941  && centroidMinStars < (int)unfilteredStars.size()) {
                                                          -
                                                          942 
                                                          -
                                                          943  Stars magSortedStars = unfilteredStars;
                                                          -
                                                          944  // sort descending
                                                          -
                                                          945  std::sort(magSortedStars.begin(), magSortedStars.end(), [](const Star &a, const Star &b) { return a.magnitude > b.magnitude; });
                                                          -
                                                          946  minMagnitude = std::max(minMagnitude, magSortedStars[centroidMinStars - 1].magnitude);
                                                          -
                                                          947  }
                                                          -
                                                          948  // determine the minimum magnitude according to sorted stars
                                                          -
                                                          949  Stars *filteredStars = new std::vector<Star>();
                                                          -
                                                          950  for (const Star &star : unfilteredStars) {
                                                          -
                                                          951  assert(star.magnitude >= 0); // catalog stars can have negative magnitude, but by our
                                                          -
                                                          952  // conventions, centroids shouldn't.
                                                          -
                                                          953  if (star.magnitude >= minMagnitude) {
                                                          -
                                                          954  filteredStars->push_back(star);
                                                          -
                                                          955  }
                                                          -
                                                          956  }
                                                          -
                                                          957  result.stars = std::unique_ptr<Stars>(filteredStars);
                                                          -
                                                          958  inputStars = filteredStars;
                                                          -
                                                          959 
                                                          -
                                                          960  // any starid set up to this point needs to be discarded, because it's based on input
                                                          -
                                                          961  // centroids instead of our new centroids.
                                                          -
                                                          962  inputStarIds = NULL;
                                                          -
                                                          963  result.starIds = NULL;
                                                          -
                                                          964  } else if (centroidAlgorithm) {
                                                          -
                                                          965  std::cerr << "ERROR: Centroid algorithm specified, but no input image to run it on." << std::endl;
                                                          -
                                                          966  exit(1);
                                                          -
                                                          967  }
                                                          -
                                                          968 
                                                          -
                                                          969  if (starIdAlgorithm && database && inputStars && input.InputCamera()) {
                                                          -
                                                          970  // TODO: don't copy the vector!
                                                          -
                                                          971  std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();
                                                          -
                                                          972 
                                                          -
                                                          973  result.starIds = std::unique_ptr<StarIdentifiers>(new std::vector<StarIdentifier>(
                                                          -
                                                          974  starIdAlgorithm->Go(database.get(), *inputStars, result.catalog, *input.InputCamera())));
                                                          -
                                                          975 
                                                          -
                                                          976  std::chrono::time_point<std::chrono::steady_clock> end = std::chrono::steady_clock::now();
                                                          -
                                                          977  result.starIdTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
                                                          -
                                                          978 
                                                          -
                                                          979  inputStarIds = result.starIds.get();
                                                          -
                                                          980  } else if (starIdAlgorithm) {
                                                          -
                                                          981  std::cerr << "ERROR: Star ID algorithm specified but cannot run because database, centroids, or camera are missing." << std::endl;
                                                          -
                                                          982  exit(1);
                                                          -
                                                          983  }
                                                          -
                                                          984 
                                                          -
                                                          985  if (attitudeEstimationAlgorithm && inputStarIds && input.InputCamera()) {
                                                          -
                                                          986  assert(inputStars); // ensure that starIds doesn't exist without stars
                                                          -
                                                          987  std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();
                                                          -
                                                          988 
                                                          -
                                                          989  result.attitude = std::unique_ptr<Attitude>(
                                                          -
                                                          990  new Attitude(attitudeEstimationAlgorithm->Go(*input.InputCamera(), *inputStars, result.catalog, *inputStarIds)));
                                                          -
                                                          991 
                                                          -
                                                          992  std::chrono::time_point<std::chrono::steady_clock> end = std::chrono::steady_clock::now();
                                                          -
                                                          993  result.attitudeEstimationTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
                                                          -
                                                          994  } else if (attitudeEstimationAlgorithm) {
                                                          -
                                                          995  std::cerr << "ERROR: Attitude estimation algorithm set, but either star IDs or camera are missing. One reason this can happen: Setting a centroid algorithm and attitude algorithm, but no star-id algorithm -- that can't work because the input star-ids won't properly correspond to the output centroids!" << std::endl;
                                                          -
                                                          996  exit(1);
                                                          -
                                                          997  }
                                                          -
                                                          998 
                                                          -
                                                          999  return result;
                                                          -
                                                          1000 }
                                                          -
                                                          1001 
                                                          -
                                                          1003 std::vector<PipelineOutput> Pipeline::Go(const PipelineInputList &inputs) {
                                                          -
                                                          1004  std::vector<PipelineOutput> result;
                                                          + +
                                                          835  Pipeline result;
                                                          +
                                                          836 
                                                          +
                                                          837  // TODO: more flexible or sth
                                                          +
                                                          838  // TODO: don't allow setting star-id until database is set, and perhaps limit the star-id
                                                          +
                                                          839  // choices to those compatible with the database?
                                                          +
                                                          840 
                                                          +
                                                          841  // centroid algorithm stage
                                                          +
                                                          842  if (values.centroidAlgo == "dummy") {
                                                          +
                                                          843  result.centroidAlgorithm = std::unique_ptr<CentroidAlgorithm>(new DummyCentroidAlgorithm(values.centroidDummyNumStars));
                                                          +
                                                          844  } else if (values.centroidAlgo == "cog") {
                                                          +
                                                          845  result.centroidAlgorithm = std::unique_ptr<CentroidAlgorithm>(new CenterOfGravityAlgorithm());
                                                          +
                                                          846  } else if (values.centroidAlgo == "iwcog") {
                                                          +
                                                          847  result.centroidAlgorithm = std::unique_ptr<CentroidAlgorithm>(new IterativeWeightedCenterOfGravityAlgorithm());
                                                          +
                                                          848  } else if (values.centroidAlgo != "") {
                                                          +
                                                          849  std::cout << "Illegal centroid algorithm." << std::endl;
                                                          +
                                                          850  exit(1);
                                                          +
                                                          851  }
                                                          +
                                                          852 
                                                          +
                                                          853  // centroid magnitude filter stage
                                                          +
                                                          854  if (values.centroidMagFilter > 0) result.centroidMinMagnitude = values.centroidMagFilter;
                                                          +
                                                          855  if (values.centroidFilterBrightest > 0) result.centroidMinStars = values.centroidFilterBrightest;
                                                          +
                                                          856 
                                                          +
                                                          857  // database stage
                                                          +
                                                          858  if (values.databasePath != "") {
                                                          +
                                                          859  std::fstream fs;
                                                          +
                                                          860  fs.open(values.databasePath, std::fstream::in | std::fstream::binary);
                                                          +
                                                          861  fs.seekg(0, fs.end);
                                                          +
                                                          862  long length = fs.tellg();
                                                          +
                                                          863  fs.seekg(0, fs.beg);
                                                          +
                                                          864  std::cerr << "Reading " << length << " bytes of database" << std::endl;
                                                          +
                                                          865  result.database = std::unique_ptr<unsigned char[]>(new unsigned char[length]);
                                                          +
                                                          866  fs.read((char *)result.database.get(), length);
                                                          +
                                                          867  std::cerr << "Done" << std::endl;
                                                          +
                                                          868  }
                                                          +
                                                          869 
                                                          +
                                                          870  if (values.idAlgo == "dummy") {
                                                          +
                                                          871  result.starIdAlgorithm = std::unique_ptr<StarIdAlgorithm>(new DummyStarIdAlgorithm());
                                                          +
                                                          872  } else if (values.idAlgo == "gv") {
                                                          +
                                                          873  result.starIdAlgorithm = std::unique_ptr<StarIdAlgorithm>(new GeometricVotingStarIdAlgorithm(DegToRad(values.angularTolerance)));
                                                          +
                                                          874  } else if (values.idAlgo == "py") {
                                                          +
                                                          875  result.starIdAlgorithm = std::unique_ptr<StarIdAlgorithm>(new PyramidStarIdAlgorithm(DegToRad(values.angularTolerance), values.estimatedNumFalseStars, values.maxMismatchProb, 1000));
                                                          +
                                                          876  } else if (values.idAlgo != "") {
                                                          +
                                                          877  std::cout << "Illegal id algorithm." << std::endl;
                                                          +
                                                          878  exit(1);
                                                          +
                                                          879  }
                                                          +
                                                          880 
                                                          +
                                                          881  if (values.attitudeAlgo == "dqm") {
                                                          +
                                                          882  result.attitudeEstimationAlgorithm = std::unique_ptr<AttitudeEstimationAlgorithm>(new DavenportQAlgorithm());
                                                          +
                                                          883  } else if (values.attitudeAlgo == "triad") {
                                                          +
                                                          884  result.attitudeEstimationAlgorithm = std::unique_ptr<AttitudeEstimationAlgorithm>(new TriadAlgorithm());
                                                          +
                                                          885  } else if (values.attitudeAlgo == "quest") {
                                                          +
                                                          886  result.attitudeEstimationAlgorithm = std::unique_ptr<AttitudeEstimationAlgorithm>(new QuestAlgorithm());
                                                          +
                                                          887  } else if (values.attitudeAlgo != "") {
                                                          +
                                                          888  std::cout << "Illegal attitude algorithm." << std::endl;
                                                          +
                                                          889  exit(1);
                                                          +
                                                          890  }
                                                          +
                                                          891 
                                                          +
                                                          892  return result;
                                                          +
                                                          893 }
                                                          +
                                                          894 
                                                          + +
                                                          901  // Start executing the pipeline at the first stage that has both input and an algorithm. From
                                                          +
                                                          902  // there, execute each successive stage of the pipeline using the output of the last stage
                                                          +
                                                          903  // (human centipede) until there are no more stages set.
                                                          +
                                                          904  PipelineOutput result;
                                                          +
                                                          905 
                                                          +
                                                          906  const Image *inputImage = input.InputImage();
                                                          +
                                                          907  const Stars *inputStars = input.InputStars();
                                                          +
                                                          908  const StarIdentifiers *inputStarIds = input.InputStarIds();
                                                          +
                                                          909 
                                                          +
                                                          910  // if database is provided, that's where we get catalog from.
                                                          +
                                                          911  if (database) {
                                                          +
                                                          912  MultiDatabase multiDatabase(database.get());
                                                          +
                                                          913  const unsigned char *catalogBuffer = multiDatabase.SubDatabasePointer(kCatalogMagicValue);
                                                          +
                                                          914  if (catalogBuffer != NULL) {
                                                          +
                                                          915  DeserializeContext des(catalogBuffer);
                                                          +
                                                          916  result.catalog = DeserializeCatalog(&des, NULL, NULL);
                                                          +
                                                          917  } else {
                                                          +
                                                          918  std::cerr << "WARNING: That database does not include a catalog. Proceeding with the full catalog." << std::endl;
                                                          +
                                                          919  result.catalog = input.GetCatalog();
                                                          +
                                                          920  }
                                                          +
                                                          921  } else {
                                                          +
                                                          922  result.catalog = input.GetCatalog();
                                                          +
                                                          923  }
                                                          +
                                                          924 
                                                          +
                                                          925  if (centroidAlgorithm && inputImage) {
                                                          +
                                                          926 
                                                          +
                                                          927  // run centroiding, keeping track of the time it takes
                                                          +
                                                          928  std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();
                                                          +
                                                          929 
                                                          +
                                                          930  // TODO: we should probably modify Go to just take an image argument
                                                          +
                                                          931  Stars unfilteredStars = centroidAlgorithm->Go(inputImage->image, inputImage->width, inputImage->height);
                                                          +
                                                          932 
                                                          +
                                                          933  std::chrono::time_point<std::chrono::steady_clock> end = std::chrono::steady_clock::now();
                                                          +
                                                          934  result.centroidingTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
                                                          +
                                                          935 
                                                          +
                                                          936  // MAGNITUDE FILTERING
                                                          +
                                                          937  int minMagnitude = centroidMinMagnitude;
                                                          +
                                                          938  if (centroidMinStars > 0
                                                          +
                                                          939  // don't need to filter if we don't even have that many stars
                                                          +
                                                          940  && centroidMinStars < (int)unfilteredStars.size()) {
                                                          +
                                                          941 
                                                          +
                                                          942  Stars magSortedStars = unfilteredStars;
                                                          +
                                                          943  // sort descending
                                                          +
                                                          944  std::sort(magSortedStars.begin(), magSortedStars.end(), [](const Star &a, const Star &b) { return a.magnitude > b.magnitude; });
                                                          +
                                                          945  minMagnitude = std::max(minMagnitude, magSortedStars[centroidMinStars - 1].magnitude);
                                                          +
                                                          946  }
                                                          +
                                                          947  // determine the minimum magnitude according to sorted stars
                                                          +
                                                          948  Stars *filteredStars = new std::vector<Star>();
                                                          +
                                                          949  for (const Star &star : unfilteredStars) {
                                                          +
                                                          950  assert(star.magnitude >= 0); // catalog stars can have negative magnitude, but by our
                                                          +
                                                          951  // conventions, centroids shouldn't.
                                                          +
                                                          952  if (star.magnitude >= minMagnitude) {
                                                          +
                                                          953  filteredStars->push_back(star);
                                                          +
                                                          954  }
                                                          +
                                                          955  }
                                                          +
                                                          956  result.stars = std::unique_ptr<Stars>(filteredStars);
                                                          +
                                                          957  inputStars = filteredStars;
                                                          +
                                                          958 
                                                          +
                                                          959  // any starid set up to this point needs to be discarded, because it's based on input
                                                          +
                                                          960  // centroids instead of our new centroids.
                                                          +
                                                          961  inputStarIds = NULL;
                                                          +
                                                          962  result.starIds = NULL;
                                                          +
                                                          963  } else if (centroidAlgorithm) {
                                                          +
                                                          964  std::cerr << "ERROR: Centroid algorithm specified, but no input image to run it on." << std::endl;
                                                          +
                                                          965  exit(1);
                                                          +
                                                          966  }
                                                          +
                                                          967 
                                                          +
                                                          968  if (starIdAlgorithm && database && inputStars && input.InputCamera()) {
                                                          +
                                                          969  // TODO: don't copy the vector!
                                                          +
                                                          970  std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();
                                                          +
                                                          971 
                                                          +
                                                          972  result.starIds = std::unique_ptr<StarIdentifiers>(new std::vector<StarIdentifier>(
                                                          +
                                                          973  starIdAlgorithm->Go(database.get(), *inputStars, result.catalog, *input.InputCamera())));
                                                          +
                                                          974 
                                                          +
                                                          975  std::chrono::time_point<std::chrono::steady_clock> end = std::chrono::steady_clock::now();
                                                          +
                                                          976  result.starIdTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
                                                          +
                                                          977 
                                                          +
                                                          978  inputStarIds = result.starIds.get();
                                                          +
                                                          979  } else if (starIdAlgorithm) {
                                                          +
                                                          980  std::cerr << "ERROR: Star ID algorithm specified but cannot run because database, centroids, or camera are missing." << std::endl;
                                                          +
                                                          981  exit(1);
                                                          +
                                                          982  }
                                                          +
                                                          983 
                                                          +
                                                          984  if (attitudeEstimationAlgorithm && inputStarIds && input.InputCamera()) {
                                                          +
                                                          985  assert(inputStars); // ensure that starIds doesn't exist without stars
                                                          +
                                                          986  std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();
                                                          +
                                                          987 
                                                          +
                                                          988  result.attitude = std::unique_ptr<Attitude>(
                                                          +
                                                          989  new Attitude(attitudeEstimationAlgorithm->Go(*input.InputCamera(), *inputStars, result.catalog, *inputStarIds)));
                                                          +
                                                          990 
                                                          +
                                                          991  std::chrono::time_point<std::chrono::steady_clock> end = std::chrono::steady_clock::now();
                                                          +
                                                          992  result.attitudeEstimationTimeNs = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
                                                          +
                                                          993  } else if (attitudeEstimationAlgorithm) {
                                                          +
                                                          994  std::cerr << "ERROR: Attitude estimation algorithm set, but either star IDs or camera are missing. One reason this can happen: Setting a centroid algorithm and attitude algorithm, but no star-id algorithm -- that can't work because the input star-ids won't properly correspond to the output centroids!" << std::endl;
                                                          +
                                                          995  exit(1);
                                                          +
                                                          996  }
                                                          +
                                                          997 
                                                          +
                                                          998  return result;
                                                          +
                                                          999 }
                                                          +
                                                          1000 
                                                          +
                                                          1002 std::vector<PipelineOutput> Pipeline::Go(const PipelineInputList &inputs) {
                                                          +
                                                          1003  std::vector<PipelineOutput> result;
                                                          +
                                                          1004 
                                                          1005 
                                                          -
                                                          1006 
                                                          -
                                                          1007  for (const std::unique_ptr<PipelineInput> &input : inputs) {
                                                          -
                                                          1008  result.push_back(Go(*input));
                                                          -
                                                          1009  }
                                                          -
                                                          1010 
                                                          -
                                                          1011  return result;
                                                          -
                                                          1012 }
                                                          -
                                                          1013 
                                                          -
                                                          1015 // COMPARISON //
                                                          -
                                                          1017 
                                                          - -
                                                          1023 public:
                                                          - -
                                                          1029  float meanError;
                                                          -
                                                          1030 
                                                          - -
                                                          1035 
                                                          - -
                                                          1041 
                                                          -
                                                          1042  // We no longer have a num missing because often generated stars have too low of a signal-to-noise ratio and the centroid algo won't pick them up.
                                                          -
                                                          1043 };
                                                          -
                                                          1044 
                                                          -
                                                          1049 static std::multimap<int, int> FindClosestCentroids(float threshold,
                                                          -
                                                          1050  const Stars &one,
                                                          -
                                                          1051  const Stars &two) {
                                                          -
                                                          1052  std::multimap<int, int> result;
                                                          -
                                                          1053 
                                                          -
                                                          1054  for (int i = 0; i < (int)one.size(); i++) {
                                                          -
                                                          1055  std::vector<std::pair<float, int>> closest;
                                                          -
                                                          1056  for (int k = 0; k < (int)two.size(); k++) {
                                                          -
                                                          1057  float currDistance = (one[i].position - two[k].position).Magnitude();
                                                          -
                                                          1058  if (currDistance <= threshold) {
                                                          -
                                                          1059  closest.emplace_back(currDistance, k);
                                                          -
                                                          1060  }
                                                          -
                                                          1061  }
                                                          -
                                                          1062  std::sort(closest.begin(), closest.end());
                                                          -
                                                          1063  for (const std::pair<float, int> &pair : closest) {
                                                          -
                                                          1064  result.emplace(i, pair.second);
                                                          -
                                                          1065  }
                                                          -
                                                          1066  }
                                                          -
                                                          1067 
                                                          -
                                                          1068  return result;
                                                          -
                                                          1069 }
                                                          -
                                                          1070 
                                                          - -
                                                          1077  const Stars &expected,
                                                          -
                                                          1078  const Stars &actual) {
                                                          -
                                                          1079 
                                                          -
                                                          1080  // TODO: Somehow penalize when multiple centroids correspond to the same expected star (i.e.,
                                                          -
                                                          1081  // one star turned into multiple centroids). That should probably be considered an extra
                                                          -
                                                          1082  // centroid, but rn it isn't.
                                                          -
                                                          1083 
                                                          -
                                                          1084  CentroidComparison result;
                                                          -
                                                          1085  // maps from indexes in each list to the closest centroid from other list
                                                          -
                                                          1086  std::multimap<int, int> actualToExpected = FindClosestCentroids(threshold, actual, expected);
                                                          -
                                                          1087 
                                                          -
                                                          1088  for (int i = 0; i < (int)actualToExpected.size(); i++) {
                                                          -
                                                          1089  auto closest = actualToExpected.find(i);
                                                          -
                                                          1090  if (closest == actualToExpected.end()) {
                                                          -
                                                          1091  result.numExtraCentroids++;
                                                          -
                                                          1092  } else {
                                                          -
                                                          1093  result.meanError += (actual[i].position - expected[closest->second].position).Magnitude();
                                                          -
                                                          1094  result.numCorrectCentroids++;
                                                          -
                                                          1095  }
                                                          -
                                                          1096  }
                                                          -
                                                          1097  result.meanError /= result.numCorrectCentroids;
                                                          -
                                                          1098 
                                                          -
                                                          1099  return result;
                                                          -
                                                          1100 }
                                                          -
                                                          1101 
                                                          -
                                                          1102 CentroidComparison CentroidComparisonsCombine(std::vector<CentroidComparison> comparisons) {
                                                          -
                                                          1103  assert(comparisons.size() > 0);
                                                          -
                                                          1104 
                                                          -
                                                          1105  CentroidComparison result;
                                                          -
                                                          1106 
                                                          -
                                                          1107  for (const CentroidComparison &comparison : comparisons) {
                                                          -
                                                          1108  result.meanError += comparison.meanError;
                                                          -
                                                          1109  result.numCorrectCentroids += comparison.numCorrectCentroids;
                                                          -
                                                          1110  result.numExtraCentroids += comparison.numExtraCentroids;
                                                          -
                                                          1111  }
                                                          -
                                                          1112 
                                                          -
                                                          1113  result.meanError /= comparisons.size();
                                                          -
                                                          1114  result.numExtraCentroids /= comparisons.size();
                                                          -
                                                          1115  result.numCorrectCentroids /= comparisons.size();
                                                          -
                                                          1116 
                                                          -
                                                          1117  return result;
                                                          -
                                                          1118 }
                                                          -
                                                          1119 
                                                          -
                                                          1120 // (documentation in hpp)
                                                          - -
                                                          1122  // use these to map indices to names for the respective lists of StarIdentifiers
                                                          -
                                                          1123  const Catalog &expectedCatalog, const Catalog &actualCatalog,
                                                          -
                                                          1124  float centroidThreshold,
                                                          -
                                                          1125  const Stars &expectedStars, const Stars &inputStars) {
                                                          -
                                                          1126 
                                                          -
                                                          1127  StarIdComparison result = {
                                                          -
                                                          1128  0, // correct
                                                          -
                                                          1129  0, // incorrect
                                                          -
                                                          1130  0, // total
                                                          -
                                                          1131  };
                                                          -
                                                          1132 
                                                          -
                                                          1133  // EXPECTED STAR IDS
                                                          -
                                                          1134 
                                                          -
                                                          1135  // map from expected star indices to expected catalog indices (basically flattening the expected star-ids)
                                                          -
                                                          1136  std::vector<int> expectedCatalogIndices(expectedStars.size(), -1);
                                                          -
                                                          1137  for (const StarIdentifier &starId : expected) {
                                                          -
                                                          1138  assert(0 <= starId.starIndex && starId.starIndex <= (int)expectedStars.size());
                                                          -
                                                          1139  assert(0 <= starId.catalogIndex && starId.catalogIndex <= (int)expectedCatalog.size());
                                                          -
                                                          1140  expectedCatalogIndices[starId.starIndex] = starId.catalogIndex;
                                                          -
                                                          1141  }
                                                          -
                                                          1142 
                                                          -
                                                          1143  // FIND NEAREST CENTROIDS
                                                          -
                                                          1144 
                                                          -
                                                          1145  std::multimap<int, int> inputToExpectedCentroids = FindClosestCentroids(centroidThreshold, inputStars, expectedStars);
                                                          -
                                                          1146  // std::multimap<int, int> expectedToInputCentroids = FindClosestCentroids(centroidThreshold, expectedStars, inputStars);
                                                          -
                                                          1147 
                                                          -
                                                          1148  // COMPUTE TOTAL
                                                          -
                                                          1149  // Count the number of expected stars with at least one input star near them
                                                          -
                                                          1150  for (int i = 0; i < (int)inputStars.size(); i++) {
                                                          -
                                                          1151  // make sure there's at least one expected star near this input star which has an identification
                                                          -
                                                          1152  auto closestRange = inputToExpectedCentroids.equal_range(i);
                                                          -
                                                          1153  bool found = false;
                                                          -
                                                          1154  for (auto it = closestRange.first; it != closestRange.second; it++) {
                                                          -
                                                          1155  if (expectedCatalogIndices[it->second] != -1) {
                                                          -
                                                          1156  found = true;
                                                          -
                                                          1157  break;
                                                          -
                                                          1158  }
                                                          -
                                                          1159  }
                                                          -
                                                          1160  if (found) {
                                                          -
                                                          1161  result.numTotal++;
                                                          -
                                                          1162  }
                                                          -
                                                          1163  }
                                                          -
                                                          1164 
                                                          -
                                                          1165  // COMPUTE CORRECT AND INCORRECT
                                                          -
                                                          1166 
                                                          -
                                                          1167  std::vector<bool> identifiedInputCentroids(inputStars.size(), false);
                                                          -
                                                          1168  for (const StarIdentifier &starId : actual) {
                                                          -
                                                          1169  // as later, there shouldn't be duplicate starIndex. This indicates a bug in the star-id algorithm, not comparison code.
                                                          -
                                                          1170  assert(!identifiedInputCentroids[starId.starIndex]);
                                                          -
                                                          1171  identifiedInputCentroids[starId.starIndex] = true;
                                                          -
                                                          1172  assert(0 <= starId.starIndex && starId.starIndex <= (int)inputStars.size());
                                                          -
                                                          1173  assert(0 <= starId.catalogIndex && starId.catalogIndex <= (int)actualCatalog.size());
                                                          -
                                                          1174 
                                                          -
                                                          1175  // Check that there's at least one expected centroid in range which agrees with your identification.
                                                          -
                                                          1176  auto expectedCentroidsInRange = inputToExpectedCentroids.equal_range(starId.starIndex);
                                                          -
                                                          1177  bool found = false;
                                                          -
                                                          1178  for (auto it = expectedCentroidsInRange.first; it != expectedCentroidsInRange.second; it++) {
                                                          -
                                                          1179  int expectedCatalogIndex = expectedCatalogIndices[it->second];
                                                          -
                                                          1180  if (expectedCatalogIndex != -1
                                                          -
                                                          1181  && expectedCatalog[expectedCatalogIndex].name == actualCatalog[starId.catalogIndex].name) {
                                                          -
                                                          1182 
                                                          -
                                                          1183  result.numCorrect++;
                                                          -
                                                          1184  found = true;
                                                          -
                                                          1185  break;
                                                          -
                                                          1186  }
                                                          -
                                                          1187  }
                                                          -
                                                          1188 
                                                          -
                                                          1189  // Either there's no expected centroid in range, or none of them agree with the identification.
                                                          -
                                                          1190  if (!found) {
                                                          -
                                                          1191  result.numIncorrect++;
                                                          -
                                                          1192  }
                                                          -
                                                          1193  }
                                                          -
                                                          1194 
                                                          -
                                                          1195  return result;
                                                          -
                                                          1196 }
                                                          -
                                                          1197 
                                                          -
                                                          1199 // PIPELINE OUTPUT //
                                                          -
                                                          1201 
                                                          -
                                                          1202 typedef void (*PipelineComparator)(std::ostream &os,
                                                          -
                                                          1203  const PipelineInputList &,
                                                          -
                                                          1204  const std::vector<PipelineOutput> &,
                                                          -
                                                          1205  const PipelineOptions &);
                                                          -
                                                          1206 
                                                          -
                                                          1208 static cairo_status_t OstreamPlotter(void *closure, const unsigned char *data, unsigned int length) {
                                                          -
                                                          1209  std::ostream *os = (std::ostream *)closure;
                                                          -
                                                          1210  os->write((const char *)data, length);
                                                          -
                                                          1211  return CAIRO_STATUS_SUCCESS;
                                                          -
                                                          1212 }
                                                          -
                                                          1213 
                                                          -
                                                          1215 static void PipelineComparatorPlotRawInput(std::ostream &os,
                                                          -
                                                          1216  const PipelineInputList &expected,
                                                          -
                                                          1217  const std::vector<PipelineOutput> &,
                                                          -
                                                          1218  const PipelineOptions &) {
                                                          -
                                                          1219 
                                                          -
                                                          1220  cairo_surface_t *cairoSurface = expected[0]->InputImageSurface();
                                                          -
                                                          1221  cairo_surface_write_to_png_stream(cairoSurface, OstreamPlotter, &os);
                                                          -
                                                          1222  cairo_surface_destroy(cairoSurface);
                                                          -
                                                          1223 }
                                                          -
                                                          1224 
                                                          -
                                                          1226 // TODO: should probably use Expected methods, not Input methods, because future PipelineInputs could add noise to the result of the Input methods.
                                                          -
                                                          1227 static void PipelineComparatorPlotInput(std::ostream &os,
                                                          -
                                                          1228  const PipelineInputList &expected,
                                                          -
                                                          1229  const std::vector<PipelineOutput> &,
                                                          -
                                                          1230  const PipelineOptions &) {
                                                          -
                                                          1231  cairo_surface_t *cairoSurface = expected[0]->InputImageSurface();
                                                          -
                                                          1232  assert(expected[0]->InputStars() != NULL);
                                                          -
                                                          1233  SurfacePlot("pipeline input",
                                                          -
                                                          1234  cairoSurface,
                                                          -
                                                          1235  *expected[0]->InputStars(),
                                                          -
                                                          1236  expected[0]->InputStarIds(),
                                                          -
                                                          1237  &expected[0]->GetCatalog(),
                                                          -
                                                          1238  expected[0]->InputAttitude(),
                                                          -
                                                          1239  // green
                                                          -
                                                          1240  0.0, 1.0, 0.0, 0.6);
                                                          -
                                                          1241  cairo_surface_write_to_png_stream(cairoSurface, OstreamPlotter, &os);
                                                          -
                                                          1242  cairo_surface_destroy(cairoSurface);
                                                          -
                                                          1243 }
                                                          -
                                                          1244 
                                                          -
                                                          1245 static void PipelineComparatorPlotExpected(std::ostream &os,
                                                          -
                                                          1246  const PipelineInputList &expected,
                                                          -
                                                          1247  const std::vector<PipelineOutput> &,
                                                          -
                                                          1248  const PipelineOptions &) {
                                                          -
                                                          1249  cairo_surface_t *cairoSurface = expected[0]->InputImageSurface();
                                                          -
                                                          1250  assert(expected[0]->ExpectedStars() != NULL);
                                                          -
                                                          1251  SurfacePlot("expected output",
                                                          -
                                                          1252  cairoSurface,
                                                          -
                                                          1253  *expected[0]->ExpectedStars(),
                                                          -
                                                          1254  expected[0]->ExpectedStarIds(),
                                                          -
                                                          1255  &expected[0]->GetCatalog(),
                                                          -
                                                          1256  expected[0]->ExpectedAttitude(),
                                                          -
                                                          1257  // blu
                                                          -
                                                          1258  0.2, 0.5, 1.0, 0.7);
                                                          -
                                                          1259  cairo_surface_write_to_png_stream(cairoSurface, OstreamPlotter, &os);
                                                          -
                                                          1260  cairo_surface_destroy(cairoSurface);
                                                          -
                                                          1261 }
                                                          -
                                                          1262 
                                                          -
                                                          1264 static void PipelineComparatorCentroids(std::ostream &os,
                                                          -
                                                          1265  const PipelineInputList &expected,
                                                          -
                                                          1266  const std::vector<PipelineOutput> &actual,
                                                          -
                                                          1267  const PipelineOptions &values) {
                                                          -
                                                          1268  int size = (int)expected.size();
                                                          -
                                                          1269 
                                                          -
                                                          1270  float threshold = values.centroidCompareThreshold;
                                                          -
                                                          1271 
                                                          -
                                                          1272  std::vector<CentroidComparison> comparisons;
                                                          -
                                                          1273  for (int i = 0; i < size; i++) {
                                                          -
                                                          1274  comparisons.push_back(CentroidsCompare(threshold,
                                                          -
                                                          1275  *(expected[i]->ExpectedStars()),
                                                          -
                                                          1276  *(actual[i].stars)));
                                                          -
                                                          1277  }
                                                          -
                                                          1278 
                                                          -
                                                          1279  CentroidComparison result = CentroidComparisonsCombine(comparisons);
                                                          -
                                                          1280  os << "centroids_num_correct " << result.numCorrectCentroids << std::endl
                                                          -
                                                          1281  << "centroids_num_extra " << result.numExtraCentroids << std::endl
                                                          -
                                                          1282  << "centroids_mean_error " << result.meanError << std::endl;
                                                          -
                                                          1283 }
                                                          -
                                                          1284 
                                                          -
                                                          1285 static void PrintCentroids(const std::string &prefix,
                                                          -
                                                          1286  std::ostream &os,
                                                          -
                                                          1287  const Catalog &catalog,
                                                          -
                                                          1288  const std::vector<Stars> &starses,
                                                          -
                                                          1289  // May be NULL. Should be the only the first starId, because we don't have any reasonable aggregative action to perform.
                                                          -
                                                          1290  const StarIdentifiers *starIds) {
                                                          -
                                                          1291  assert(starses.size() > 0);
                                                          -
                                                          1292  float avgNumStars = 0;
                                                          -
                                                          1293  for (const Stars &stars : starses) {
                                                          -
                                                          1294  avgNumStars += stars.size();
                                                          -
                                                          1295  }
                                                          -
                                                          1296  avgNumStars /= starses.size();
                                                          -
                                                          1297 
                                                          -
                                                          1298  os << "num_" << prefix << "_centroids " << avgNumStars << std::endl;
                                                          -
                                                          1299  if (starses.size() == 1) {
                                                          -
                                                          1300  const Stars &stars = starses[0];
                                                          -
                                                          1301  for (int i = 0; i < (int)stars.size(); i++) {
                                                          -
                                                          1302  os << prefix << "_centroid_" << i << "_x " << stars[i].position.x << std::endl;
                                                          -
                                                          1303  os << prefix << "_centroid_" << i << "_y " << stars[i].position.y << std::endl;
                                                          -
                                                          1304  if (starIds) {
                                                          -
                                                          1305  for (const StarIdentifier &starId : *starIds) {
                                                          -
                                                          1306  if (starId.starIndex == i) {
                                                          -
                                                          1307  os << prefix << "_centroid_" << i << "_id " << catalog[starId.catalogIndex].name << std::endl;
                                                          -
                                                          1308  }
                                                          -
                                                          1309  }
                                                          -
                                                          1310  }
                                                          -
                                                          1311  }
                                                          -
                                                          1312  }
                                                          -
                                                          1313 }
                                                          -
                                                          1314 
                                                          -
                                                          1316 static void PipelineComparatorPrintExpectedCentroids(std::ostream &os,
                                                          -
                                                          1317  const PipelineInputList &expected,
                                                          -
                                                          1318  const std::vector<PipelineOutput> &, // actual
                                                          -
                                                          1319  const PipelineOptions &) {
                                                          -
                                                          1320  assert(expected.size() > 0);
                                                          -
                                                          1321  assert(expected[0]->ExpectedStars());
                                                          -
                                                          1322 
                                                          -
                                                          1323  std::vector<Stars> expectedStarses;
                                                          -
                                                          1324  for (const auto &input : expected) {
                                                          -
                                                          1325  expectedStarses.push_back(*input->ExpectedStars());
                                                          -
                                                          1326  }
                                                          -
                                                          1327  PrintCentroids("expected",
                                                          -
                                                          1328  os,
                                                          -
                                                          1329  expected[0]->GetCatalog(),
                                                          -
                                                          1330  expectedStarses,
                                                          -
                                                          1331  expected[0]->ExpectedStarIds());
                                                          -
                                                          1332 }
                                                          -
                                                          1333 
                                                          -
                                                          1334 static void PipelineComparatorPrintInputCentroids(std::ostream &os,
                                                          -
                                                          1335  const PipelineInputList &expected,
                                                          -
                                                          1336  const std::vector<PipelineOutput> &, // actual
                                                          -
                                                          1337  const PipelineOptions &) {
                                                          -
                                                          1338  assert(expected.size() > 0);
                                                          -
                                                          1339  assert(expected[0]->InputStars());
                                                          -
                                                          1340 
                                                          -
                                                          1341  std::vector<Stars> inputStarses;
                                                          -
                                                          1342  for (const auto &input : expected) {
                                                          -
                                                          1343  inputStarses.push_back(*input->InputStars());
                                                          -
                                                          1344  }
                                                          -
                                                          1345  PrintCentroids("input",
                                                          -
                                                          1346  os,
                                                          -
                                                          1347  expected[0]->GetCatalog(),
                                                          -
                                                          1348  inputStarses,
                                                          -
                                                          1349  expected[0]->InputStarIds());
                                                          -
                                                          1350 }
                                                          -
                                                          1351 
                                                          -
                                                          1352 static void PipelineComparatorPrintActualCentroids(std::ostream &os,
                                                          -
                                                          1353  const PipelineInputList &expected, // expected
                                                          -
                                                          1354  const std::vector<PipelineOutput> &actual,
                                                          -
                                                          1355  const PipelineOptions &values) {
                                                          -
                                                          1356  assert(actual.size() > 0);
                                                          -
                                                          1357  assert(actual[0].stars);
                                                          -
                                                          1358 
                                                          -
                                                          1359  std::vector<Stars> actualStarses;
                                                          -
                                                          1360  for (const auto &output : actual) {
                                                          -
                                                          1361  actualStarses.push_back(*output.stars);
                                                          -
                                                          1362  }
                                                          -
                                                          1363  PrintCentroids("actual",
                                                          -
                                                          1364  os,
                                                          -
                                                          1365  actual[0].catalog,
                                                          -
                                                          1366  actualStarses,
                                                          -
                                                          1367  actual[0].starIds.get());
                                                          -
                                                          1368 
                                                          -
                                                          1369  if (expected.size() == 1 && expected[0]->ExpectedStars() && expected[0]->ExpectedStarIds()) {
                                                          -
                                                          1370  // also print expected ID of each one
                                                          -
                                                          1371  const Stars &actualStars = *actual[0].stars;
                                                          -
                                                          1372  const Stars &expectedStars = *expected[0]->ExpectedStars();
                                                          -
                                                          1373  std::multimap<int, int> actualToExpectedCentroids = FindClosestCentroids(values.centroidCompareThreshold, actualStars, expectedStars);
                                                          -
                                                          1374  for (int i = 0; i < (int)actualStars.size(); i++) {
                                                          -
                                                          1375  auto range = actualToExpectedCentroids.equal_range(i);
                                                          -
                                                          1376  auto it = range.first;
                                                          -
                                                          1377  auto end = range.second;
                                                          -
                                                          1378  for (int j = 0;
                                                          -
                                                          1379  it != end;
                                                          -
                                                          1380  j++, it++) {
                                                          -
                                                          1381 
                                                          -
                                                          1382  int expectedCentroidIndex = it->second;
                                                          -
                                                          1383  bool foundIt = false; // just to be sure
                                                          -
                                                          1384  for (const StarIdentifier &starId : *expected[0]->ExpectedStarIds()) {
                                                          -
                                                          1385  if (starId.starIndex == expectedCentroidIndex) {
                                                          -
                                                          1386  assert(!foundIt);
                                                          -
                                                          1387  int expectedName = expected[0]->GetCatalog()[starId.catalogIndex].name;
                                                          -
                                                          1388  std::cout << "actual_centroid_" << i << "_expected_id_" << j << " " << expectedName << std::endl;
                                                          -
                                                          1389  foundIt = true;
                                                          -
                                                          1390  }
                                                          -
                                                          1391  }
                                                          -
                                                          1392  }
                                                          -
                                                          1393  }
                                                          -
                                                          1394  }
                                                          -
                                                          1395 }
                                                          -
                                                          1396 
                                                          - -
                                                          1400  const PipelineInputList &expected,
                                                          -
                                                          1401  const std::vector<PipelineOutput> &actual,
                                                          -
                                                          1402  const PipelineOptions &) {
                                                          -
                                                          1403  const Stars &stars = actual[0].stars ? *actual[0].stars : *expected[0]->InputStars();
                                                          -
                                                          1404  StarIdentifiers identifiers;
                                                          -
                                                          1405  for (int i = 0; i < (int)stars.size(); i++) {
                                                          -
                                                          1406  identifiers.push_back(StarIdentifier(i, i));
                                                          -
                                                          1407  }
                                                          -
                                                          1408  cairo_surface_t *cairoSurface = expected[0]->InputImageSurface();
                                                          -
                                                          1409  SurfacePlot("centroid indices (input)",
                                                          -
                                                          1410  cairoSurface,
                                                          -
                                                          1411  stars,
                                                          -
                                                          1412  &identifiers,
                                                          -
                                                          1413  &actual[0].catalog,
                                                          -
                                                          1414  NULL,
                                                          -
                                                          1415  // orange
                                                          -
                                                          1416  1.0, 0.5, 0.0, 0.5,
                                                          -
                                                          1417  // don't resolve names
                                                          -
                                                          1418  true);
                                                          -
                                                          1419  cairo_surface_write_to_png_stream(cairoSurface, OstreamPlotter, &os);
                                                          -
                                                          1420  cairo_surface_destroy(cairoSurface);
                                                          -
                                                          1421 }
                                                          -
                                                          1422 
                                                          -
                                                          1424 static void PipelineComparatorPlotOutput(std::ostream &os,
                                                          -
                                                          1425  const PipelineInputList &expected,
                                                          -
                                                          1426  const std::vector<PipelineOutput> &actual,
                                                          -
                                                          1427  const PipelineOptions &) {
                                                          -
                                                          1428  // don't need to worry about mutating the surface; InputImageSurface returns a fresh one
                                                          -
                                                          1429  cairo_surface_t *cairoSurface = expected[0]->InputImageSurface();
                                                          -
                                                          1430  SurfacePlot("pipeline output",
                                                          -
                                                          1431  cairoSurface,
                                                          -
                                                          1432  actual[0].stars ? *actual[0].stars : *expected[0]->InputStars(),
                                                          -
                                                          1433  actual[0].starIds.get(),
                                                          -
                                                          1434  &actual[0].catalog,
                                                          -
                                                          1435  actual[0].attitude.get(),
                                                          -
                                                          1436  // red
                                                          -
                                                          1437  1.0, 0.0, 0.0, 0.5);
                                                          -
                                                          1438  cairo_surface_write_to_png_stream(cairoSurface, OstreamPlotter, &os);
                                                          -
                                                          1439  cairo_surface_destroy(cairoSurface);
                                                          -
                                                          1440 }
                                                          -
                                                          1441 
                                                          -
                                                          1443 static void PipelineComparatorStarIds(std::ostream &os,
                                                          -
                                                          1444  const PipelineInputList &expected,
                                                          -
                                                          1445  const std::vector<PipelineOutput> &actual,
                                                          -
                                                          1446  const PipelineOptions &values) {
                                                          -
                                                          1447  int numImagesCorrect = 0;
                                                          -
                                                          1448  int numImagesIncorrect = 0;
                                                          -
                                                          1449  int numImagesTotal = expected.size();
                                                          -
                                                          1450  for (int i = 0; i < numImagesTotal; i++) {
                                                          -
                                                          1451  // since the actual star IDs exist, it must have gotten input from somewhere!
                                                          -
                                                          1452  // TODO: overhaul: It seems that in these comparators there should be a more fundamental way to figure out the input that was actually sent to a stage.
                                                          -
                                                          1453  // I.e., instead of having expected and actual arguments, have some sort of PipelineRunSummary object, where the InputStars method looks at actual, then input.
                                                          -
                                                          1454  assert(actual[i].stars.get() || expected[i]->InputStars());
                                                          -
                                                          1455 
                                                          -
                                                          1456  const Stars &inputStars = actual[i].stars.get()
                                                          -
                                                          1457  ? *actual[i].stars.get()
                                                          -
                                                          1458  : *expected[i]->InputStars();
                                                          -
                                                          1459  StarIdComparison comparison =
                                                          -
                                                          1460  StarIdsCompare(*expected[i]->ExpectedStarIds(), *actual[i].starIds,
                                                          -
                                                          1461  expected[i]->GetCatalog(), actual[i].catalog,
                                                          -
                                                          1462  values.centroidCompareThreshold, *expected[i]->ExpectedStars(), inputStars);
                                                          -
                                                          1463 
                                                          -
                                                          1464  if (numImagesTotal == 1) {
                                                          -
                                                          1465  os << "starid_num_correct " << comparison.numCorrect << std::endl;
                                                          -
                                                          1466  os << "starid_num_incorrect " << comparison.numIncorrect << std::endl;
                                                          -
                                                          1467  os << "starid_num_total " << comparison.numTotal << std::endl;
                                                          -
                                                          1468  }
                                                          -
                                                          1469 
                                                          -
                                                          1470  if (comparison.numCorrect > 0 && comparison.numIncorrect == 0) {
                                                          -
                                                          1471  numImagesCorrect++;
                                                          -
                                                          1472  }
                                                          -
                                                          1473  if (comparison.numIncorrect > 0) {
                                                          -
                                                          1474  numImagesIncorrect++;
                                                          -
                                                          1475  }
                                                          -
                                                          1476  }
                                                          -
                                                          1477 
                                                          -
                                                          1478  // A "correct" image is one where at least two stars are correctly id'd and none are incorrectly id'd
                                                          -
                                                          1479  os << "starid_num_images_correct " << numImagesCorrect << std::endl;
                                                          -
                                                          1480  os << "starid_num_images_incorrect " << numImagesIncorrect << std::endl;
                                                          -
                                                          1481 }
                                                          -
                                                          1482 
                                                          -
                                                          1483 static void PrintAttitude(std::ostream &os, const std::string &prefix, const Attitude &attitude) {
                                                          -
                                                          1484  if (attitude.IsKnown()) {
                                                          -
                                                          1485  os << prefix << "attitude_known 1" << std::endl;
                                                          -
                                                          1486 
                                                          -
                                                          1487  EulerAngles spherical = attitude.ToSpherical();
                                                          -
                                                          1488  os << prefix << "attitude_ra " << RadToDeg(spherical.ra) << std::endl;
                                                          -
                                                          1489  os << prefix << "attitude_de " << RadToDeg(spherical.de) << std::endl;
                                                          -
                                                          1490  os << prefix << "attitude_roll " << RadToDeg(spherical.roll) << std::endl;
                                                          -
                                                          1491 
                                                          -
                                                          1492  Quaternion q = attitude.GetQuaternion();
                                                          -
                                                          1493  os << prefix << "attitude_i " << q.i << std::endl;
                                                          -
                                                          1494  os << prefix << "attitude_j " << q.j << std::endl;
                                                          -
                                                          1495  os << prefix << "attitude_k " << q.k << std::endl;
                                                          -
                                                          1496  os << prefix << "attitude_real " << q.real << std::endl;
                                                          -
                                                          1497 
                                                          -
                                                          1498  } else {
                                                          -
                                                          1499  os << prefix << "attitude_known 0" << std::endl;
                                                          -
                                                          1500  }
                                                          -
                                                          1501 }
                                                          -
                                                          1502 
                                                          -
                                                          1504 static void PipelineComparatorPrintAttitude(std::ostream &os,
                                                          -
                                                          1505  const PipelineInputList &,
                                                          -
                                                          1506  const std::vector<PipelineOutput> &actual,
                                                          -
                                                          1507  const PipelineOptions &) {
                                                          -
                                                          1508  assert(actual.size() == 1);
                                                          -
                                                          1509  assert(actual[0].attitude);
                                                          -
                                                          1510  PrintAttitude(os, "", *actual[0].attitude);
                                                          -
                                                          1511 }
                                                          -
                                                          1512 
                                                          -
                                                          1513 static void PipelineComparatorPrintExpectedAttitude(std::ostream &os,
                                                          -
                                                          1514  const PipelineInputList &expected,
                                                          -
                                                          1515  const std::vector<PipelineOutput> &,
                                                          -
                                                          1516  const PipelineOptions &) {
                                                          -
                                                          1517  assert(expected.size() == 1);
                                                          -
                                                          1518  assert(expected[0]->ExpectedAttitude());
                                                          -
                                                          1519  PrintAttitude(os, "expected_", *expected[0]->ExpectedAttitude());
                                                          -
                                                          1520 }
                                                          -
                                                          1521 
                                                          -
                                                          1523 static void PipelineComparatorAttitude(std::ostream &os,
                                                          -
                                                          1524  const PipelineInputList &expected,
                                                          -
                                                          1525  const std::vector<PipelineOutput> &actual,
                                                          -
                                                          1526  const PipelineOptions &values) {
                                                          -
                                                          1527 
                                                          -
                                                          1528  // TODO: use Wahba loss function (maybe average per star) instead of just angle. Also break
                                                          -
                                                          1529  // apart roll error from boresight error. This is just quick and dirty for testing
                                                          -
                                                          1530 
                                                          -
                                                          1531  float angleThreshold = DegToRad(values.attitudeCompareThreshold);
                                                          -
                                                          1532 
                                                          -
                                                          1533  float attitudeErrorSum = 0.0f;
                                                          -
                                                          1534  int numCorrect = 0;
                                                          -
                                                          1535  int numIncorrect = 0;
                                                          -
                                                          1536 
                                                          -
                                                          1537  for (int i = 0; i < (int)expected.size(); i++) {
                                                          -
                                                          1538  if (actual[i].attitude->IsKnown()) {
                                                          -
                                                          1539  Quaternion expectedQuaternion = expected[i]->ExpectedAttitude()->GetQuaternion();
                                                          -
                                                          1540  Quaternion actualQuaternion = actual[i].attitude->GetQuaternion();
                                                          -
                                                          1541  float attitudeError = (expectedQuaternion * actualQuaternion.Conjugate()).SmallestAngle();
                                                          -
                                                          1542  assert(attitudeError >= 0);
                                                          -
                                                          1543 
                                                          -
                                                          1544  if (attitudeError <= angleThreshold) {
                                                          -
                                                          1545  attitudeErrorSum += attitudeError;
                                                          -
                                                          1546  numCorrect++;
                                                          -
                                                          1547  } else {
                                                          -
                                                          1548  numIncorrect++;
                                                          -
                                                          1549  }
                                                          -
                                                          1550  }
                                                          -
                                                          1551  }
                                                          -
                                                          1552 
                                                          -
                                                          1553  float attitudeErrorMean = attitudeErrorSum / numCorrect;
                                                          -
                                                          1554  float fractionCorrect = (float)numCorrect / expected.size();
                                                          -
                                                          1555  float fractionIncorrect = (float)numIncorrect / expected.size();
                                                          -
                                                          1556 
                                                          -
                                                          1557  os << "attitude_error_mean " << attitudeErrorMean << std::endl;
                                                          -
                                                          1558  os << "attitude_availability " << fractionCorrect << std::endl;
                                                          -
                                                          1559  os << "attitude_error_rate " << fractionIncorrect << std::endl;
                                                          -
                                                          1560 }
                                                          -
                                                          1561 
                                                          -
                                                          1562 static void PrintTimeStats(std::ostream &os, const std::string &prefix, const std::vector<long long> &times) {
                                                          -
                                                          1563  assert(times.size() > 0);
                                                          -
                                                          1564 
                                                          -
                                                          1565  // print average, min, max, and 95% max
                                                          -
                                                          1566  long long sum = 0;
                                                          -
                                                          1567  long long min = LONG_MAX;
                                                          -
                                                          1568  long long max = 0;
                                                          -
                                                          1569  for (int i = 0; i < (int)times.size(); i++) {
                                                          -
                                                          1570  assert(times[i] > 0);
                                                          -
                                                          1571  sum += times[i];
                                                          -
                                                          1572  min = std::min(min, times[i]);
                                                          -
                                                          1573  max = std::max(max, times[i]);
                                                          -
                                                          1574  }
                                                          -
                                                          1575  long average = sum / times.size();
                                                          -
                                                          1576  std::vector<long long> sortedTimes = times;
                                                          -
                                                          1577  std::sort(sortedTimes.begin(), sortedTimes.end());
                                                          -
                                                          1578  // what really is the 95th percentile? Being conservative, we want to pick a value that at least
                                                          -
                                                          1579  // 95% of the times are less than. This means: (1) finding the number of times, (2) Finding
                                                          -
                                                          1580  // Math.ceil(0.95 * numTimes), and (3) subtracting 1 to get the index.
                                                          -
                                                          1581  int ninetyFiveIndex = (int)std::ceil(0.95 * times.size()) - 1;
                                                          -
                                                          1582  assert(ninetyFiveIndex >= 0);
                                                          -
                                                          1583  long long ninetyFifthPercentile = sortedTimes[ninetyFiveIndex];
                                                          -
                                                          1584 
                                                          -
                                                          1585  os << prefix << "_average_ns " << average << std::endl;
                                                          -
                                                          1586  os << prefix << "_min_ns " << min << std::endl;
                                                          -
                                                          1587  os << prefix << "_max_ns " << max << std::endl;
                                                          -
                                                          1588  os << prefix << "_95%_ns " << ninetyFifthPercentile << std::endl;
                                                          -
                                                          1589 }
                                                          -
                                                          1590 
                                                          -
                                                          1592 static void PipelineComparatorPrintSpeed(std::ostream &os,
                                                          -
                                                          1593  const PipelineInputList &,
                                                          -
                                                          1594  const std::vector<PipelineOutput> &actual,
                                                          -
                                                          1595  const PipelineOptions &) {
                                                          -
                                                          1596  std::vector<long long> centroidingTimes;
                                                          -
                                                          1597  std::vector<long long> starIdTimes;
                                                          -
                                                          1598  std::vector<long long> attitudeTimes;
                                                          -
                                                          1599  std::vector<long long> totalTimes;
                                                          -
                                                          1600  for (int i = 0; i < (int)actual.size(); i++) {
                                                          -
                                                          1601  long long totalTime = 0;
                                                          -
                                                          1602  if (actual[i].centroidingTimeNs > 0) {
                                                          -
                                                          1603  centroidingTimes.push_back(actual[i].centroidingTimeNs);
                                                          -
                                                          1604  totalTime += actual[i].centroidingTimeNs;
                                                          -
                                                          1605  }
                                                          -
                                                          1606  if (actual[i].starIdTimeNs > 0) {
                                                          -
                                                          1607  starIdTimes.push_back(actual[i].starIdTimeNs);
                                                          -
                                                          1608  totalTime += actual[i].starIdTimeNs;
                                                          -
                                                          1609  }
                                                          -
                                                          1610  if (actual[i].attitudeEstimationTimeNs > 0) {
                                                          -
                                                          1611  attitudeTimes.push_back(actual[i].attitudeEstimationTimeNs);
                                                          -
                                                          1612  totalTime += actual[i].attitudeEstimationTimeNs;
                                                          -
                                                          1613  }
                                                          -
                                                          1614  totalTimes.push_back(totalTime);
                                                          -
                                                          1615  }
                                                          -
                                                          1616  if (centroidingTimes.size() > 0) {
                                                          -
                                                          1617  PrintTimeStats(os, "centroiding", centroidingTimes);
                                                          -
                                                          1618  }
                                                          -
                                                          1619  if (starIdTimes.size() > 0) {
                                                          -
                                                          1620  PrintTimeStats(os, "starid", starIdTimes);
                                                          -
                                                          1621  }
                                                          -
                                                          1622  if (attitudeTimes.size() > 0) {
                                                          -
                                                          1623  PrintTimeStats(os, "attitude", attitudeTimes);
                                                          -
                                                          1624  }
                                                          -
                                                          1625  if (centroidingTimes.size() > 0 || starIdTimes.size() > 0 || attitudeTimes.size() > 0) {
                                                          -
                                                          1626  PrintTimeStats(os, "total", totalTimes);
                                                          -
                                                          1627  }
                                                          -
                                                          1628 }
                                                          -
                                                          1629 
                                                          -
                                                          1630 // TODO: add these debug comparators back in!
                                                          -
                                                          1631 // void PipelineComparatorPrintPairDistance(std::ostream &os,
                                                          -
                                                          1632 // const PipelineInputList &expected,
                                                          -
                                                          1633 // const std::vector<PipelineOutput> &actual) {
                                                          -
                                                          1634 // int index1 = Prompt<int>("Index of first star");
                                                          -
                                                          1635 // int index2 = Prompt<int>("Index of second star");
                                                          -
                                                          1636 
                                                          -
                                                          1637 // const Camera &camera = *expected[0]->InputCamera();
                                                          -
                                                          1638 // const Stars &stars = *actual[0].stars;
                                                          -
                                                          1639 
                                                          -
                                                          1640 // assert(index1 >= 0 && index2 >= 0 && index1 < (int)stars.size() && index2 < (int)stars.size());
                                                          -
                                                          1641 // os << "pair_distance " << Angle(camera.CameraToSpatial(stars[index1].position),
                                                          -
                                                          1642 // camera.CameraToSpatial(stars[index2].position))
                                                          -
                                                          1643 // << std::endl;
                                                          -
                                                          1644 // }
                                                          -
                                                          1645 
                                                          -
                                                          1646 // void PipelineComparatorPrintPyramidDistances(std::ostream &os,
                                                          -
                                                          1647 // const PipelineInputList &expected,
                                                          -
                                                          1648 // const std::vector<PipelineOutput> &actual) {
                                                          -
                                                          1649 // int index1 = Prompt<int>("Catalog name/index of first star");
                                                          -
                                                          1650 // int index2 = Prompt<int>("Catalog name/index of second star");
                                                          -
                                                          1651 // int index3 = Prompt<int>("Catalog name/index of third star");
                                                          -
                                                          1652 // int index4 = Prompt<int>("Catalog name/index of four star");
                                                          -
                                                          1653 
                                                          -
                                                          1654 // const Camera &camera = *expected[0]->InputCamera();
                                                          -
                                                          1655 // const Stars &stars = *actual[0].stars;
                                                          -
                                                          1656 
                                                          -
                                                          1657 // Vec3 spatial1 = camera.CameraToSpatial(stars[index1].position);
                                                          -
                                                          1658 // Vec3 spatial2 = camera.CameraToSpatial(stars[index2].position);
                                                          -
                                                          1659 // Vec3 spatial3 = camera.CameraToSpatial(stars[index3].position);
                                                          -
                                                          1660 // Vec3 spatial4 = camera.CameraToSpatial(stars[index4].position);
                                                          -
                                                          1661 
                                                          -
                                                          1662 // std::cout << "pair_distance_12 " << Angle(spatial1, spatial2) << std::endl;
                                                          -
                                                          1663 // std::cout << "pair_distance_13 " << Angle(spatial1, spatial3) << std::endl;
                                                          -
                                                          1664 // std::cout << "pair_distance_14 " << Angle(spatial1, spatial4) << std::endl;
                                                          -
                                                          1665 // std::cout << "pair_distance_23 " << Angle(spatial2, spatial3) << std::endl;
                                                          -
                                                          1666 // std::cout << "pair_distance_24 " << Angle(spatial2, spatial4) << std::endl;
                                                          -
                                                          1667 // std::cout << "pair_distance_34 " << Angle(spatial3, spatial4) << std::endl;
                                                          -
                                                          1668 // }
                                                          -
                                                          1669 
                                                          -
                                                          1670 // void PipelineComparatorPrintTripleAngle(std::ostream &os,
                                                          -
                                                          1671 // const PipelineInputList &expected,
                                                          -
                                                          1672 // const std::vector<PipelineOutput> &actual) {
                                                          -
                                                          1673 // int index1 = Prompt<int>("Index of first star");
                                                          -
                                                          1674 // int index2 = Prompt<int>("Index of second star");
                                                          -
                                                          1675 // int index3 = Prompt<int>("Index of third star");
                                                          -
                                                          1676 
                                                          -
                                                          1677 // const Camera &camera = *expected[0]->InputCamera();
                                                          -
                                                          1678 // const Stars &stars = *actual[0].stars;
                                                          -
                                                          1679 
                                                          -
                                                          1680 // assert(index1 >= 0 && index1 < (int)stars.size());
                                                          -
                                                          1681 // assert(index2 >= 0 && index2 < (int)stars.size());
                                                          -
                                                          1682 // assert(index3 >= 0 && index3 < (int)stars.size());
                                                          -
                                                          1683 
                                                          -
                                                          1684 // // TODO, when merging with nondimensional branch
                                                          -
                                                          1685 // }
                                                          -
                                                          1686 
                                                          - -
                                                          1692  const std::vector<PipelineOutput> &actual,
                                                          -
                                                          1693  const PipelineOptions &values) {
                                                          -
                                                          1694  if (actual.size() == 0) {
                                                          -
                                                          1695  std::cerr << "ERROR: No output! Did you specify any input images? Try --png or --generate." << std::endl;
                                                          -
                                                          1696  exit(1);
                                                          -
                                                          1697  }
                                                          -
                                                          1698 
                                                          -
                                                          1699  assert(expected.size() == actual.size() && expected.size() > 0);
                                                          -
                                                          1700 
                                                          -
                                                          1701  // TODO: Remove the asserts and print out more reasonable error messages.
                                                          -
                                                          1702 
                                                          -
                                                          1703 #define LOST_PIPELINE_COMPARE(precondition, errmsg, comparator, path, isBinary) do { \
                                                          -
                                                          1704  if (precondition) { \
                                                          -
                                                          1705  UserSpecifiedOutputStream pos(path, isBinary); \
                                                          -
                                                          1706  comparator(pos.Stream(), expected, actual, values); \
                                                          -
                                                          1707  } else { \
                                                          -
                                                          1708  std::cerr << "ERROR: Comparator not applicable: " << errmsg << std::endl; \
                                                          -
                                                          1709  exit(1); \
                                                          -
                                                          1710  } \
                                                          -
                                                          1711  } while (0)
                                                          -
                                                          1712 
                                                          -
                                                          1713  if (values.plotRawInput != "") {
                                                          -
                                                          1714  LOST_PIPELINE_COMPARE(expected[0]->InputImage() && expected.size() == 1,
                                                          -
                                                          1715  "--plot-raw-input requires exactly 1 input image, but " + std::to_string(expected.size()) + " many were provided.",
                                                          -
                                                          1716  PipelineComparatorPlotRawInput, values.plotRawInput, true);
                                                          -
                                                          1717  }
                                                          -
                                                          1718 
                                                          -
                                                          1719  if (values.plotInput != "") {
                                                          -
                                                          1720  LOST_PIPELINE_COMPARE(expected[0]->InputImage() && expected.size() == 1 && expected[0]->InputStars(),
                                                          -
                                                          1721  "--plot-input requires exactly 1 input image, and for centroids to be available on that input image. " + std::to_string(expected.size()) + " many input images were provided.",
                                                          -
                                                          1722  PipelineComparatorPlotInput, values.plotInput, true);
                                                          -
                                                          1723  }
                                                          -
                                                          1724  if (values.plotExpected != "") {
                                                          -
                                                          1725  LOST_PIPELINE_COMPARE(expected[0]->InputImage() && expected.size() == 1 && expected[0]->ExpectedStars(),
                                                          -
                                                          1726  "--plot-expected-input requires exactly 1 input image, and for expected centroids to be available on that input image. " + std::to_string(expected.size()) + " many input images were provided.",
                                                          -
                                                          1727  PipelineComparatorPlotExpected, values.plotExpected, true);
                                                          -
                                                          1728  }
                                                          -
                                                          1729  if (values.plotOutput != "") {
                                                          -
                                                          1730  LOST_PIPELINE_COMPARE(actual.size() == 1 && (actual[0].stars || actual[0].starIds),
                                                          -
                                                          1731  "--plot-output requires exactly 1 output image, and for either centroids or star IDs to be available on that output image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          -
                                                          1732  PipelineComparatorPlotOutput, values.plotOutput, true);
                                                          -
                                                          1733  }
                                                          -
                                                          1734  if (values.printExpectedCentroids != "") {
                                                          -
                                                          1735  LOST_PIPELINE_COMPARE(expected[0]->ExpectedStars(),
                                                          -
                                                          1736  "--print-expected-centroids requires at least 1 input with expected centroids. " + std::to_string(expected.size()) + " many input images were provided.",
                                                          -
                                                          1737  PipelineComparatorPrintExpectedCentroids, values.printExpectedCentroids, false);
                                                          -
                                                          1738  }
                                                          -
                                                          1739  if (values.printInputCentroids != "") {
                                                          -
                                                          1740  LOST_PIPELINE_COMPARE(expected[0]->InputStars(),
                                                          -
                                                          1741  "--print-input-centroids requires at least 1 input with centroids. " + std::to_string(expected.size()) + " many input images were provided.",
                                                          -
                                                          1742  PipelineComparatorPrintInputCentroids, values.printInputCentroids, false);
                                                          -
                                                          1743  }
                                                          -
                                                          1744  if (values.printActualCentroids != "") {
                                                          -
                                                          1745  LOST_PIPELINE_COMPARE(actual[0].stars,
                                                          -
                                                          1746  "--print-actual-centroids requires at least 1 output image, and for centroids to be available on the output images. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          -
                                                          1747  PipelineComparatorPrintActualCentroids, values.printActualCentroids, false);
                                                          -
                                                          1748  }
                                                          -
                                                          1749  if (values.plotCentroidIndices != "") {
                                                          -
                                                          1750  LOST_PIPELINE_COMPARE(expected.size() == 1 && expected[0]->InputImage(),
                                                          -
                                                          1751  "--plot-centroid-indices requires exactly 1 input with image. " + std::to_string(expected.size()) + " many inputs were provided.",
                                                          -
                                                          1752  PipelineComparatorPlotCentroidIndices, values.plotCentroidIndices, true);
                                                          -
                                                          1753  }
                                                          -
                                                          1754  if (values.compareCentroids != "") {
                                                          -
                                                          1755  LOST_PIPELINE_COMPARE(actual[0].stars && expected[0]->ExpectedStars() && values.centroidCompareThreshold,
                                                          -
                                                          1756  "--compare-centroids requires at least 1 output image, and for expected centroids to be available on the input image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          -
                                                          1757  PipelineComparatorCentroids, values.compareCentroids, false);
                                                          -
                                                          1758  }
                                                          -
                                                          1759  if (values.compareStarIds != "") {
                                                          -
                                                          1760  LOST_PIPELINE_COMPARE(expected[0]->ExpectedStarIds() && actual[0].starIds && expected[0]->ExpectedStars(),
                                                          -
                                                          1761  "--compare-star-ids requires at least 1 output image, and for expected star IDs and centroids to be available on the input image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          -
                                                          1762  PipelineComparatorStarIds, values.compareStarIds, false);
                                                          -
                                                          1763  }
                                                          -
                                                          1764  if (values.printAttitude != "") {
                                                          -
                                                          1765  LOST_PIPELINE_COMPARE(actual[0].attitude && actual.size() == 1,
                                                          -
                                                          1766  "--print-attitude requires exactly 1 output image, and for attitude to be available on that output image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          -
                                                          1767  PipelineComparatorPrintAttitude, values.printAttitude, false);
                                                          -
                                                          1768  }
                                                          -
                                                          1769  if (values.printExpectedAttitude != "") {
                                                          -
                                                          1770  LOST_PIPELINE_COMPARE(expected[0]->ExpectedAttitude() && expected.size() == 1,
                                                          -
                                                          1771  "--print-expected-attitude requires exactly 1 input image, and for expected attitude to be available on that input image. " + std::to_string(expected.size()) + " many input images were provided.",
                                                          -
                                                          1772  PipelineComparatorPrintExpectedAttitude, values.printExpectedAttitude, false);
                                                          -
                                                          1773  }
                                                          -
                                                          1774  if (values.compareAttitudes != "") {
                                                          -
                                                          1775  LOST_PIPELINE_COMPARE(actual[0].attitude && expected[0]->ExpectedAttitude() && values.attitudeCompareThreshold,
                                                          -
                                                          1776  "--compare-attitudes requires at least 1 output image, and for expected attitude to be available on the input image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          -
                                                          1777  PipelineComparatorAttitude, values.compareAttitudes, false);
                                                          -
                                                          1778  }
                                                          -
                                                          1779  if (values.printSpeed != "") {
                                                          -
                                                          1780  LOST_PIPELINE_COMPARE(actual.size() > 0,
                                                          -
                                                          1781  // I don't think this should ever actually happen??
                                                          -
                                                          1782  "--print-speed requires at least 1 output image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          -
                                                          1783  PipelineComparatorPrintSpeed, values.printSpeed, false);
                                                          -
                                                          1784  }
                                                          -
                                                          1785 
                                                          -
                                                          1786 #undef LOST_PIPELINE_COMPARE
                                                          -
                                                          1787 }
                                                          -
                                                          1788 
                                                          -
                                                          1789 // TODO: Add CLI options for all the inspectors!
                                                          -
                                                          1790 
                                                          -
                                                          1791 // typedef void (*CatalogInspector)(const Catalog &);
                                                          -
                                                          1792 
                                                          -
                                                          1793 // static std::vector<const CatalogStar *> PromptCatalogStars(const Catalog &catalog, int howMany) {
                                                          -
                                                          1794 // std::vector<const CatalogStar *> result;
                                                          -
                                                          1795 // for (int i = 0; i < howMany; i++) {
                                                          -
                                                          1796 // int name = Prompt<int>("Catalog name of " + std::to_string(i) + "-th star");
                                                          -
                                                          1797 // const CatalogStar *star = findNamedStar(catalog, name);
                                                          -
                                                          1798 // if (star == NULL) {
                                                          -
                                                          1799 // std::cerr << "Star not found!" << std::endl;
                                                          -
                                                          1800 // exit(1);
                                                          -
                                                          1801 // }
                                                          -
                                                          1802 // result.push_back(star);
                                                          -
                                                          1803 // }
                                                          -
                                                          1804 // return result;
                                                          -
                                                          1805 // }
                                                          -
                                                          1806 
                                                          -
                                                          1807 // void InspectPairDistance(const Catalog &catalog) {
                                                          -
                                                          1808 // auto stars = PromptCatalogStars(catalog, 2);
                                                          -
                                                          1809 
                                                          -
                                                          1810 // // TODO: not cout, prompt for an ostream in inspect and pass argument
                                                          -
                                                          1811 // std::cout << Angle(stars[0]->spatial, stars[1]->spatial) << std::endl;
                                                          -
                                                          1812 // }
                                                          -
                                                          1813 
                                                          -
                                                          1814 // void InspectPyramidDistances(const Catalog &catalog) {
                                                          -
                                                          1815 // auto stars = PromptCatalogStars(catalog, 4);
                                                          -
                                                          1816 
                                                          -
                                                          1817 // std::cout << "pair_distance_01 " << Angle(stars[0]->spatial, stars[1]->spatial) << std::endl;
                                                          -
                                                          1818 // std::cout << "pair_distance_02 " << Angle(stars[0]->spatial, stars[2]->spatial) << std::endl;
                                                          -
                                                          1819 // std::cout << "pair_distance_03 " << Angle(stars[0]->spatial, stars[3]->spatial) << std::endl;
                                                          -
                                                          1820 // std::cout << "pair_distance_12 " << Angle(stars[1]->spatial, stars[2]->spatial) << std::endl;
                                                          -
                                                          1821 // std::cout << "pair_distance_13 " << Angle(stars[1]->spatial, stars[3]->spatial) << std::endl;
                                                          -
                                                          1822 // std::cout << "pair_distance_23 " << Angle(stars[2]->spatial, stars[3]->spatial) << std::endl;
                                                          -
                                                          1823 // }
                                                          -
                                                          1824 
                                                          -
                                                          1825 // void InspectTripleAngle(const Catalog &catalog) {
                                                          -
                                                          1826 // auto stars = PromptCatalogStars(catalog, 3);
                                                          -
                                                          1827 
                                                          -
                                                          1828 // // TODO
                                                          -
                                                          1829 // }
                                                          -
                                                          1830 
                                                          -
                                                          1831 // void InspectFindStar(const Catalog &catalog) {
                                                          -
                                                          1832 // std::string raStr = PromptLine("Right Ascension");
                                                          -
                                                          1833 
                                                          -
                                                          1834 // float raRadians;
                                                          -
                                                          1835 
                                                          -
                                                          1836 // int raHours, raMinutes;
                                                          -
                                                          1837 // float raSeconds;
                                                          -
                                                          1838 // int raFormatTime = sscanf(raStr.c_str(), "%dh %dm %fs", &raHours, &raMinutes, &raSeconds);
                                                          -
                                                          1839 
                                                          -
                                                          1840 // float raDeg;
                                                          -
                                                          1841 // int raFormatDeg = sscanf(raStr.c_str(), "%f", &raDeg);
                                                          -
                                                          1842 
                                                          -
                                                          1843 // if (raFormatTime == 3) {
                                                          -
                                                          1844 // raRadians = (raHours * 2*M_PI/24) + (raMinutes * 2*M_PI/24/60) + (raSeconds * 2*M_PI/24/60/60);
                                                          -
                                                          1845 // } else if (raFormatDeg == 1) {
                                                          -
                                                          1846 // raRadians = DegToRad(raFormatDeg);
                                                          -
                                                          1847 // } else {
                                                          -
                                                          1848 // std::cerr << "Invalid right ascension format. Do \"09h 38m 29.8754s\" or a number of degrees." << std::endl;
                                                          -
                                                          1849 // exit(1);
                                                          -
                                                          1850 // }
                                                          -
                                                          1851 
                                                          -
                                                          1852 // std::string deStr = PromptLine("Declination");
                                                          -
                                                          1853 
                                                          -
                                                          1854 // float deRadians;
                                                          -
                                                          1855 
                                                          -
                                                          1856 // int deDegPart, deMinPart;
                                                          -
                                                          1857 // float deSecPart;
                                                          -
                                                          1858 // char dummy[8];
                                                          -
                                                          1859 // int deFormatParts = sscanf(deStr.c_str(), "%d%s %d%s %f%s", &deDegPart, dummy, &deMinPart, dummy, &deSecPart, dummy);
                                                          -
                                                          1860 
                                                          -
                                                          1861 // float deDeg;
                                                          -
                                                          1862 // int deFormatDeg = sscanf(deStr.c_str(), "%f", &deDeg);
                                                          -
                                                          1863 
                                                          -
                                                          1864 // if (deFormatParts == 6) {
                                                          -
                                                          1865 // deRadians = DegToRad(deDegPart + (float)deMinPart/60 + (float)deSecPart/60/60);
                                                          -
                                                          1866 // } else if (deFormatDeg == 1) {
                                                          -
                                                          1867 // deRadians = DegToRad(deFormatDeg);
                                                          -
                                                          1868 // } else {
                                                          -
                                                          1869 // std::cerr << "Invalid declination format." << std::endl;
                                                          -
                                                          1870 // exit(1);
                                                          -
                                                          1871 // }
                                                          -
                                                          1872 
                                                          -
                                                          1873 // // find the star
                                                          -
                                                          1874 
                                                          -
                                                          1875 // float tolerance = 0.001;
                                                          -
                                                          1876 // Vec3 userSpatial = SphericalToSpatial(raRadians, deRadians);
                                                          -
                                                          1877 // int i = 0;
                                                          -
                                                          1878 // for (const CatalogStar &curStar : catalog) {
                                                          -
                                                          1879 // if ((curStar.spatial - userSpatial).Magnitude() < tolerance) {
                                                          -
                                                          1880 // std::cout << "found_star_" << i << " " << curStar.name << std::endl;
                                                          -
                                                          1881 // std::cout << "fonud_star_magnitude_" << i << " " << curStar.magnitude << std::endl;
                                                          -
                                                          1882 // i++;
                                                          -
                                                          1883 // }
                                                          -
                                                          1884 // }
                                                          -
                                                          1885 // if (i == 0) {
                                                          -
                                                          1886 // std::cerr << "No stars found" << std::endl;
                                                          -
                                                          1887 // }
                                                          -
                                                          1888 // }
                                                          -
                                                          1889 
                                                          -
                                                          1890 // void InspectPrintStar(const Catalog &catalog) {
                                                          -
                                                          1891 // auto stars = PromptCatalogStars(catalog, 1);
                                                          -
                                                          1892 // float ra, de;
                                                          -
                                                          1893 // SpatialToSpherical(stars[0]->spatial, &ra, &de);
                                                          -
                                                          1894 
                                                          -
                                                          1895 // std::cout << "star_ra " << RadToDeg(ra) << std::endl;
                                                          -
                                                          1896 // std::cout << "star_de " << RadToDeg(de) << std::endl;
                                                          -
                                                          1897 // }
                                                          -
                                                          1898 
                                                          -
                                                          1899 // void InspectCatalog() {
                                                          -
                                                          1900 // InteractiveChoice<CatalogInspector> inspectorChoice;
                                                          -
                                                          1901 // inspectorChoice.Register("pair_distance", "pair distance angle", InspectPairDistance);
                                                          -
                                                          1902 // inspectorChoice.Register("pyramid_distances", "all pair distances in pyramid", InspectPyramidDistances);
                                                          -
                                                          1903 // inspectorChoice.Register("triple_angle", "inner angle of a triangle", InspectTripleAngle);
                                                          -
                                                          1904 // inspectorChoice.Register("find_star", "find a star name based on ra/de", InspectFindStar);
                                                          -
                                                          1905 // inspectorChoice.Register("print_star", "print coordinates of a star", InspectPrintStar);
                                                          -
                                                          1906 // (*inspectorChoice.Prompt("Inspect the catalog"))(CatalogRead());
                                                          -
                                                          1907 // }
                                                          -
                                                          1908 
                                                          -
                                                          1909 } // namespace lost
                                                          +
                                                          1006  for (const std::unique_ptr<PipelineInput> &input : inputs) {
                                                          +
                                                          1007  result.push_back(Go(*input));
                                                          +
                                                          1008  }
                                                          +
                                                          1009 
                                                          +
                                                          1010  return result;
                                                          +
                                                          1011 }
                                                          +
                                                          1012 
                                                          +
                                                          1014 // COMPARISON //
                                                          +
                                                          1016 
                                                          + +
                                                          1022 public:
                                                          + +
                                                          1028  float meanError;
                                                          +
                                                          1029 
                                                          + +
                                                          1034 
                                                          + +
                                                          1040 
                                                          +
                                                          1041  // We no longer have a num missing because often generated stars have too low of a signal-to-noise ratio and the centroid algo won't pick them up.
                                                          +
                                                          1042 };
                                                          +
                                                          1043 
                                                          +
                                                          1048 static std::multimap<int, int> FindClosestCentroids(float threshold,
                                                          +
                                                          1049  const Stars &one,
                                                          +
                                                          1050  const Stars &two) {
                                                          +
                                                          1051  std::multimap<int, int> result;
                                                          +
                                                          1052 
                                                          +
                                                          1053  for (int i = 0; i < (int)one.size(); i++) {
                                                          +
                                                          1054  std::vector<std::pair<float, int>> closest;
                                                          +
                                                          1055  for (int k = 0; k < (int)two.size(); k++) {
                                                          +
                                                          1056  float currDistance = (one[i].position - two[k].position).Magnitude();
                                                          +
                                                          1057  if (currDistance <= threshold) {
                                                          +
                                                          1058  closest.emplace_back(currDistance, k);
                                                          +
                                                          1059  }
                                                          +
                                                          1060  }
                                                          +
                                                          1061  std::sort(closest.begin(), closest.end());
                                                          +
                                                          1062  for (const std::pair<float, int> &pair : closest) {
                                                          +
                                                          1063  result.emplace(i, pair.second);
                                                          +
                                                          1064  }
                                                          +
                                                          1065  }
                                                          +
                                                          1066 
                                                          +
                                                          1067  return result;
                                                          +
                                                          1068 }
                                                          +
                                                          1069 
                                                          + +
                                                          1076  const Stars &expected,
                                                          +
                                                          1077  const Stars &actual) {
                                                          +
                                                          1078 
                                                          +
                                                          1079  // TODO: Somehow penalize when multiple centroids correspond to the same expected star (i.e.,
                                                          +
                                                          1080  // one star turned into multiple centroids). That should probably be considered an extra
                                                          +
                                                          1081  // centroid, but rn it isn't.
                                                          +
                                                          1082 
                                                          +
                                                          1083  CentroidComparison result;
                                                          +
                                                          1084  // maps from indexes in each list to the closest centroid from other list
                                                          +
                                                          1085  std::multimap<int, int> actualToExpected = FindClosestCentroids(threshold, actual, expected);
                                                          +
                                                          1086 
                                                          +
                                                          1087  for (int i = 0; i < (int)actualToExpected.size(); i++) {
                                                          +
                                                          1088  auto closest = actualToExpected.find(i);
                                                          +
                                                          1089  if (closest == actualToExpected.end()) {
                                                          +
                                                          1090  result.numExtraCentroids++;
                                                          +
                                                          1091  } else {
                                                          +
                                                          1092  result.meanError += (actual[i].position - expected[closest->second].position).Magnitude();
                                                          +
                                                          1093  result.numCorrectCentroids++;
                                                          +
                                                          1094  }
                                                          +
                                                          1095  }
                                                          +
                                                          1096  result.meanError /= result.numCorrectCentroids;
                                                          +
                                                          1097 
                                                          +
                                                          1098  return result;
                                                          +
                                                          1099 }
                                                          +
                                                          1100 
                                                          +
                                                          1101 CentroidComparison CentroidComparisonsCombine(std::vector<CentroidComparison> comparisons) {
                                                          +
                                                          1102  assert(comparisons.size() > 0);
                                                          +
                                                          1103 
                                                          +
                                                          1104  CentroidComparison result;
                                                          +
                                                          1105 
                                                          +
                                                          1106  for (const CentroidComparison &comparison : comparisons) {
                                                          +
                                                          1107  result.meanError += comparison.meanError;
                                                          +
                                                          1108  result.numCorrectCentroids += comparison.numCorrectCentroids;
                                                          +
                                                          1109  result.numExtraCentroids += comparison.numExtraCentroids;
                                                          +
                                                          1110  }
                                                          +
                                                          1111 
                                                          +
                                                          1112  result.meanError /= comparisons.size();
                                                          +
                                                          1113  result.numExtraCentroids /= comparisons.size();
                                                          +
                                                          1114  result.numCorrectCentroids /= comparisons.size();
                                                          +
                                                          1115 
                                                          +
                                                          1116  return result;
                                                          +
                                                          1117 }
                                                          +
                                                          1118 
                                                          +
                                                          1119 // (documentation in hpp)
                                                          + +
                                                          1121  // use these to map indices to names for the respective lists of StarIdentifiers
                                                          +
                                                          1122  const Catalog &expectedCatalog, const Catalog &actualCatalog,
                                                          +
                                                          1123  float centroidThreshold,
                                                          +
                                                          1124  const Stars &expectedStars, const Stars &inputStars) {
                                                          +
                                                          1125 
                                                          +
                                                          1126  StarIdComparison result = {
                                                          +
                                                          1127  0, // correct
                                                          +
                                                          1128  0, // incorrect
                                                          +
                                                          1129  0, // total
                                                          +
                                                          1130  };
                                                          +
                                                          1131 
                                                          +
                                                          1132  // EXPECTED STAR IDS
                                                          +
                                                          1133 
                                                          +
                                                          1134  // map from expected star indices to expected catalog indices (basically flattening the expected star-ids)
                                                          +
                                                          1135  std::vector<int> expectedCatalogIndices(expectedStars.size(), -1);
                                                          +
                                                          1136  for (const StarIdentifier &starId : expected) {
                                                          +
                                                          1137  assert(0 <= starId.starIndex && starId.starIndex <= (int)expectedStars.size());
                                                          +
                                                          1138  assert(0 <= starId.catalogIndex && starId.catalogIndex <= (int)expectedCatalog.size());
                                                          +
                                                          1139  expectedCatalogIndices[starId.starIndex] = starId.catalogIndex;
                                                          +
                                                          1140  }
                                                          +
                                                          1141 
                                                          +
                                                          1142  // FIND NEAREST CENTROIDS
                                                          +
                                                          1143 
                                                          +
                                                          1144  std::multimap<int, int> inputToExpectedCentroids = FindClosestCentroids(centroidThreshold, inputStars, expectedStars);
                                                          +
                                                          1145  // std::multimap<int, int> expectedToInputCentroids = FindClosestCentroids(centroidThreshold, expectedStars, inputStars);
                                                          +
                                                          1146 
                                                          +
                                                          1147  // COMPUTE TOTAL
                                                          +
                                                          1148  // Count the number of expected stars with at least one input star near them
                                                          +
                                                          1149  for (int i = 0; i < (int)inputStars.size(); i++) {
                                                          +
                                                          1150  // make sure there's at least one expected star near this input star which has an identification
                                                          +
                                                          1151  auto closestRange = inputToExpectedCentroids.equal_range(i);
                                                          +
                                                          1152  bool found = false;
                                                          +
                                                          1153  for (auto it = closestRange.first; it != closestRange.second; it++) {
                                                          +
                                                          1154  if (expectedCatalogIndices[it->second] != -1) {
                                                          +
                                                          1155  found = true;
                                                          +
                                                          1156  break;
                                                          +
                                                          1157  }
                                                          +
                                                          1158  }
                                                          +
                                                          1159  if (found) {
                                                          +
                                                          1160  result.numTotal++;
                                                          +
                                                          1161  }
                                                          +
                                                          1162  }
                                                          +
                                                          1163 
                                                          +
                                                          1164  // COMPUTE CORRECT AND INCORRECT
                                                          +
                                                          1165 
                                                          +
                                                          1166  std::vector<bool> identifiedInputCentroids(inputStars.size(), false);
                                                          +
                                                          1167  for (const StarIdentifier &starId : actual) {
                                                          +
                                                          1168  // as later, there shouldn't be duplicate starIndex. This indicates a bug in the star-id algorithm, not comparison code.
                                                          +
                                                          1169  assert(!identifiedInputCentroids[starId.starIndex]);
                                                          +
                                                          1170  identifiedInputCentroids[starId.starIndex] = true;
                                                          +
                                                          1171  assert(0 <= starId.starIndex && starId.starIndex <= (int)inputStars.size());
                                                          +
                                                          1172  assert(0 <= starId.catalogIndex && starId.catalogIndex <= (int)actualCatalog.size());
                                                          +
                                                          1173 
                                                          +
                                                          1174  // Check that there's at least one expected centroid in range which agrees with your identification.
                                                          +
                                                          1175  auto expectedCentroidsInRange = inputToExpectedCentroids.equal_range(starId.starIndex);
                                                          +
                                                          1176  bool found = false;
                                                          +
                                                          1177  for (auto it = expectedCentroidsInRange.first; it != expectedCentroidsInRange.second; it++) {
                                                          +
                                                          1178  int expectedCatalogIndex = expectedCatalogIndices[it->second];
                                                          +
                                                          1179  if (expectedCatalogIndex != -1
                                                          +
                                                          1180  && expectedCatalog[expectedCatalogIndex].name == actualCatalog[starId.catalogIndex].name) {
                                                          +
                                                          1181 
                                                          +
                                                          1182  result.numCorrect++;
                                                          +
                                                          1183  found = true;
                                                          +
                                                          1184  break;
                                                          +
                                                          1185  }
                                                          +
                                                          1186  }
                                                          +
                                                          1187 
                                                          +
                                                          1188  // Either there's no expected centroid in range, or none of them agree with the identification.
                                                          +
                                                          1189  if (!found) {
                                                          +
                                                          1190  result.numIncorrect++;
                                                          +
                                                          1191  }
                                                          +
                                                          1192  }
                                                          +
                                                          1193 
                                                          +
                                                          1194  return result;
                                                          +
                                                          1195 }
                                                          +
                                                          1196 
                                                          +
                                                          1198 // PIPELINE OUTPUT //
                                                          +
                                                          1200 
                                                          +
                                                          1201 typedef void (*PipelineComparator)(std::ostream &os,
                                                          +
                                                          1202  const PipelineInputList &,
                                                          +
                                                          1203  const std::vector<PipelineOutput> &,
                                                          +
                                                          1204  const PipelineOptions &);
                                                          +
                                                          1205 
                                                          +
                                                          1207 static cairo_status_t OstreamPlotter(void *closure, const unsigned char *data, unsigned int length) {
                                                          +
                                                          1208  std::ostream *os = (std::ostream *)closure;
                                                          +
                                                          1209  os->write((const char *)data, length);
                                                          +
                                                          1210  return CAIRO_STATUS_SUCCESS;
                                                          +
                                                          1211 }
                                                          +
                                                          1212 
                                                          +
                                                          1214 static void PipelineComparatorPlotRawInput(std::ostream &os,
                                                          +
                                                          1215  const PipelineInputList &expected,
                                                          +
                                                          1216  const std::vector<PipelineOutput> &,
                                                          +
                                                          1217  const PipelineOptions &) {
                                                          +
                                                          1218 
                                                          +
                                                          1219  cairo_surface_t *cairoSurface = expected[0]->InputImageSurface();
                                                          +
                                                          1220  cairo_surface_write_to_png_stream(cairoSurface, OstreamPlotter, &os);
                                                          +
                                                          1221  cairo_surface_destroy(cairoSurface);
                                                          +
                                                          1222 }
                                                          +
                                                          1223 
                                                          +
                                                          1225 // TODO: should probably use Expected methods, not Input methods, because future PipelineInputs could add noise to the result of the Input methods.
                                                          +
                                                          1226 static void PipelineComparatorPlotInput(std::ostream &os,
                                                          +
                                                          1227  const PipelineInputList &expected,
                                                          +
                                                          1228  const std::vector<PipelineOutput> &,
                                                          +
                                                          1229  const PipelineOptions &) {
                                                          +
                                                          1230  cairo_surface_t *cairoSurface = expected[0]->InputImageSurface();
                                                          +
                                                          1231  assert(expected[0]->InputStars() != NULL);
                                                          +
                                                          1232  SurfacePlot("pipeline input",
                                                          +
                                                          1233  cairoSurface,
                                                          +
                                                          1234  *expected[0]->InputStars(),
                                                          +
                                                          1235  expected[0]->InputStarIds(),
                                                          +
                                                          1236  &expected[0]->GetCatalog(),
                                                          +
                                                          1237  expected[0]->InputAttitude(),
                                                          +
                                                          1238  // green
                                                          +
                                                          1239  0.0, 1.0, 0.0, 0.6);
                                                          +
                                                          1240  cairo_surface_write_to_png_stream(cairoSurface, OstreamPlotter, &os);
                                                          +
                                                          1241  cairo_surface_destroy(cairoSurface);
                                                          +
                                                          1242 }
                                                          +
                                                          1243 
                                                          +
                                                          1244 static void PipelineComparatorPlotExpected(std::ostream &os,
                                                          +
                                                          1245  const PipelineInputList &expected,
                                                          +
                                                          1246  const std::vector<PipelineOutput> &,
                                                          +
                                                          1247  const PipelineOptions &) {
                                                          +
                                                          1248  cairo_surface_t *cairoSurface = expected[0]->InputImageSurface();
                                                          +
                                                          1249  assert(expected[0]->ExpectedStars() != NULL);
                                                          +
                                                          1250  SurfacePlot("expected output",
                                                          +
                                                          1251  cairoSurface,
                                                          +
                                                          1252  *expected[0]->ExpectedStars(),
                                                          +
                                                          1253  expected[0]->ExpectedStarIds(),
                                                          +
                                                          1254  &expected[0]->GetCatalog(),
                                                          +
                                                          1255  expected[0]->ExpectedAttitude(),
                                                          +
                                                          1256  // blu
                                                          +
                                                          1257  0.2, 0.5, 1.0, 0.7);
                                                          +
                                                          1258  cairo_surface_write_to_png_stream(cairoSurface, OstreamPlotter, &os);
                                                          +
                                                          1259  cairo_surface_destroy(cairoSurface);
                                                          +
                                                          1260 }
                                                          +
                                                          1261 
                                                          +
                                                          1263 static void PipelineComparatorCentroids(std::ostream &os,
                                                          +
                                                          1264  const PipelineInputList &expected,
                                                          +
                                                          1265  const std::vector<PipelineOutput> &actual,
                                                          +
                                                          1266  const PipelineOptions &values) {
                                                          +
                                                          1267  int size = (int)expected.size();
                                                          +
                                                          1268 
                                                          +
                                                          1269  float threshold = values.centroidCompareThreshold;
                                                          +
                                                          1270 
                                                          +
                                                          1271  std::vector<CentroidComparison> comparisons;
                                                          +
                                                          1272  for (int i = 0; i < size; i++) {
                                                          +
                                                          1273  comparisons.push_back(CentroidsCompare(threshold,
                                                          +
                                                          1274  *(expected[i]->ExpectedStars()),
                                                          +
                                                          1275  *(actual[i].stars)));
                                                          +
                                                          1276  }
                                                          +
                                                          1277 
                                                          +
                                                          1278  CentroidComparison result = CentroidComparisonsCombine(comparisons);
                                                          +
                                                          1279  os << "centroids_num_correct " << result.numCorrectCentroids << std::endl
                                                          +
                                                          1280  << "centroids_num_extra " << result.numExtraCentroids << std::endl
                                                          +
                                                          1281  << "centroids_mean_error " << result.meanError << std::endl;
                                                          +
                                                          1282 }
                                                          +
                                                          1283 
                                                          +
                                                          1284 static void PrintCentroids(const std::string &prefix,
                                                          +
                                                          1285  std::ostream &os,
                                                          +
                                                          1286  const Catalog &catalog,
                                                          +
                                                          1287  const std::vector<Stars> &starses,
                                                          +
                                                          1288  // May be NULL. Should be the only the first starId, because we don't have any reasonable aggregative action to perform.
                                                          +
                                                          1289  const StarIdentifiers *starIds) {
                                                          +
                                                          1290  assert(starses.size() > 0);
                                                          +
                                                          1291  float avgNumStars = 0;
                                                          +
                                                          1292  for (const Stars &stars : starses) {
                                                          +
                                                          1293  avgNumStars += stars.size();
                                                          +
                                                          1294  }
                                                          +
                                                          1295  avgNumStars /= starses.size();
                                                          +
                                                          1296 
                                                          +
                                                          1297  os << "num_" << prefix << "_centroids " << avgNumStars << std::endl;
                                                          +
                                                          1298  if (starses.size() == 1) {
                                                          +
                                                          1299  const Stars &stars = starses[0];
                                                          +
                                                          1300  for (int i = 0; i < (int)stars.size(); i++) {
                                                          +
                                                          1301  os << prefix << "_centroid_" << i << "_x " << stars[i].position.x << std::endl;
                                                          +
                                                          1302  os << prefix << "_centroid_" << i << "_y " << stars[i].position.y << std::endl;
                                                          +
                                                          1303  if (starIds) {
                                                          +
                                                          1304  for (const StarIdentifier &starId : *starIds) {
                                                          +
                                                          1305  if (starId.starIndex == i) {
                                                          +
                                                          1306  os << prefix << "_centroid_" << i << "_id " << catalog[starId.catalogIndex].name << std::endl;
                                                          +
                                                          1307  }
                                                          +
                                                          1308  }
                                                          +
                                                          1309  }
                                                          +
                                                          1310  }
                                                          +
                                                          1311  }
                                                          +
                                                          1312 }
                                                          +
                                                          1313 
                                                          +
                                                          1315 static void PipelineComparatorPrintExpectedCentroids(std::ostream &os,
                                                          +
                                                          1316  const PipelineInputList &expected,
                                                          +
                                                          1317  const std::vector<PipelineOutput> &, // actual
                                                          +
                                                          1318  const PipelineOptions &) {
                                                          +
                                                          1319  assert(expected.size() > 0);
                                                          +
                                                          1320  assert(expected[0]->ExpectedStars());
                                                          +
                                                          1321 
                                                          +
                                                          1322  std::vector<Stars> expectedStarses;
                                                          +
                                                          1323  for (const auto &input : expected) {
                                                          +
                                                          1324  expectedStarses.push_back(*input->ExpectedStars());
                                                          +
                                                          1325  }
                                                          +
                                                          1326  PrintCentroids("expected",
                                                          +
                                                          1327  os,
                                                          +
                                                          1328  expected[0]->GetCatalog(),
                                                          +
                                                          1329  expectedStarses,
                                                          +
                                                          1330  expected[0]->ExpectedStarIds());
                                                          +
                                                          1331 }
                                                          +
                                                          1332 
                                                          +
                                                          1333 static void PipelineComparatorPrintInputCentroids(std::ostream &os,
                                                          +
                                                          1334  const PipelineInputList &expected,
                                                          +
                                                          1335  const std::vector<PipelineOutput> &, // actual
                                                          +
                                                          1336  const PipelineOptions &) {
                                                          +
                                                          1337  assert(expected.size() > 0);
                                                          +
                                                          1338  assert(expected[0]->InputStars());
                                                          +
                                                          1339 
                                                          +
                                                          1340  std::vector<Stars> inputStarses;
                                                          +
                                                          1341  for (const auto &input : expected) {
                                                          +
                                                          1342  inputStarses.push_back(*input->InputStars());
                                                          +
                                                          1343  }
                                                          +
                                                          1344  PrintCentroids("input",
                                                          +
                                                          1345  os,
                                                          +
                                                          1346  expected[0]->GetCatalog(),
                                                          +
                                                          1347  inputStarses,
                                                          +
                                                          1348  expected[0]->InputStarIds());
                                                          +
                                                          1349 }
                                                          +
                                                          1350 
                                                          +
                                                          1351 static void PipelineComparatorPrintActualCentroids(std::ostream &os,
                                                          +
                                                          1352  const PipelineInputList &expected, // expected
                                                          +
                                                          1353  const std::vector<PipelineOutput> &actual,
                                                          +
                                                          1354  const PipelineOptions &values) {
                                                          +
                                                          1355  assert(actual.size() > 0);
                                                          +
                                                          1356  assert(actual[0].stars);
                                                          +
                                                          1357 
                                                          +
                                                          1358  std::vector<Stars> actualStarses;
                                                          +
                                                          1359  for (const auto &output : actual) {
                                                          +
                                                          1360  actualStarses.push_back(*output.stars);
                                                          +
                                                          1361  }
                                                          +
                                                          1362  PrintCentroids("actual",
                                                          +
                                                          1363  os,
                                                          +
                                                          1364  actual[0].catalog,
                                                          +
                                                          1365  actualStarses,
                                                          +
                                                          1366  actual[0].starIds.get());
                                                          +
                                                          1367 
                                                          +
                                                          1368  if (expected.size() == 1 && expected[0]->ExpectedStars() && expected[0]->ExpectedStarIds()) {
                                                          +
                                                          1369  // also print expected ID of each one
                                                          +
                                                          1370  const Stars &actualStars = *actual[0].stars;
                                                          +
                                                          1371  const Stars &expectedStars = *expected[0]->ExpectedStars();
                                                          +
                                                          1372  std::multimap<int, int> actualToExpectedCentroids = FindClosestCentroids(values.centroidCompareThreshold, actualStars, expectedStars);
                                                          +
                                                          1373  for (int i = 0; i < (int)actualStars.size(); i++) {
                                                          +
                                                          1374  auto range = actualToExpectedCentroids.equal_range(i);
                                                          +
                                                          1375  auto it = range.first;
                                                          +
                                                          1376  auto end = range.second;
                                                          +
                                                          1377  for (int j = 0;
                                                          +
                                                          1378  it != end;
                                                          +
                                                          1379  j++, it++) {
                                                          +
                                                          1380 
                                                          +
                                                          1381  int expectedCentroidIndex = it->second;
                                                          +
                                                          1382  bool foundIt = false; // just to be sure
                                                          +
                                                          1383  for (const StarIdentifier &starId : *expected[0]->ExpectedStarIds()) {
                                                          +
                                                          1384  if (starId.starIndex == expectedCentroidIndex) {
                                                          +
                                                          1385  assert(!foundIt);
                                                          +
                                                          1386  int expectedName = expected[0]->GetCatalog()[starId.catalogIndex].name;
                                                          +
                                                          1387  std::cout << "actual_centroid_" << i << "_expected_id_" << j << " " << expectedName << std::endl;
                                                          +
                                                          1388  foundIt = true;
                                                          +
                                                          1389  }
                                                          +
                                                          1390  }
                                                          +
                                                          1391  }
                                                          +
                                                          1392  }
                                                          +
                                                          1393  }
                                                          +
                                                          1394 }
                                                          +
                                                          1395 
                                                          + +
                                                          1399  const PipelineInputList &expected,
                                                          +
                                                          1400  const std::vector<PipelineOutput> &actual,
                                                          +
                                                          1401  const PipelineOptions &) {
                                                          +
                                                          1402  const Stars &stars = actual[0].stars ? *actual[0].stars : *expected[0]->InputStars();
                                                          +
                                                          1403  StarIdentifiers identifiers;
                                                          +
                                                          1404  for (int i = 0; i < (int)stars.size(); i++) {
                                                          +
                                                          1405  identifiers.push_back(StarIdentifier(i, i));
                                                          +
                                                          1406  }
                                                          +
                                                          1407  cairo_surface_t *cairoSurface = expected[0]->InputImageSurface();
                                                          +
                                                          1408  SurfacePlot("centroid indices (input)",
                                                          +
                                                          1409  cairoSurface,
                                                          +
                                                          1410  stars,
                                                          +
                                                          1411  &identifiers,
                                                          +
                                                          1412  &actual[0].catalog,
                                                          +
                                                          1413  NULL,
                                                          +
                                                          1414  // orange
                                                          +
                                                          1415  1.0, 0.5, 0.0, 0.5,
                                                          +
                                                          1416  // don't resolve names
                                                          +
                                                          1417  true);
                                                          +
                                                          1418  cairo_surface_write_to_png_stream(cairoSurface, OstreamPlotter, &os);
                                                          +
                                                          1419  cairo_surface_destroy(cairoSurface);
                                                          +
                                                          1420 }
                                                          +
                                                          1421 
                                                          +
                                                          1423 static void PipelineComparatorPlotOutput(std::ostream &os,
                                                          +
                                                          1424  const PipelineInputList &expected,
                                                          +
                                                          1425  const std::vector<PipelineOutput> &actual,
                                                          +
                                                          1426  const PipelineOptions &) {
                                                          +
                                                          1427  // don't need to worry about mutating the surface; InputImageSurface returns a fresh one
                                                          +
                                                          1428  cairo_surface_t *cairoSurface = expected[0]->InputImageSurface();
                                                          +
                                                          1429  SurfacePlot("pipeline output",
                                                          +
                                                          1430  cairoSurface,
                                                          +
                                                          1431  actual[0].stars ? *actual[0].stars : *expected[0]->InputStars(),
                                                          +
                                                          1432  actual[0].starIds.get(),
                                                          +
                                                          1433  &actual[0].catalog,
                                                          +
                                                          1434  actual[0].attitude.get(),
                                                          +
                                                          1435  // red
                                                          +
                                                          1436  1.0, 0.0, 0.0, 0.5);
                                                          +
                                                          1437  cairo_surface_write_to_png_stream(cairoSurface, OstreamPlotter, &os);
                                                          +
                                                          1438  cairo_surface_destroy(cairoSurface);
                                                          +
                                                          1439 }
                                                          +
                                                          1440 
                                                          +
                                                          1442 static void PipelineComparatorStarIds(std::ostream &os,
                                                          +
                                                          1443  const PipelineInputList &expected,
                                                          +
                                                          1444  const std::vector<PipelineOutput> &actual,
                                                          +
                                                          1445  const PipelineOptions &values) {
                                                          +
                                                          1446  int numImagesCorrect = 0;
                                                          +
                                                          1447  int numImagesIncorrect = 0;
                                                          +
                                                          1448  int numImagesTotal = expected.size();
                                                          +
                                                          1449  for (int i = 0; i < numImagesTotal; i++) {
                                                          +
                                                          1450  // since the actual star IDs exist, it must have gotten input from somewhere!
                                                          +
                                                          1451  // TODO: overhaul: It seems that in these comparators there should be a more fundamental way to figure out the input that was actually sent to a stage.
                                                          +
                                                          1452  // I.e., instead of having expected and actual arguments, have some sort of PipelineRunSummary object, where the InputStars method looks at actual, then input.
                                                          +
                                                          1453  assert(actual[i].stars.get() || expected[i]->InputStars());
                                                          +
                                                          1454 
                                                          +
                                                          1455  const Stars &inputStars = actual[i].stars.get()
                                                          +
                                                          1456  ? *actual[i].stars.get()
                                                          +
                                                          1457  : *expected[i]->InputStars();
                                                          +
                                                          1458  StarIdComparison comparison =
                                                          +
                                                          1459  StarIdsCompare(*expected[i]->ExpectedStarIds(), *actual[i].starIds,
                                                          +
                                                          1460  expected[i]->GetCatalog(), actual[i].catalog,
                                                          +
                                                          1461  values.centroidCompareThreshold, *expected[i]->ExpectedStars(), inputStars);
                                                          +
                                                          1462 
                                                          +
                                                          1463  if (numImagesTotal == 1) {
                                                          +
                                                          1464  os << "starid_num_correct " << comparison.numCorrect << std::endl;
                                                          +
                                                          1465  os << "starid_num_incorrect " << comparison.numIncorrect << std::endl;
                                                          +
                                                          1466  os << "starid_num_total " << comparison.numTotal << std::endl;
                                                          +
                                                          1467  }
                                                          +
                                                          1468 
                                                          +
                                                          1469  if (comparison.numCorrect > 0 && comparison.numIncorrect == 0) {
                                                          +
                                                          1470  numImagesCorrect++;
                                                          +
                                                          1471  }
                                                          +
                                                          1472  if (comparison.numIncorrect > 0) {
                                                          +
                                                          1473  numImagesIncorrect++;
                                                          +
                                                          1474  }
                                                          +
                                                          1475  }
                                                          +
                                                          1476 
                                                          +
                                                          1477  // A "correct" image is one where at least two stars are correctly id'd and none are incorrectly id'd
                                                          +
                                                          1478  os << "starid_num_images_correct " << numImagesCorrect << std::endl;
                                                          +
                                                          1479  os << "starid_num_images_incorrect " << numImagesIncorrect << std::endl;
                                                          +
                                                          1480 }
                                                          +
                                                          1481 
                                                          +
                                                          1482 static void PrintAttitude(std::ostream &os, const std::string &prefix, const Attitude &attitude) {
                                                          +
                                                          1483  if (attitude.IsKnown()) {
                                                          +
                                                          1484  os << prefix << "attitude_known 1" << std::endl;
                                                          +
                                                          1485 
                                                          +
                                                          1486  EulerAngles spherical = attitude.ToSpherical();
                                                          +
                                                          1487  os << prefix << "attitude_ra " << RadToDeg(spherical.ra) << std::endl;
                                                          +
                                                          1488  os << prefix << "attitude_de " << RadToDeg(spherical.de) << std::endl;
                                                          +
                                                          1489  os << prefix << "attitude_roll " << RadToDeg(spherical.roll) << std::endl;
                                                          +
                                                          1490 
                                                          +
                                                          1491  Quaternion q = attitude.GetQuaternion();
                                                          +
                                                          1492  os << prefix << "attitude_i " << q.i << std::endl;
                                                          +
                                                          1493  os << prefix << "attitude_j " << q.j << std::endl;
                                                          +
                                                          1494  os << prefix << "attitude_k " << q.k << std::endl;
                                                          +
                                                          1495  os << prefix << "attitude_real " << q.real << std::endl;
                                                          +
                                                          1496 
                                                          +
                                                          1497  } else {
                                                          +
                                                          1498  os << prefix << "attitude_known 0" << std::endl;
                                                          +
                                                          1499  }
                                                          +
                                                          1500 }
                                                          +
                                                          1501 
                                                          +
                                                          1503 static void PipelineComparatorPrintAttitude(std::ostream &os,
                                                          +
                                                          1504  const PipelineInputList &,
                                                          +
                                                          1505  const std::vector<PipelineOutput> &actual,
                                                          +
                                                          1506  const PipelineOptions &) {
                                                          +
                                                          1507  assert(actual.size() == 1);
                                                          +
                                                          1508  assert(actual[0].attitude);
                                                          +
                                                          1509  PrintAttitude(os, "", *actual[0].attitude);
                                                          +
                                                          1510 }
                                                          +
                                                          1511 
                                                          +
                                                          1512 static void PipelineComparatorPrintExpectedAttitude(std::ostream &os,
                                                          +
                                                          1513  const PipelineInputList &expected,
                                                          +
                                                          1514  const std::vector<PipelineOutput> &,
                                                          +
                                                          1515  const PipelineOptions &) {
                                                          +
                                                          1516  assert(expected.size() == 1);
                                                          +
                                                          1517  assert(expected[0]->ExpectedAttitude());
                                                          +
                                                          1518  PrintAttitude(os, "expected_", *expected[0]->ExpectedAttitude());
                                                          +
                                                          1519 }
                                                          +
                                                          1520 
                                                          +
                                                          1522 static void PipelineComparatorAttitude(std::ostream &os,
                                                          +
                                                          1523  const PipelineInputList &expected,
                                                          +
                                                          1524  const std::vector<PipelineOutput> &actual,
                                                          +
                                                          1525  const PipelineOptions &values) {
                                                          +
                                                          1526 
                                                          +
                                                          1527  // TODO: use Wahba loss function (maybe average per star) instead of just angle. Also break
                                                          +
                                                          1528  // apart roll error from boresight error. This is just quick and dirty for testing
                                                          +
                                                          1529 
                                                          +
                                                          1530  float angleThreshold = DegToRad(values.attitudeCompareThreshold);
                                                          +
                                                          1531 
                                                          +
                                                          1532  float attitudeErrorSum = 0.0f;
                                                          +
                                                          1533  int numCorrect = 0;
                                                          +
                                                          1534  int numIncorrect = 0;
                                                          +
                                                          1535 
                                                          +
                                                          1536  for (int i = 0; i < (int)expected.size(); i++) {
                                                          +
                                                          1537  if (actual[i].attitude->IsKnown()) {
                                                          +
                                                          1538  Quaternion expectedQuaternion = expected[i]->ExpectedAttitude()->GetQuaternion();
                                                          +
                                                          1539  Quaternion actualQuaternion = actual[i].attitude->GetQuaternion();
                                                          +
                                                          1540  float attitudeError = (expectedQuaternion * actualQuaternion.Conjugate()).SmallestAngle();
                                                          +
                                                          1541  assert(attitudeError >= 0);
                                                          +
                                                          1542 
                                                          +
                                                          1543  if (attitudeError <= angleThreshold) {
                                                          +
                                                          1544  attitudeErrorSum += attitudeError;
                                                          +
                                                          1545  numCorrect++;
                                                          +
                                                          1546  } else {
                                                          +
                                                          1547  numIncorrect++;
                                                          +
                                                          1548  }
                                                          +
                                                          1549  }
                                                          +
                                                          1550  }
                                                          +
                                                          1551 
                                                          +
                                                          1552  float attitudeErrorMean = attitudeErrorSum / numCorrect;
                                                          +
                                                          1553  float fractionCorrect = (float)numCorrect / expected.size();
                                                          +
                                                          1554  float fractionIncorrect = (float)numIncorrect / expected.size();
                                                          +
                                                          1555 
                                                          +
                                                          1556  os << "attitude_error_mean " << attitudeErrorMean << std::endl;
                                                          +
                                                          1557  os << "attitude_availability " << fractionCorrect << std::endl;
                                                          +
                                                          1558  os << "attitude_error_rate " << fractionIncorrect << std::endl;
                                                          +
                                                          1559 }
                                                          +
                                                          1560 
                                                          +
                                                          1561 static void PrintTimeStats(std::ostream &os, const std::string &prefix, const std::vector<long long> &times) {
                                                          +
                                                          1562  assert(times.size() > 0);
                                                          +
                                                          1563 
                                                          +
                                                          1564  // print average, min, max, and 95% max
                                                          +
                                                          1565  long long sum = 0;
                                                          +
                                                          1566  long long min = LONG_MAX;
                                                          +
                                                          1567  long long max = 0;
                                                          +
                                                          1568  for (int i = 0; i < (int)times.size(); i++) {
                                                          +
                                                          1569  assert(times[i] > 0);
                                                          +
                                                          1570  sum += times[i];
                                                          +
                                                          1571  min = std::min(min, times[i]);
                                                          +
                                                          1572  max = std::max(max, times[i]);
                                                          +
                                                          1573  }
                                                          +
                                                          1574  long average = sum / times.size();
                                                          +
                                                          1575  std::vector<long long> sortedTimes = times;
                                                          +
                                                          1576  std::sort(sortedTimes.begin(), sortedTimes.end());
                                                          +
                                                          1577  // what really is the 95th percentile? Being conservative, we want to pick a value that at least
                                                          +
                                                          1578  // 95% of the times are less than. This means: (1) finding the number of times, (2) Finding
                                                          +
                                                          1579  // Math.ceil(0.95 * numTimes), and (3) subtracting 1 to get the index.
                                                          +
                                                          1580  int ninetyFiveIndex = (int)std::ceil(0.95 * times.size()) - 1;
                                                          +
                                                          1581  assert(ninetyFiveIndex >= 0);
                                                          +
                                                          1582  long long ninetyFifthPercentile = sortedTimes[ninetyFiveIndex];
                                                          +
                                                          1583 
                                                          +
                                                          1584  os << prefix << "_average_ns " << average << std::endl;
                                                          +
                                                          1585  os << prefix << "_min_ns " << min << std::endl;
                                                          +
                                                          1586  os << prefix << "_max_ns " << max << std::endl;
                                                          +
                                                          1587  os << prefix << "_95%_ns " << ninetyFifthPercentile << std::endl;
                                                          +
                                                          1588 }
                                                          +
                                                          1589 
                                                          +
                                                          1591 static void PipelineComparatorPrintSpeed(std::ostream &os,
                                                          +
                                                          1592  const PipelineInputList &,
                                                          +
                                                          1593  const std::vector<PipelineOutput> &actual,
                                                          +
                                                          1594  const PipelineOptions &) {
                                                          +
                                                          1595  std::vector<long long> centroidingTimes;
                                                          +
                                                          1596  std::vector<long long> starIdTimes;
                                                          +
                                                          1597  std::vector<long long> attitudeTimes;
                                                          +
                                                          1598  std::vector<long long> totalTimes;
                                                          +
                                                          1599  for (int i = 0; i < (int)actual.size(); i++) {
                                                          +
                                                          1600  long long totalTime = 0;
                                                          +
                                                          1601  if (actual[i].centroidingTimeNs > 0) {
                                                          +
                                                          1602  centroidingTimes.push_back(actual[i].centroidingTimeNs);
                                                          +
                                                          1603  totalTime += actual[i].centroidingTimeNs;
                                                          +
                                                          1604  }
                                                          +
                                                          1605  if (actual[i].starIdTimeNs > 0) {
                                                          +
                                                          1606  starIdTimes.push_back(actual[i].starIdTimeNs);
                                                          +
                                                          1607  totalTime += actual[i].starIdTimeNs;
                                                          +
                                                          1608  }
                                                          +
                                                          1609  if (actual[i].attitudeEstimationTimeNs > 0) {
                                                          +
                                                          1610  attitudeTimes.push_back(actual[i].attitudeEstimationTimeNs);
                                                          +
                                                          1611  totalTime += actual[i].attitudeEstimationTimeNs;
                                                          +
                                                          1612  }
                                                          +
                                                          1613  totalTimes.push_back(totalTime);
                                                          +
                                                          1614  }
                                                          +
                                                          1615  if (centroidingTimes.size() > 0) {
                                                          +
                                                          1616  PrintTimeStats(os, "centroiding", centroidingTimes);
                                                          +
                                                          1617  }
                                                          +
                                                          1618  if (starIdTimes.size() > 0) {
                                                          +
                                                          1619  PrintTimeStats(os, "starid", starIdTimes);
                                                          +
                                                          1620  }
                                                          +
                                                          1621  if (attitudeTimes.size() > 0) {
                                                          +
                                                          1622  PrintTimeStats(os, "attitude", attitudeTimes);
                                                          +
                                                          1623  }
                                                          +
                                                          1624  if (centroidingTimes.size() > 0 || starIdTimes.size() > 0 || attitudeTimes.size() > 0) {
                                                          +
                                                          1625  PrintTimeStats(os, "total", totalTimes);
                                                          +
                                                          1626  }
                                                          +
                                                          1627 }
                                                          +
                                                          1628 
                                                          +
                                                          1629 // TODO: add these debug comparators back in!
                                                          +
                                                          1630 // void PipelineComparatorPrintPairDistance(std::ostream &os,
                                                          +
                                                          1631 // const PipelineInputList &expected,
                                                          +
                                                          1632 // const std::vector<PipelineOutput> &actual) {
                                                          +
                                                          1633 // int index1 = Prompt<int>("Index of first star");
                                                          +
                                                          1634 // int index2 = Prompt<int>("Index of second star");
                                                          +
                                                          1635 
                                                          +
                                                          1636 // const Camera &camera = *expected[0]->InputCamera();
                                                          +
                                                          1637 // const Stars &stars = *actual[0].stars;
                                                          +
                                                          1638 
                                                          +
                                                          1639 // assert(index1 >= 0 && index2 >= 0 && index1 < (int)stars.size() && index2 < (int)stars.size());
                                                          +
                                                          1640 // os << "pair_distance " << Angle(camera.CameraToSpatial(stars[index1].position),
                                                          +
                                                          1641 // camera.CameraToSpatial(stars[index2].position))
                                                          +
                                                          1642 // << std::endl;
                                                          +
                                                          1643 // }
                                                          +
                                                          1644 
                                                          +
                                                          1645 // void PipelineComparatorPrintPyramidDistances(std::ostream &os,
                                                          +
                                                          1646 // const PipelineInputList &expected,
                                                          +
                                                          1647 // const std::vector<PipelineOutput> &actual) {
                                                          +
                                                          1648 // int index1 = Prompt<int>("Catalog name/index of first star");
                                                          +
                                                          1649 // int index2 = Prompt<int>("Catalog name/index of second star");
                                                          +
                                                          1650 // int index3 = Prompt<int>("Catalog name/index of third star");
                                                          +
                                                          1651 // int index4 = Prompt<int>("Catalog name/index of four star");
                                                          +
                                                          1652 
                                                          +
                                                          1653 // const Camera &camera = *expected[0]->InputCamera();
                                                          +
                                                          1654 // const Stars &stars = *actual[0].stars;
                                                          +
                                                          1655 
                                                          +
                                                          1656 // Vec3 spatial1 = camera.CameraToSpatial(stars[index1].position);
                                                          +
                                                          1657 // Vec3 spatial2 = camera.CameraToSpatial(stars[index2].position);
                                                          +
                                                          1658 // Vec3 spatial3 = camera.CameraToSpatial(stars[index3].position);
                                                          +
                                                          1659 // Vec3 spatial4 = camera.CameraToSpatial(stars[index4].position);
                                                          +
                                                          1660 
                                                          +
                                                          1661 // std::cout << "pair_distance_12 " << Angle(spatial1, spatial2) << std::endl;
                                                          +
                                                          1662 // std::cout << "pair_distance_13 " << Angle(spatial1, spatial3) << std::endl;
                                                          +
                                                          1663 // std::cout << "pair_distance_14 " << Angle(spatial1, spatial4) << std::endl;
                                                          +
                                                          1664 // std::cout << "pair_distance_23 " << Angle(spatial2, spatial3) << std::endl;
                                                          +
                                                          1665 // std::cout << "pair_distance_24 " << Angle(spatial2, spatial4) << std::endl;
                                                          +
                                                          1666 // std::cout << "pair_distance_34 " << Angle(spatial3, spatial4) << std::endl;
                                                          +
                                                          1667 // }
                                                          +
                                                          1668 
                                                          +
                                                          1669 // void PipelineComparatorPrintTripleAngle(std::ostream &os,
                                                          +
                                                          1670 // const PipelineInputList &expected,
                                                          +
                                                          1671 // const std::vector<PipelineOutput> &actual) {
                                                          +
                                                          1672 // int index1 = Prompt<int>("Index of first star");
                                                          +
                                                          1673 // int index2 = Prompt<int>("Index of second star");
                                                          +
                                                          1674 // int index3 = Prompt<int>("Index of third star");
                                                          +
                                                          1675 
                                                          +
                                                          1676 // const Camera &camera = *expected[0]->InputCamera();
                                                          +
                                                          1677 // const Stars &stars = *actual[0].stars;
                                                          +
                                                          1678 
                                                          +
                                                          1679 // assert(index1 >= 0 && index1 < (int)stars.size());
                                                          +
                                                          1680 // assert(index2 >= 0 && index2 < (int)stars.size());
                                                          +
                                                          1681 // assert(index3 >= 0 && index3 < (int)stars.size());
                                                          +
                                                          1682 
                                                          +
                                                          1683 // // TODO, when merging with nondimensional branch
                                                          +
                                                          1684 // }
                                                          +
                                                          1685 
                                                          + +
                                                          1691  const std::vector<PipelineOutput> &actual,
                                                          +
                                                          1692  const PipelineOptions &values) {
                                                          +
                                                          1693  if (actual.size() == 0) {
                                                          +
                                                          1694  std::cerr << "ERROR: No output! Did you specify any input images? Try --png or --generate." << std::endl;
                                                          +
                                                          1695  exit(1);
                                                          +
                                                          1696  }
                                                          +
                                                          1697 
                                                          +
                                                          1698  assert(expected.size() == actual.size() && expected.size() > 0);
                                                          +
                                                          1699 
                                                          +
                                                          1700  // TODO: Remove the asserts and print out more reasonable error messages.
                                                          +
                                                          1701 
                                                          +
                                                          1702 #define LOST_PIPELINE_COMPARE(precondition, errmsg, comparator, path, isBinary) do { \
                                                          +
                                                          1703  if (precondition) { \
                                                          +
                                                          1704  UserSpecifiedOutputStream pos(path, isBinary); \
                                                          +
                                                          1705  comparator(pos.Stream(), expected, actual, values); \
                                                          +
                                                          1706  } else { \
                                                          +
                                                          1707  std::cerr << "ERROR: Comparator not applicable: " << errmsg << std::endl; \
                                                          +
                                                          1708  exit(1); \
                                                          +
                                                          1709  } \
                                                          +
                                                          1710  } while (0)
                                                          +
                                                          1711 
                                                          +
                                                          1712  if (values.plotRawInput != "") {
                                                          +
                                                          1713  LOST_PIPELINE_COMPARE(expected[0]->InputImage() && expected.size() == 1,
                                                          +
                                                          1714  "--plot-raw-input requires exactly 1 input image, but " + std::to_string(expected.size()) + " many were provided.",
                                                          +
                                                          1715  PipelineComparatorPlotRawInput, values.plotRawInput, true);
                                                          +
                                                          1716  }
                                                          +
                                                          1717 
                                                          +
                                                          1718  if (values.plotInput != "") {
                                                          +
                                                          1719  LOST_PIPELINE_COMPARE(expected[0]->InputImage() && expected.size() == 1 && expected[0]->InputStars(),
                                                          +
                                                          1720  "--plot-input requires exactly 1 input image, and for centroids to be available on that input image. " + std::to_string(expected.size()) + " many input images were provided.",
                                                          +
                                                          1721  PipelineComparatorPlotInput, values.plotInput, true);
                                                          +
                                                          1722  }
                                                          +
                                                          1723  if (values.plotExpected != "") {
                                                          +
                                                          1724  LOST_PIPELINE_COMPARE(expected[0]->InputImage() && expected.size() == 1 && expected[0]->ExpectedStars(),
                                                          +
                                                          1725  "--plot-expected-input requires exactly 1 input image, and for expected centroids to be available on that input image. " + std::to_string(expected.size()) + " many input images were provided.",
                                                          +
                                                          1726  PipelineComparatorPlotExpected, values.plotExpected, true);
                                                          +
                                                          1727  }
                                                          +
                                                          1728  if (values.plotOutput != "") {
                                                          +
                                                          1729  LOST_PIPELINE_COMPARE(actual.size() == 1 && (actual[0].stars || actual[0].starIds),
                                                          +
                                                          1730  "--plot-output requires exactly 1 output image, and for either centroids or star IDs to be available on that output image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          +
                                                          1731  PipelineComparatorPlotOutput, values.plotOutput, true);
                                                          +
                                                          1732  }
                                                          +
                                                          1733  if (values.printExpectedCentroids != "") {
                                                          +
                                                          1734  LOST_PIPELINE_COMPARE(expected[0]->ExpectedStars(),
                                                          +
                                                          1735  "--print-expected-centroids requires at least 1 input with expected centroids. " + std::to_string(expected.size()) + " many input images were provided.",
                                                          +
                                                          1736  PipelineComparatorPrintExpectedCentroids, values.printExpectedCentroids, false);
                                                          +
                                                          1737  }
                                                          +
                                                          1738  if (values.printInputCentroids != "") {
                                                          +
                                                          1739  LOST_PIPELINE_COMPARE(expected[0]->InputStars(),
                                                          +
                                                          1740  "--print-input-centroids requires at least 1 input with centroids. " + std::to_string(expected.size()) + " many input images were provided.",
                                                          +
                                                          1741  PipelineComparatorPrintInputCentroids, values.printInputCentroids, false);
                                                          +
                                                          1742  }
                                                          +
                                                          1743  if (values.printActualCentroids != "") {
                                                          +
                                                          1744  LOST_PIPELINE_COMPARE(actual[0].stars,
                                                          +
                                                          1745  "--print-actual-centroids requires at least 1 output image, and for centroids to be available on the output images. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          +
                                                          1746  PipelineComparatorPrintActualCentroids, values.printActualCentroids, false);
                                                          +
                                                          1747  }
                                                          +
                                                          1748  if (values.plotCentroidIndices != "") {
                                                          +
                                                          1749  LOST_PIPELINE_COMPARE(expected.size() == 1 && expected[0]->InputImage(),
                                                          +
                                                          1750  "--plot-centroid-indices requires exactly 1 input with image. " + std::to_string(expected.size()) + " many inputs were provided.",
                                                          +
                                                          1751  PipelineComparatorPlotCentroidIndices, values.plotCentroidIndices, true);
                                                          +
                                                          1752  }
                                                          +
                                                          1753  if (values.compareCentroids != "") {
                                                          +
                                                          1754  LOST_PIPELINE_COMPARE(actual[0].stars && expected[0]->ExpectedStars() && values.centroidCompareThreshold,
                                                          +
                                                          1755  "--compare-centroids requires at least 1 output image, and for expected centroids to be available on the input image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          +
                                                          1756  PipelineComparatorCentroids, values.compareCentroids, false);
                                                          +
                                                          1757  }
                                                          +
                                                          1758  if (values.compareStarIds != "") {
                                                          +
                                                          1759  LOST_PIPELINE_COMPARE(expected[0]->ExpectedStarIds() && actual[0].starIds && expected[0]->ExpectedStars(),
                                                          +
                                                          1760  "--compare-star-ids requires at least 1 output image, and for expected star IDs and centroids to be available on the input image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          +
                                                          1761  PipelineComparatorStarIds, values.compareStarIds, false);
                                                          +
                                                          1762  }
                                                          +
                                                          1763  if (values.printAttitude != "") {
                                                          +
                                                          1764  LOST_PIPELINE_COMPARE(actual[0].attitude && actual.size() == 1,
                                                          +
                                                          1765  "--print-attitude requires exactly 1 output image, and for attitude to be available on that output image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          +
                                                          1766  PipelineComparatorPrintAttitude, values.printAttitude, false);
                                                          +
                                                          1767  }
                                                          +
                                                          1768  if (values.printExpectedAttitude != "") {
                                                          +
                                                          1769  LOST_PIPELINE_COMPARE(expected[0]->ExpectedAttitude() && expected.size() == 1,
                                                          +
                                                          1770  "--print-expected-attitude requires exactly 1 input image, and for expected attitude to be available on that input image. " + std::to_string(expected.size()) + " many input images were provided.",
                                                          +
                                                          1771  PipelineComparatorPrintExpectedAttitude, values.printExpectedAttitude, false);
                                                          +
                                                          1772  }
                                                          +
                                                          1773  if (values.compareAttitudes != "") {
                                                          +
                                                          1774  LOST_PIPELINE_COMPARE(actual[0].attitude && expected[0]->ExpectedAttitude() && values.attitudeCompareThreshold,
                                                          +
                                                          1775  "--compare-attitudes requires at least 1 output image, and for expected attitude to be available on the input image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          +
                                                          1776  PipelineComparatorAttitude, values.compareAttitudes, false);
                                                          +
                                                          1777  }
                                                          +
                                                          1778  if (values.printSpeed != "") {
                                                          +
                                                          1779  LOST_PIPELINE_COMPARE(actual.size() > 0,
                                                          +
                                                          1780  // I don't think this should ever actually happen??
                                                          +
                                                          1781  "--print-speed requires at least 1 output image. " + std::to_string(actual.size()) + " many output images were provided.",
                                                          +
                                                          1782  PipelineComparatorPrintSpeed, values.printSpeed, false);
                                                          +
                                                          1783  }
                                                          +
                                                          1784 
                                                          +
                                                          1785 #undef LOST_PIPELINE_COMPARE
                                                          +
                                                          1786 }
                                                          +
                                                          1787 
                                                          +
                                                          1788 // TODO: Add CLI options for all the inspectors!
                                                          +
                                                          1789 
                                                          +
                                                          1790 // typedef void (*CatalogInspector)(const Catalog &);
                                                          +
                                                          1791 
                                                          +
                                                          1792 // static std::vector<const CatalogStar *> PromptCatalogStars(const Catalog &catalog, int howMany) {
                                                          +
                                                          1793 // std::vector<const CatalogStar *> result;
                                                          +
                                                          1794 // for (int i = 0; i < howMany; i++) {
                                                          +
                                                          1795 // int name = Prompt<int>("Catalog name of " + std::to_string(i) + "-th star");
                                                          +
                                                          1796 // const CatalogStar *star = findNamedStar(catalog, name);
                                                          +
                                                          1797 // if (star == NULL) {
                                                          +
                                                          1798 // std::cerr << "Star not found!" << std::endl;
                                                          +
                                                          1799 // exit(1);
                                                          +
                                                          1800 // }
                                                          +
                                                          1801 // result.push_back(star);
                                                          +
                                                          1802 // }
                                                          +
                                                          1803 // return result;
                                                          +
                                                          1804 // }
                                                          +
                                                          1805 
                                                          +
                                                          1806 // void InspectPairDistance(const Catalog &catalog) {
                                                          +
                                                          1807 // auto stars = PromptCatalogStars(catalog, 2);
                                                          +
                                                          1808 
                                                          +
                                                          1809 // // TODO: not cout, prompt for an ostream in inspect and pass argument
                                                          +
                                                          1810 // std::cout << Angle(stars[0]->spatial, stars[1]->spatial) << std::endl;
                                                          +
                                                          1811 // }
                                                          +
                                                          1812 
                                                          +
                                                          1813 // void InspectPyramidDistances(const Catalog &catalog) {
                                                          +
                                                          1814 // auto stars = PromptCatalogStars(catalog, 4);
                                                          +
                                                          1815 
                                                          +
                                                          1816 // std::cout << "pair_distance_01 " << Angle(stars[0]->spatial, stars[1]->spatial) << std::endl;
                                                          +
                                                          1817 // std::cout << "pair_distance_02 " << Angle(stars[0]->spatial, stars[2]->spatial) << std::endl;
                                                          +
                                                          1818 // std::cout << "pair_distance_03 " << Angle(stars[0]->spatial, stars[3]->spatial) << std::endl;
                                                          +
                                                          1819 // std::cout << "pair_distance_12 " << Angle(stars[1]->spatial, stars[2]->spatial) << std::endl;
                                                          +
                                                          1820 // std::cout << "pair_distance_13 " << Angle(stars[1]->spatial, stars[3]->spatial) << std::endl;
                                                          +
                                                          1821 // std::cout << "pair_distance_23 " << Angle(stars[2]->spatial, stars[3]->spatial) << std::endl;
                                                          +
                                                          1822 // }
                                                          +
                                                          1823 
                                                          +
                                                          1824 // void InspectTripleAngle(const Catalog &catalog) {
                                                          +
                                                          1825 // auto stars = PromptCatalogStars(catalog, 3);
                                                          +
                                                          1826 
                                                          +
                                                          1827 // // TODO
                                                          +
                                                          1828 // }
                                                          +
                                                          1829 
                                                          +
                                                          1830 // void InspectFindStar(const Catalog &catalog) {
                                                          +
                                                          1831 // std::string raStr = PromptLine("Right Ascension");
                                                          +
                                                          1832 
                                                          +
                                                          1833 // float raRadians;
                                                          +
                                                          1834 
                                                          +
                                                          1835 // int raHours, raMinutes;
                                                          +
                                                          1836 // float raSeconds;
                                                          +
                                                          1837 // int raFormatTime = sscanf(raStr.c_str(), "%dh %dm %fs", &raHours, &raMinutes, &raSeconds);
                                                          +
                                                          1838 
                                                          +
                                                          1839 // float raDeg;
                                                          +
                                                          1840 // int raFormatDeg = sscanf(raStr.c_str(), "%f", &raDeg);
                                                          +
                                                          1841 
                                                          +
                                                          1842 // if (raFormatTime == 3) {
                                                          +
                                                          1843 // raRadians = (raHours * 2*M_PI/24) + (raMinutes * 2*M_PI/24/60) + (raSeconds * 2*M_PI/24/60/60);
                                                          +
                                                          1844 // } else if (raFormatDeg == 1) {
                                                          +
                                                          1845 // raRadians = DegToRad(raFormatDeg);
                                                          +
                                                          1846 // } else {
                                                          +
                                                          1847 // std::cerr << "Invalid right ascension format. Do \"09h 38m 29.8754s\" or a number of degrees." << std::endl;
                                                          +
                                                          1848 // exit(1);
                                                          +
                                                          1849 // }
                                                          +
                                                          1850 
                                                          +
                                                          1851 // std::string deStr = PromptLine("Declination");
                                                          +
                                                          1852 
                                                          +
                                                          1853 // float deRadians;
                                                          +
                                                          1854 
                                                          +
                                                          1855 // int deDegPart, deMinPart;
                                                          +
                                                          1856 // float deSecPart;
                                                          +
                                                          1857 // char dummy[8];
                                                          +
                                                          1858 // int deFormatParts = sscanf(deStr.c_str(), "%d%s %d%s %f%s", &deDegPart, dummy, &deMinPart, dummy, &deSecPart, dummy);
                                                          +
                                                          1859 
                                                          +
                                                          1860 // float deDeg;
                                                          +
                                                          1861 // int deFormatDeg = sscanf(deStr.c_str(), "%f", &deDeg);
                                                          +
                                                          1862 
                                                          +
                                                          1863 // if (deFormatParts == 6) {
                                                          +
                                                          1864 // deRadians = DegToRad(deDegPart + (float)deMinPart/60 + (float)deSecPart/60/60);
                                                          +
                                                          1865 // } else if (deFormatDeg == 1) {
                                                          +
                                                          1866 // deRadians = DegToRad(deFormatDeg);
                                                          +
                                                          1867 // } else {
                                                          +
                                                          1868 // std::cerr << "Invalid declination format." << std::endl;
                                                          +
                                                          1869 // exit(1);
                                                          +
                                                          1870 // }
                                                          +
                                                          1871 
                                                          +
                                                          1872 // // find the star
                                                          +
                                                          1873 
                                                          +
                                                          1874 // float tolerance = 0.001;
                                                          +
                                                          1875 // Vec3 userSpatial = SphericalToSpatial(raRadians, deRadians);
                                                          +
                                                          1876 // int i = 0;
                                                          +
                                                          1877 // for (const CatalogStar &curStar : catalog) {
                                                          +
                                                          1878 // if ((curStar.spatial - userSpatial).Magnitude() < tolerance) {
                                                          +
                                                          1879 // std::cout << "found_star_" << i << " " << curStar.name << std::endl;
                                                          +
                                                          1880 // std::cout << "fonud_star_magnitude_" << i << " " << curStar.magnitude << std::endl;
                                                          +
                                                          1881 // i++;
                                                          +
                                                          1882 // }
                                                          +
                                                          1883 // }
                                                          +
                                                          1884 // if (i == 0) {
                                                          +
                                                          1885 // std::cerr << "No stars found" << std::endl;
                                                          +
                                                          1886 // }
                                                          +
                                                          1887 // }
                                                          +
                                                          1888 
                                                          +
                                                          1889 // void InspectPrintStar(const Catalog &catalog) {
                                                          +
                                                          1890 // auto stars = PromptCatalogStars(catalog, 1);
                                                          +
                                                          1891 // float ra, de;
                                                          +
                                                          1892 // SpatialToSpherical(stars[0]->spatial, &ra, &de);
                                                          +
                                                          1893 
                                                          +
                                                          1894 // std::cout << "star_ra " << RadToDeg(ra) << std::endl;
                                                          +
                                                          1895 // std::cout << "star_de " << RadToDeg(de) << std::endl;
                                                          +
                                                          1896 // }
                                                          +
                                                          1897 
                                                          +
                                                          1898 // void InspectCatalog() {
                                                          +
                                                          1899 // InteractiveChoice<CatalogInspector> inspectorChoice;
                                                          +
                                                          1900 // inspectorChoice.Register("pair_distance", "pair distance angle", InspectPairDistance);
                                                          +
                                                          1901 // inspectorChoice.Register("pyramid_distances", "all pair distances in pyramid", InspectPyramidDistances);
                                                          +
                                                          1902 // inspectorChoice.Register("triple_angle", "inner angle of a triangle", InspectTripleAngle);
                                                          +
                                                          1903 // inspectorChoice.Register("find_star", "find a star name based on ra/de", InspectFindStar);
                                                          +
                                                          1904 // inspectorChoice.Register("print_star", "print coordinates of a star", InspectPrintStar);
                                                          +
                                                          1905 // (*inspectorChoice.Prompt("Inspect the catalog"))(CatalogRead());
                                                          +
                                                          1906 // }
                                                          +
                                                          1907 
                                                          +
                                                          1908 } // namespace lost
                                                          An attitude estimation algorithm estimates the orientation of the camera based on identified stars.
                                                          @@ -1900,11 +1899,11 @@
                                                          int magnitude
                                                          The magnitude of the star, with the decimal point shifted two places right.
                                                          Definition: star-utils.hpp:37
                                                          A simple, fast, and pretty decent centroid algorithm.
                                                          Definition: centroiders.hpp:37
                                                          An algorithm that detects the (x,y) coordinates of bright points in an image, called "centroids".
                                                          Definition: centroiders.hpp:12
                                                          -
                                                          The result of comparing actual and expected centroids Used for debugging and benchmarking.
                                                          Definition: io.cpp:1022
                                                          -
                                                          float numExtraCentroids
                                                          Stars in actual but not expected.
                                                          Definition: io.cpp:1040
                                                          -
                                                          float numCorrectCentroids
                                                          Number of actual stars within the centroiding threshold of an expected star.
                                                          Definition: io.cpp:1034
                                                          -
                                                          float meanError
                                                          Average distance from actual to expected centroids (in pixels) Only correct centroids are considered ...
                                                          Definition: io.cpp:1029
                                                          - +
                                                          The result of comparing actual and expected centroids Used for debugging and benchmarking.
                                                          Definition: io.cpp:1021
                                                          +
                                                          float numExtraCentroids
                                                          Stars in actual but not expected.
                                                          Definition: io.cpp:1039
                                                          +
                                                          float numCorrectCentroids
                                                          Number of actual stars within the centroiding threshold of an expected star.
                                                          Definition: io.cpp:1033
                                                          +
                                                          float meanError
                                                          Average distance from actual to expected centroids (in pixels) Only correct centroids are considered ...
                                                          Definition: io.cpp:1028
                                                          +
                                                          Commannd line options when using the database command.
                                                          Definition: io.hpp:285
                                                          A slow but reliable attitude estimation algorithm.
                                                          @@ -1931,7 +1930,7 @@
                                                          static const int32_t kMagicValue
                                                          Magic value to use when storing inside a MultiDatabase.
                                                          Definition: databases.hpp:68
                                                          A set of algorithms that describes all or part of the star-tracking "pipeline".
                                                          Definition: io.hpp:232
                                                          Pipeline()=default
                                                          -
                                                          PipelineOutput Go(const PipelineInput &)
                                                          Run all stages of a pipeline.
                                                          Definition: io.cpp:901
                                                          +
                                                          PipelineOutput Go(const PipelineInput &)
                                                          Run all stages of a pipeline.
                                                          Definition: io.cpp:900
                                                          Represents the input and expected outputs of a pipeline run.
                                                          Definition: io.hpp:93
                                                          virtual const Catalog & GetCatalog() const =0
                                                          The catalog to which catalog indexes returned from other methods refer.
                                                          virtual const StarIdentifiers * InputStarIds() const
                                                          The centroid indices in the StarIdentifiers returned from InputStarIds should be indices into InputSt...
                                                          Definition: io.hpp:103
                                                          @@ -1966,8 +1965,7 @@
                                                          #define LOST_PIPELINE_COMPARE(precondition, errmsg, comparator, path, isBinary)
                                                          LOST starting point.
                                                          -
                                                          CentroidComparison CentroidComparisonsCombine(std::vector< CentroidComparison > comparisons)
                                                          Definition: io.cpp:1102
                                                          -
                                                          float FocalLengthFromOptions(const PipelineOptions &values)
                                                          Calculate the focal length, in pixels, based on the given command line options.
                                                          Definition: io.cpp:311
                                                          +
                                                          CentroidComparison CentroidComparisonsCombine(std::vector< CentroidComparison > comparisons)
                                                          Definition: io.cpp:1101
                                                          unsigned char * SurfaceToGrayscaleImage(cairo_surface_t *cairoSurface)
                                                          Convert a colored Cairo image surface into a row-major array of grayscale pixels.
                                                          Definition: io.cpp:119
                                                          const int32_t kCatalogMagicValue
                                                          Definition: databases.hpp:13
                                                          std::vector< StarIdentifier > StarIdentifiers
                                                          Definition: star-utils.hpp:102
                                                          @@ -1976,30 +1974,31 @@
                                                          Catalog DeserializeCatalog(DeserializeContext *des, bool *inclMagnitudeReturn, bool *inclNameReturn)
                                                          Deserialize a catalog.
                                                          Definition: star-utils.cpp:123
                                                          const Catalog & CatalogRead()
                                                          Read and parse the full catalog from disk. If called multiple times, will re-use the first result.
                                                          Definition: io.cpp:91
                                                          std::vector< Star > Stars
                                                          Definition: star-utils.hpp:101
                                                          -
                                                          PipelineInputList(* PipelineInputFactory)()
                                                          Definition: io.cpp:798
                                                          +
                                                          PipelineInputList(* PipelineInputFactory)()
                                                          Definition: io.cpp:797
                                                          float FovToFocalLength(float xFov, float xResolution)
                                                          Definition: camera.cpp:57
                                                          -
                                                          void PipelineComparatorPlotCentroidIndices(std::ostream &os, const PipelineInputList &expected, const std::vector< PipelineOutput > &actual, const PipelineOptions &)
                                                          Plot an annotated image where centroids are annotated with their centroid index.
                                                          Definition: io.cpp:1399
                                                          +
                                                          void PipelineComparatorPlotCentroidIndices(std::ostream &os, const PipelineInputList &expected, const std::vector< PipelineOutput > &actual, const PipelineOptions &)
                                                          Plot an annotated image where centroids are annotated with their centroid index.
                                                          Definition: io.cpp:1398
                                                          Quaternion SphericalToQuaternion(float ra, float dec, float roll)
                                                          Return a quaternion that will reorient the coordinate axes so that the x-axis points at the given rig...
                                                          PipelineInputList GetPngPipelineInput(const PipelineOptions &values)
                                                          Create a PngPipelineInput using command line options.
                                                          Definition: io.cpp:371
                                                          void SurfacePlot(std::string description, cairo_surface_t *cairoSurface, const Stars &stars, const StarIdentifiers *starIds, const Catalog *catalog, const Attitude *attitude, double red, double green, double blue, double alpha, bool rawStarIndexes=false)
                                                          Plot information about an image onto the image using Cairo.
                                                          Definition: io.cpp:170
                                                          float MagToBrightness(int mag)
                                                          returns some relative brightness measure, which is proportional to the total number of photons receiv...
                                                          Definition: star-utils.cpp:147
                                                          const int kMaxBrightness
                                                          Definition: io.cpp:471
                                                          +
                                                          float FocalLengthFromOptions(const PipelineOptions &values, int xResolution)
                                                          Calculate the focal length, in pixels, based on the given command line options.
                                                          Definition: io.cpp:311
                                                          std::vector< MultiDatabaseEntry > MultiDatabaseDescriptor
                                                          Definition: databases.hpp:117
                                                          -
                                                          void(* PipelineComparator)(std::ostream &os, const PipelineInputList &, const std::vector< PipelineOutput > &, const PipelineOptions &)
                                                          Definition: io.cpp:1202
                                                          -
                                                          StarIdComparison StarIdsCompare(const StarIdentifiers &expected, const StarIdentifiers &actual, const Catalog &expectedCatalog, const Catalog &actualCatalog, float centroidThreshold, const Stars &expectedStars, const Stars &inputStars)
                                                          Compare expected and actual star identifications.
                                                          Definition: io.cpp:1121
                                                          +
                                                          void(* PipelineComparator)(std::ostream &os, const PipelineInputList &, const std::vector< PipelineOutput > &, const PipelineOptions &)
                                                          Definition: io.cpp:1201
                                                          +
                                                          StarIdComparison StarIdsCompare(const StarIdentifiers &expected, const StarIdentifiers &actual, const Catalog &expectedCatalog, const Catalog &actualCatalog, float centroidThreshold, const Stars &expectedStars, const Stars &inputStars)
                                                          Compare expected and actual star identifications.
                                                          Definition: io.cpp:1120
                                                          float DegToRad(float deg)
                                                          MultiDatabaseDescriptor GenerateDatabases(const Catalog &catalog, const DatabaseOptions &values)
                                                          Appropriately create descriptors for all requested databases according to command-line options.
                                                          Definition: io.cpp:272
                                                          SerializeContext serFromDbValues(const DatabaseOptions &values)
                                                          Definition: io.cpp:268
                                                          std::vector< std::unique_ptr< PipelineInput > > PipelineInputList
                                                          Definition: io.hpp:161
                                                          -
                                                          PipelineInputList GetPipelineInput(const PipelineOptions &values)
                                                          Come up with a list of pipeline inputs based on command line options.
                                                          Definition: io.cpp:801
                                                          -
                                                          void PipelineComparison(const PipelineInputList &expected, const std::vector< PipelineOutput > &actual, const PipelineOptions &values)
                                                          Print or otherwise analyze the results of (perhaps multiple) runs of a star tracking pipeline.
                                                          Definition: io.cpp:1691
                                                          -
                                                          Pipeline SetPipeline(const PipelineOptions &values)
                                                          Create a pipeline from command line options.
                                                          Definition: io.cpp:835
                                                          +
                                                          PipelineInputList GetPipelineInput(const PipelineOptions &values)
                                                          Come up with a list of pipeline inputs based on command line options.
                                                          Definition: io.cpp:800
                                                          +
                                                          void PipelineComparison(const PipelineInputList &expected, const std::vector< PipelineOutput > &actual, const PipelineOptions &values)
                                                          Print or otherwise analyze the results of (perhaps multiple) runs of a star tracking pipeline.
                                                          Definition: io.cpp:1690
                                                          +
                                                          Pipeline SetPipeline(const PipelineOptions &values)
                                                          Create a pipeline from command line options.
                                                          Definition: io.cpp:834
                                                          float RadToDeg(float rad)
                                                          PipelineInputList GetGeneratedPipelineInput(const PipelineOptions &values)
                                                          Create a GeneratedPipelineInput based on the command line options in values
                                                          Definition: io.cpp:726
                                                          std::vector< CatalogStar > Catalog
                                                          Definition: star-utils.hpp:100
                                                          void SerializePairDistanceKVector(SerializeContext *ser, const Catalog &catalog, float minDistance, float maxDistance, long numBins)
                                                          Serialize a pair-distance KVector into buffer.
                                                          Definition: databases.cpp:194
                                                          cairo_surface_t * GrayscaleImageToSurface(const unsigned char *image, const int width, const int height)
                                                          Definition: io.cpp:148
                                                          -
                                                          CentroidComparison CentroidsCompare(float threshold, const Stars &expected, const Stars &actual)
                                                          Compare expected and actual centroids.
                                                          Definition: io.cpp:1076
                                                          +
                                                          CentroidComparison CentroidsCompare(float threshold, const Stars &expected, const Stars &actual)
                                                          Compare expected and actual centroids.
                                                          Definition: io.cpp:1075
                                                          std::ostream & operator<<(std::ostream &os, const Camera &camera)
                                                          Print information about the camera in machine and human-readable form.
                                                          Definition: io.cpp:296
                                                          @@ -2026,7 +2025,7 @@ diff --git a/io_8hpp.html b/io_8hpp.html index e30ea5a5..9e994f6f 100644 --- a/io_8hpp.html +++ b/io_8hpp.html @@ -361,7 +361,7 @@

                                                            - +
                                                          diff --git a/io_8hpp_source.html b/io_8hpp_source.html index d402337d..42951b22 100644 --- a/io_8hpp_source.html +++ b/io_8hpp_source.html @@ -340,9 +340,9 @@
                                                          int height
                                                          Definition: io.hpp:72
                                                          int width
                                                          Definition: io.hpp:71
                                                          A set of algorithms that describes all or part of the star-tracking "pipeline".
                                                          Definition: io.hpp:232
                                                          -
                                                          friend Pipeline SetPipeline(const PipelineOptions &values)
                                                          Create a pipeline from command line options.
                                                          Definition: io.cpp:835
                                                          +
                                                          friend Pipeline SetPipeline(const PipelineOptions &values)
                                                          Create a pipeline from command line options.
                                                          Definition: io.cpp:834
                                                          Pipeline()=default
                                                          -
                                                          PipelineOutput Go(const PipelineInput &)
                                                          Run all stages of a pipeline.
                                                          Definition: io.cpp:901
                                                          +
                                                          PipelineOutput Go(const PipelineInput &)
                                                          Run all stages of a pipeline.
                                                          Definition: io.cpp:900
                                                          Represents the input and expected outputs of a pipeline run.
                                                          Definition: io.hpp:93
                                                          virtual const Attitude * InputAttitude() const
                                                          Only used in tracking mode, in which case it is an estimate of the current attitude based on the last...
                                                          Definition: io.hpp:105
                                                          virtual const Catalog & GetCatalog() const =0
                                                          The catalog to which catalog indexes returned from other methods refer.
                                                          @@ -375,13 +375,13 @@
                                                          const Catalog & CatalogRead()
                                                          Read and parse the full catalog from disk. If called multiple times, will re-use the first result.
                                                          Definition: io.cpp:91
                                                          std::vector< Star > Stars
                                                          Definition: star-utils.hpp:101
                                                          std::vector< MultiDatabaseEntry > MultiDatabaseDescriptor
                                                          Definition: databases.hpp:117
                                                          -
                                                          StarIdComparison StarIdsCompare(const StarIdentifiers &expected, const StarIdentifiers &actual, const Catalog &expectedCatalog, const Catalog &actualCatalog, float centroidThreshold, const Stars &expectedStars, const Stars &inputStars)
                                                          Compare expected and actual star identifications.
                                                          Definition: io.cpp:1121
                                                          +
                                                          StarIdComparison StarIdsCompare(const StarIdentifiers &expected, const StarIdentifiers &actual, const Catalog &expectedCatalog, const Catalog &actualCatalog, float centroidThreshold, const Stars &expectedStars, const Stars &inputStars)
                                                          Compare expected and actual star identifications.
                                                          Definition: io.cpp:1120
                                                          MultiDatabaseDescriptor GenerateDatabases(const Catalog &catalog, const DatabaseOptions &values)
                                                          Appropriately create descriptors for all requested databases according to command-line options.
                                                          Definition: io.cpp:272
                                                          SerializeContext serFromDbValues(const DatabaseOptions &values)
                                                          Definition: io.cpp:268
                                                          std::vector< std::unique_ptr< PipelineInput > > PipelineInputList
                                                          Definition: io.hpp:161
                                                          -
                                                          PipelineInputList GetPipelineInput(const PipelineOptions &values)
                                                          Come up with a list of pipeline inputs based on command line options.
                                                          Definition: io.cpp:801
                                                          -
                                                          void PipelineComparison(const PipelineInputList &expected, const std::vector< PipelineOutput > &actual, const PipelineOptions &values)
                                                          Print or otherwise analyze the results of (perhaps multiple) runs of a star tracking pipeline.
                                                          Definition: io.cpp:1691
                                                          -
                                                          Pipeline SetPipeline(const PipelineOptions &values)
                                                          Create a pipeline from command line options.
                                                          Definition: io.cpp:835
                                                          +
                                                          PipelineInputList GetPipelineInput(const PipelineOptions &values)
                                                          Come up with a list of pipeline inputs based on command line options.
                                                          Definition: io.cpp:800
                                                          +
                                                          void PipelineComparison(const PipelineInputList &expected, const std::vector< PipelineOutput > &actual, const PipelineOptions &values)
                                                          Print or otherwise analyze the results of (perhaps multiple) runs of a star tracking pipeline.
                                                          Definition: io.cpp:1690
                                                          +
                                                          Pipeline SetPipeline(const PipelineOptions &values)
                                                          Create a pipeline from command line options.
                                                          Definition: io.cpp:834
                                                          void InspectCatalog()
                                                          const char kNoDefaultArgument
                                                          Definition: io.hpp:32
                                                          std::vector< CatalogStar > Catalog
                                                          Definition: star-utils.hpp:100
                                                          @@ -408,7 +408,7 @@ diff --git a/main_8cpp.html b/main_8cpp.html index 3c016fd0..7d507c14 100644 --- a/main_8cpp.html +++ b/main_8cpp.html @@ -588,7 +588,7 @@

                                                            - +
                                                          diff --git a/main_8cpp_source.html b/main_8cpp_source.html index 229c1cd9..3104947c 100644 --- a/main_8cpp_source.html +++ b/main_8cpp_source.html @@ -333,9 +333,9 @@
                                                          MultiDatabaseDescriptor GenerateDatabases(const Catalog &catalog, const DatabaseOptions &values)
                                                          Appropriately create descriptors for all requested databases according to command-line options.
                                                          Definition: io.cpp:272
                                                          SerializeContext serFromDbValues(const DatabaseOptions &values)
                                                          Definition: io.cpp:268
                                                          std::vector< std::unique_ptr< PipelineInput > > PipelineInputList
                                                          Definition: io.hpp:161
                                                          -
                                                          PipelineInputList GetPipelineInput(const PipelineOptions &values)
                                                          Come up with a list of pipeline inputs based on command line options.
                                                          Definition: io.cpp:801
                                                          -
                                                          void PipelineComparison(const PipelineInputList &expected, const std::vector< PipelineOutput > &actual, const PipelineOptions &values)
                                                          Print or otherwise analyze the results of (perhaps multiple) runs of a star tracking pipeline.
                                                          Definition: io.cpp:1691
                                                          -
                                                          Pipeline SetPipeline(const PipelineOptions &values)
                                                          Create a pipeline from command line options.
                                                          Definition: io.cpp:835
                                                          +
                                                          PipelineInputList GetPipelineInput(const PipelineOptions &values)
                                                          Come up with a list of pipeline inputs based on command line options.
                                                          Definition: io.cpp:800
                                                          +
                                                          void PipelineComparison(const PipelineInputList &expected, const std::vector< PipelineOutput > &actual, const PipelineOptions &values)
                                                          Print or otherwise analyze the results of (perhaps multiple) runs of a star tracking pipeline.
                                                          Definition: io.cpp:1690
                                                          +
                                                          Pipeline SetPipeline(const PipelineOptions &values)
                                                          Create a pipeline from command line options.
                                                          Definition: io.cpp:834
                                                          bool atobool(const char *cstr)
                                                          Convert string to boolean.
                                                          Definition: main.cpp:97
                                                          std::vector< CatalogStar > Catalog
                                                          Definition: star-utils.hpp:100
                                                          Catalog NarrowCatalog(const Catalog &catalog, int maxMagnitude, int maxStars, float minSeparation)
                                                          Remove unwanted stars from an unfiltered catalog.
                                                          Definition: star-utils.cpp:17
                                                          @@ -346,7 +346,7 @@ diff --git a/namespacelost.html b/namespacelost.html index 343594f9..dc67015a 100644 --- a/namespacelost.html +++ b/namespacelost.html @@ -357,9 +357,9 @@ std::ostream & operator<< (std::ostream &os, const Camera &camera)  Print information about the camera in machine and human-readable form. More...
                                                            -float FocalLengthFromOptions (const PipelineOptions &values) - Calculate the focal length, in pixels, based on the given command line options. More...
                                                          -  +float FocalLengthFromOptions (const PipelineOptions &values, int xResolution) + Calculate the focal length, in pixels, based on the given command line options. More...
                                                          PipelineInputList GetPngPipelineInput (const PipelineOptions &values)  Create a PngPipelineInput using command line options. More...
                                                            @@ -564,7 +564,7 @@

                                                          -

                                                          Definition at line 1202 of file io.cpp.

                                                          +

                                                          Definition at line 1201 of file io.cpp.

                                                          @@ -580,7 +580,7 @@

                                                          -

                                                          Definition at line 798 of file io.cpp.

                                                          +

                                                          Definition at line 797 of file io.cpp.

                                                          @@ -1230,7 +1230,7 @@

                                                          -

                                                          Definition at line 1102 of file io.cpp.

                                                          +

                                                          Definition at line 1101 of file io.cpp.

                                                          @@ -1274,7 +1274,7 @@

                                                          Definition at line 1076 of file io.cpp.

                                                          +

                                                          Definition at line 1075 of file io.cpp.

                                                          @@ -1521,7 +1521,7 @@

                                                          - + @@ -1991,8 +1991,8 @@

                                                          -

                                                          ◆ FocalLengthFromOptions()

                                                          + +

                                                          ◆ FocalLengthFromOptions()

                                                          @@ -2001,8 +2001,18 @@

                                                          float lost::FocalLengthFromOptions ( const PipelineOptions &  - values) + values, + + + + + int  + xResolution  + + + ) +

                                                          - + @@ -2201,7 +2211,7 @@

                                                          - + @@ -2237,7 +2247,7 @@

                                                          Definition at line 801 of file io.cpp.

                                                          +

                                                          Definition at line 800 of file io.cpp.

                                                          Here is the call graph for this function:
                                                          @@ -2248,7 +2258,7 @@

                                                          - + @@ -2283,7 +2293,7 @@

                                                          - + @@ -2863,7 +2873,7 @@

                                                          Definition at line 1399 of file io.cpp.

                                                          +

                                                          Definition at line 1398 of file io.cpp.

                                                          Here is the call graph for this function:
                                                          @@ -2934,7 +2944,7 @@

                                                          Definition at line 1691 of file io.cpp.

                                                          +

                                                          Definition at line 1690 of file io.cpp.

                                                          Here is the call graph for this function:
                                                          @@ -3769,7 +3779,7 @@

                                                          Definition at line 835 of file io.cpp.

                                                          +

                                                          Definition at line 834 of file io.cpp.

                                                          @@ -3954,7 +3964,7 @@

                                                          StarIdComparison. A star-id is correct if the centroid is the closest centroid to some expected centroid, and the referenced catalog star is the same one as in the expected star-ids for that centroid. Also permissible is if the centroid is not the closest to any expected centroid, but it has the same star-id as another star closer to the closest expected centroid. All other star-ids are incorrect (because they are either identifying false stars, or are incorrect identifications on true stars)

                                                          The "total" in the result is just the number of input stars.

                                                          -

                                                          Definition at line 1121 of file io.cpp.

                                                          +

                                                          Definition at line 1120 of file io.cpp.

                                                          @@ -4363,7 +4373,7 @@

                                                            - +
                                                          diff --git a/namespacelost.js b/namespacelost.js index 45e45526..f7cda5ce 100644 --- a/namespacelost.js +++ b/namespacelost.js @@ -86,7 +86,7 @@ var namespacelost = [ "FindNamedStar", "namespacelost.html#ac722314f3b14385ade7e5f05699ef006", null ], [ "FindUnidentifiedCentroidsInRange", "namespacelost.html#a0f709f580bfbe3bd0196b50226f22683", null ], [ "FloatModulo", "namespacelost.html#a01c855b3690f601ec92a40471aa05ebd", null ], - [ "FocalLengthFromOptions", "namespacelost.html#a1187da9a83232a720a84bef1b99c5b58", null ], + [ "FocalLengthFromOptions", "namespacelost.html#a9eaa81a9fc5f13a447e4209b5b230308", null ], [ "FocalLengthToFov", "namespacelost.html#ae05e275818c57f3b736b70236d0e6703", null ], [ "FovToFocalLength", "namespacelost.html#a5e7d67bec758d4922935c84b8a0f8526", null ], [ "GenerateDatabases", "namespacelost.html#ac0ac19dd0e9f2f1ce471617d9c837949", null ], diff --git a/namespacelost_a5e7d67bec758d4922935c84b8a0f8526_icgraph.map b/namespacelost_a5e7d67bec758d4922935c84b8a0f8526_icgraph.map index 5a777904..705a8d2c 100644 --- a/namespacelost_a5e7d67bec758d4922935c84b8a0f8526_icgraph.map +++ b/namespacelost_a5e7d67bec758d4922935c84b8a0f8526_icgraph.map @@ -1,6 +1,6 @@ - + diff --git a/namespacelost_a5e7d67bec758d4922935c84b8a0f8526_icgraph.md5 b/namespacelost_a5e7d67bec758d4922935c84b8a0f8526_icgraph.md5 index a643b933..ef4bef31 100644 --- a/namespacelost_a5e7d67bec758d4922935c84b8a0f8526_icgraph.md5 +++ b/namespacelost_a5e7d67bec758d4922935c84b8a0f8526_icgraph.md5 @@ -1 +1 @@ -c0ca8694b78530880391c51ae26139a4 \ No newline at end of file +cf15f2d0f9f7c879310ead7f36923792 \ No newline at end of file diff --git a/namespacelost_a72e465adc8dcb532e46b956261bf93fe_cgraph.map b/namespacelost_a72e465adc8dcb532e46b956261bf93fe_cgraph.map index bb7cb918..21cb4c16 100644 --- a/namespacelost_a72e465adc8dcb532e46b956261bf93fe_cgraph.map +++ b/namespacelost_a72e465adc8dcb532e46b956261bf93fe_cgraph.map @@ -1,7 +1,7 @@ - + diff --git a/namespacelost_a72e465adc8dcb532e46b956261bf93fe_cgraph.md5 b/namespacelost_a72e465adc8dcb532e46b956261bf93fe_cgraph.md5 index f9b618ef..e7350f25 100644 --- a/namespacelost_a72e465adc8dcb532e46b956261bf93fe_cgraph.md5 +++ b/namespacelost_a72e465adc8dcb532e46b956261bf93fe_cgraph.md5 @@ -1 +1 @@ -fac5b5c5dd9e5f59d12951d420b42170 \ No newline at end of file +b2e8a26f20bf077bb7ae79b8be5b8fb6 \ No newline at end of file diff --git a/namespacelost_a1187da9a83232a720a84bef1b99c5b58_cgraph.map b/namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_cgraph.map similarity index 100% rename from namespacelost_a1187da9a83232a720a84bef1b99c5b58_cgraph.map rename to namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_cgraph.map diff --git a/namespacelost_a1187da9a83232a720a84bef1b99c5b58_cgraph.md5 b/namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_cgraph.md5 similarity index 100% rename from namespacelost_a1187da9a83232a720a84bef1b99c5b58_cgraph.md5 rename to namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_cgraph.md5 diff --git a/namespacelost_a1187da9a83232a720a84bef1b99c5b58_cgraph.png b/namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_cgraph.png similarity index 100% rename from namespacelost_a1187da9a83232a720a84bef1b99c5b58_cgraph.png rename to namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_cgraph.png diff --git a/namespacelost_a1187da9a83232a720a84bef1b99c5b58_icgraph.map b/namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_icgraph.map similarity index 100% rename from namespacelost_a1187da9a83232a720a84bef1b99c5b58_icgraph.map rename to namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_icgraph.map diff --git a/namespacelost_a1187da9a83232a720a84bef1b99c5b58_icgraph.md5 b/namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_icgraph.md5 similarity index 100% rename from namespacelost_a1187da9a83232a720a84bef1b99c5b58_icgraph.md5 rename to namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_icgraph.md5 diff --git a/namespacelost_a1187da9a83232a720a84bef1b99c5b58_icgraph.png b/namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_icgraph.png similarity index 100% rename from namespacelost_a1187da9a83232a720a84bef1b99c5b58_icgraph.png rename to namespacelost_a9eaa81a9fc5f13a447e4209b5b230308_icgraph.png diff --git a/namespacelost_abf3a90819d379c9a4d0c48f385f52613_icgraph.map b/namespacelost_abf3a90819d379c9a4d0c48f385f52613_icgraph.map index bd5b5c24..0f878895 100644 --- a/namespacelost_abf3a90819d379c9a4d0c48f385f52613_icgraph.map +++ b/namespacelost_abf3a90819d379c9a4d0c48f385f52613_icgraph.map @@ -3,7 +3,7 @@ - + diff --git a/namespacelost_abf3a90819d379c9a4d0c48f385f52613_icgraph.md5 b/namespacelost_abf3a90819d379c9a4d0c48f385f52613_icgraph.md5 index d824ac8c..668baeb3 100644 --- a/namespacelost_abf3a90819d379c9a4d0c48f385f52613_icgraph.md5 +++ b/namespacelost_abf3a90819d379c9a4d0c48f385f52613_icgraph.md5 @@ -1 +1 @@ -e1c4c2478e84885f01071a47e31a9bc1 \ No newline at end of file +a3bcd0f431eb566f0505b840ab2b8348 \ No newline at end of file diff --git a/namespacelost_ad01d904e4a6bf5aed4a1b8f97f1416c5_cgraph.map b/namespacelost_ad01d904e4a6bf5aed4a1b8f97f1416c5_cgraph.map index 14dc8b39..1d0e9188 100644 --- a/namespacelost_ad01d904e4a6bf5aed4a1b8f97f1416c5_cgraph.map +++ b/namespacelost_ad01d904e4a6bf5aed4a1b8f97f1416c5_cgraph.map @@ -4,7 +4,7 @@ - + diff --git a/namespacelost_ad01d904e4a6bf5aed4a1b8f97f1416c5_cgraph.md5 b/namespacelost_ad01d904e4a6bf5aed4a1b8f97f1416c5_cgraph.md5 index 02b8cb46..b2686346 100644 --- a/namespacelost_ad01d904e4a6bf5aed4a1b8f97f1416c5_cgraph.md5 +++ b/namespacelost_ad01d904e4a6bf5aed4a1b8f97f1416c5_cgraph.md5 @@ -1 +1 @@ -d2b8c7bd0567b320deb4795a378b70f5 \ No newline at end of file +9f600f18a71f0c739cd5fd6cfa4a310f \ No newline at end of file diff --git a/namespacelost_aec3a2012bf028c749ba53a46a50ad172_cgraph.map b/namespacelost_aec3a2012bf028c749ba53a46a50ad172_cgraph.map index 720fdc32..17197cac 100644 --- a/namespacelost_aec3a2012bf028c749ba53a46a50ad172_cgraph.map +++ b/namespacelost_aec3a2012bf028c749ba53a46a50ad172_cgraph.map @@ -2,7 +2,7 @@ - + diff --git a/namespacelost_aec3a2012bf028c749ba53a46a50ad172_cgraph.md5 b/namespacelost_aec3a2012bf028c749ba53a46a50ad172_cgraph.md5 index 01b176c1..50136b77 100644 --- a/namespacelost_aec3a2012bf028c749ba53a46a50ad172_cgraph.md5 +++ b/namespacelost_aec3a2012bf028c749ba53a46a50ad172_cgraph.md5 @@ -1 +1 @@ -e05f5ec92d36fcb8306eccd3dc4b41b3 \ No newline at end of file +29b31628e524827bd6fe9efc91152f60 \ No newline at end of file diff --git a/namespacemembers.html b/namespacemembers.html index ef833307..60b9efc3 100644 --- a/namespacemembers.html +++ b/namespacemembers.html @@ -202,7 +202,7 @@

                                                          - f -

                                                            : lost
                                                          • FocalLengthFromOptions() -: lost +: lost
                                                          • FocalLengthToFov() : lost @@ -424,7 +424,7 @@

                                                            - s -

                                                              diff --git a/namespacemembers_func.html b/namespacemembers_func.html index 324ff890..b74963c1 100644 --- a/namespacemembers_func.html +++ b/namespacemembers_func.html @@ -193,7 +193,7 @@

                                                              - f -

                                                                : lost
                                                              • FocalLengthFromOptions() -: lost +: lost
                                                              • FocalLengthToFov() : lost @@ -372,7 +372,7 @@

                                                                - s -

                                                                  diff --git a/namespacemembers_type.html b/namespacemembers_type.html index 88829409..682ecfe2 100644 --- a/namespacemembers_type.html +++ b/namespacemembers_type.html @@ -120,7 +120,7 @@ diff --git a/namespacemembers_vars.html b/namespacemembers_vars.html index a8bf15ac..41259421 100644 --- a/namespacemembers_vars.html +++ b/namespacemembers_vars.html @@ -108,7 +108,7 @@ diff --git a/namespaces.html b/namespaces.html index 5a53fe7d..7918e609 100644 --- a/namespaces.html +++ b/namespaces.html @@ -142,7 +142,7 @@ diff --git a/navtreeindex1.js b/navtreeindex1.js index 0ad42c0c..80977733 100644 --- a/navtreeindex1.js +++ b/navtreeindex1.js @@ -101,7 +101,6 @@ var NAVTREEINDEX1 = "io_8cpp.html":[4,0,1,11], "io_8cpp.html#a0fe01051c958fa8ced02e772aefdc991":[4,0,1,11,11], "io_8cpp.html#a106f3da2d75b2af268f5e9abfc7ea681":[4,0,1,11,8], -"io_8cpp.html#a1187da9a83232a720a84bef1b99c5b58":[4,0,1,11,13], "io_8cpp.html#a1628471efc4a0d438d497c67d641c6c4":[4,0,1,11,2], "io_8cpp.html#a1c3caf3f02508df448ec6c761a2d764e":[4,0,1,11,26], "io_8cpp.html#a21ee58ad60e736a58c95394ae5f799f4":[4,0,1,11,4], @@ -113,6 +112,7 @@ var NAVTREEINDEX1 = "io_8cpp.html#a8298f03c0d1b408401e4200d17305018":[4,0,1,11,25], "io_8cpp.html#a92e491a9e204a882bc0635b7d943e085":[4,0,1,11,5], "io_8cpp.html#a9b3311f3ebda1282ad7bf650de30cf45":[4,0,1,11,27], +"io_8cpp.html#a9eaa81a9fc5f13a447e4209b5b230308":[4,0,1,11,13], "io_8cpp.html#aa20cea40f78380bdd173e9636fe1f442":[4,0,1,11,3], "io_8cpp.html#ab001adf3b7887c7b7a72d308893c48b2":[4,0,1,11,6], "io_8cpp.html#ab6f75e99dbde3eede31e0b3a7c56878e":[4,0,1,11,24], @@ -162,7 +162,6 @@ var NAVTREEINDEX1 = "namespacelost.html#a0fe01051c958fa8ced02e772aefdc991":[2,0,0,67], "namespacelost.html#a106f3da2d75b2af268f5e9abfc7ea681":[2,0,0,52], "namespacelost.html#a10f0dede807e0a46e2a09defd4270f51":[2,0,0,82], -"namespacelost.html#a1187da9a83232a720a84bef1b99c5b58":[2,0,0,86], "namespacelost.html#a12fa960d591f9842a51451394cc86412":[2,0,0,114], "namespacelost.html#a164fee04c6e5fd2fc2e2ca9274b745fa":[2,0,0,117], "namespacelost.html#a1a50ad86abfc9430d15d2f855311a1f0":[2,0,0,81], @@ -209,6 +208,7 @@ var NAVTREEINDEX1 = "namespacelost.html#a9704a9fb2cf67873155e69407a976074":[2,0,0,129], "namespacelost.html#a9af0427ae10a3db5529f2f8c74497347":[2,0,0,119], "namespacelost.html#a9b3311f3ebda1282ad7bf650de30cf45":[2,0,0,136], +"namespacelost.html#a9eaa81a9fc5f13a447e4209b5b230308":[2,0,0,86], "namespacelost.html#aa2e68349539a9ef5024920ac4595e7e3":[2,0,0,120], "namespacelost.html#aa3cff2017989bf09b8b4111c1a0bfdf5":[2,0,0,108], "namespacelost.html#aaa2e81369410c8a787ec643333d1a7a8":[2,0,0,48], diff --git a/pages.html b/pages.html index 30d659b6..b9c226d8 100644 --- a/pages.html +++ b/pages.html @@ -97,7 +97,7 @@ diff --git a/pipeline-options_8hpp.html b/pipeline-options_8hpp.html index d6d4aa92..73ecae27 100644 --- a/pipeline-options_8hpp.html +++ b/pipeline-options_8hpp.html @@ -116,7 +116,7 @@ diff --git a/pipeline-options_8hpp_source.html b/pipeline-options_8hpp_source.html index aeffe913..0660dd5c 100644 --- a/pipeline-options_8hpp_source.html +++ b/pipeline-options_8hpp_source.html @@ -176,7 +176,7 @@ diff --git a/search/all_6.js b/search/all_6.js index ee1b4043..53bc2adb 100644 --- a/search/all_6.js +++ b/search/all_6.js @@ -6,7 +6,7 @@ var searchData= ['findunidentifiedcentroidsinrange_89',['FindUnidentifiedCentroidsInRange',['../namespacelost.html#a0f709f580bfbe3bd0196b50226f22683',1,'lost']]], ['floatmodulo_90',['FloatModulo',['../namespacelost.html#a01c855b3690f601ec92a40471aa05ebd',1,'lost']]], ['focallength_91',['FocalLength',['../classlost_1_1_camera.html#aa7df6f5d7ee2f6c26ecc34bd1e7f2e53',1,'lost::Camera']]], - ['focallengthfromoptions_92',['FocalLengthFromOptions',['../namespacelost.html#a1187da9a83232a720a84bef1b99c5b58',1,'lost']]], + ['focallengthfromoptions_92',['FocalLengthFromOptions',['../namespacelost.html#a9eaa81a9fc5f13a447e4209b5b230308',1,'lost']]], ['focallengthtofov_93',['FocalLengthToFov',['../namespacelost.html#ae05e275818c57f3b736b70236d0e6703',1,'lost']]], ['fov_94',['Fov',['../classlost_1_1_camera.html#a3830d04bcd953e27cc133944fb434f64',1,'lost::Camera']]], ['fovtofocallength_95',['FovToFocalLength',['../namespacelost.html#a5e7d67bec758d4922935c84b8a0f8526',1,'lost']]] diff --git a/search/functions_5.js b/search/functions_5.js index 9055c8db..9683a24a 100644 --- a/search/functions_5.js +++ b/search/functions_5.js @@ -6,7 +6,7 @@ var searchData= ['findunidentifiedcentroidsinrange_423',['FindUnidentifiedCentroidsInRange',['../namespacelost.html#a0f709f580bfbe3bd0196b50226f22683',1,'lost']]], ['floatmodulo_424',['FloatModulo',['../namespacelost.html#a01c855b3690f601ec92a40471aa05ebd',1,'lost']]], ['focallength_425',['FocalLength',['../classlost_1_1_camera.html#aa7df6f5d7ee2f6c26ecc34bd1e7f2e53',1,'lost::Camera']]], - ['focallengthfromoptions_426',['FocalLengthFromOptions',['../namespacelost.html#a1187da9a83232a720a84bef1b99c5b58',1,'lost']]], + ['focallengthfromoptions_426',['FocalLengthFromOptions',['../namespacelost.html#a9eaa81a9fc5f13a447e4209b5b230308',1,'lost']]], ['focallengthtofov_427',['FocalLengthToFov',['../namespacelost.html#ae05e275818c57f3b736b70236d0e6703',1,'lost']]], ['fov_428',['Fov',['../classlost_1_1_camera.html#a3830d04bcd953e27cc133944fb434f64',1,'lost::Camera']]], ['fovtofocallength_429',['FovToFocalLength',['../namespacelost.html#a5e7d67bec758d4922935c84b8a0f8526',1,'lost']]] diff --git a/serialize-helpers_8hpp.html b/serialize-helpers_8hpp.html index fa9d4779..a840bd76 100644 --- a/serialize-helpers_8hpp.html +++ b/serialize-helpers_8hpp.html @@ -189,7 +189,7 @@ diff --git a/serialize-helpers_8hpp_source.html b/serialize-helpers_8hpp_source.html index dc18b48f..e0f1988e 100644 --- a/serialize-helpers_8hpp_source.html +++ b/serialize-helpers_8hpp_source.html @@ -229,7 +229,7 @@ diff --git a/star-id-private_8hpp.html b/star-id-private_8hpp.html index b8ee95b4..ca74cf38 100644 --- a/star-id-private_8hpp.html +++ b/star-id-private_8hpp.html @@ -159,7 +159,7 @@ diff --git a/star-id-private_8hpp_source.html b/star-id-private_8hpp_source.html index 474ffb7a..4796deac 100644 --- a/star-id-private_8hpp_source.html +++ b/star-id-private_8hpp_source.html @@ -176,7 +176,7 @@ diff --git a/star-id_8cpp.html b/star-id_8cpp.html index 0bc6e2cf..6183cc0b 100644 --- a/star-id_8cpp.html +++ b/star-id_8cpp.html @@ -205,7 +205,7 @@

                                                                    - +
                                                                  diff --git a/star-id_8cpp_source.html b/star-id_8cpp_source.html index f50d88b8..0bfa33e4 100644 --- a/star-id_8cpp_source.html +++ b/star-id_8cpp_source.html @@ -864,7 +864,7 @@ diff --git a/star-id_8hpp.html b/star-id_8hpp.html index 068fe22b..4385c273 100644 --- a/star-id_8hpp.html +++ b/star-id_8hpp.html @@ -158,7 +158,7 @@ diff --git a/star-id_8hpp_source.html b/star-id_8hpp_source.html index 777d29f7..e767f0ff 100644 --- a/star-id_8hpp_source.html +++ b/star-id_8hpp_source.html @@ -162,7 +162,7 @@ diff --git a/star-utils_8cpp.html b/star-utils_8cpp.html index a96d9270..a0e4b0cb 100644 --- a/star-utils_8cpp.html +++ b/star-utils_8cpp.html @@ -156,7 +156,7 @@ diff --git a/star-utils_8cpp_source.html b/star-utils_8cpp_source.html index 07aaa298..b0600bab 100644 --- a/star-utils_8cpp_source.html +++ b/star-utils_8cpp_source.html @@ -243,7 +243,7 @@ diff --git a/star-utils_8hpp.html b/star-utils_8hpp.html index 9ad501a4..34e5eb99 100644 --- a/star-utils_8hpp.html +++ b/star-utils_8hpp.html @@ -185,7 +185,7 @@ diff --git a/star-utils_8hpp_source.html b/star-utils_8hpp_source.html index 86347b14..17fe58c2 100644 --- a/star-utils_8hpp_source.html +++ b/star-utils_8hpp_source.html @@ -206,7 +206,7 @@ diff --git a/structlost_1_1_centroid_params-members.html b/structlost_1_1_centroid_params-members.html index 9560adf0..9d0ab93b 100644 --- a/structlost_1_1_centroid_params-members.html +++ b/structlost_1_1_centroid_params-members.html @@ -105,7 +105,7 @@ diff --git a/structlost_1_1_centroid_params.html b/structlost_1_1_centroid_params.html index 986b51ae..dffc430c 100644 --- a/structlost_1_1_centroid_params.html +++ b/structlost_1_1_centroid_params.html @@ -287,7 +287,7 @@

                                                                    - +
                                                                  diff --git a/structlost_1_1_i_w_co_g_params-members.html b/structlost_1_1_i_w_co_g_params-members.html index 5e453e04..987b46e8 100644 --- a/structlost_1_1_i_w_co_g_params-members.html +++ b/structlost_1_1_i_w_co_g_params-members.html @@ -104,7 +104,7 @@ diff --git a/structlost_1_1_i_w_co_g_params.html b/structlost_1_1_i_w_co_g_params.html index 26fcf095..6f053ec9 100644 --- a/structlost_1_1_i_w_co_g_params.html +++ b/structlost_1_1_i_w_co_g_params.html @@ -269,7 +269,7 @@

                                                                    - +
                                                                  diff --git a/structlost_1_1_k_vector_pair-members.html b/structlost_1_1_k_vector_pair-members.html index 331853d8..a54468db 100644 --- a/structlost_1_1_k_vector_pair-members.html +++ b/structlost_1_1_k_vector_pair-members.html @@ -98,7 +98,7 @@ diff --git a/structlost_1_1_k_vector_pair.html b/structlost_1_1_k_vector_pair.html index 05db716d..13949e9b 100644 --- a/structlost_1_1_k_vector_pair.html +++ b/structlost_1_1_k_vector_pair.html @@ -161,7 +161,7 @@

                                                                    - +
                                                                  diff --git a/structlost_1_1_pipeline_output-members.html b/structlost_1_1_pipeline_output-members.html index 67d8d97d..04bbfa9f 100644 --- a/structlost_1_1_pipeline_output-members.html +++ b/structlost_1_1_pipeline_output-members.html @@ -102,7 +102,7 @@ diff --git a/structlost_1_1_pipeline_output.html b/structlost_1_1_pipeline_output.html index e1c9f04d..1c4068b5 100644 --- a/structlost_1_1_pipeline_output.html +++ b/structlost_1_1_pipeline_output.html @@ -248,7 +248,7 @@

                                                                    - +
                                                                  diff --git a/structlost_1_1_star_id_comparison-members.html b/structlost_1_1_star_id_comparison-members.html index 95eb0fbb..19230ee4 100644 --- a/structlost_1_1_star_id_comparison-members.html +++ b/structlost_1_1_star_id_comparison-members.html @@ -98,7 +98,7 @@ diff --git a/structlost_1_1_star_id_comparison.html b/structlost_1_1_star_id_comparison.html index ba82751f..88bfce00 100644 --- a/structlost_1_1_star_id_comparison.html +++ b/structlost_1_1_star_id_comparison.html @@ -180,7 +180,7 @@

                                                                    - +
                                                                  diff --git a/structlost_1_1_vec2-members.html b/structlost_1_1_vec2-members.html index 657fe473..f9bafb6f 100644 --- a/structlost_1_1_vec2-members.html +++ b/structlost_1_1_vec2-members.html @@ -104,7 +104,7 @@ diff --git a/structlost_1_1_vec2.html b/structlost_1_1_vec2.html index 56316877..a4c6d88b 100644 --- a/structlost_1_1_vec2.html +++ b/structlost_1_1_vec2.html @@ -314,7 +314,7 @@

                                                                    - +
                                                                  diff --git a/todo.html b/todo.html index 75d2c248..6dede812 100644 --- a/todo.html +++ b/todo.html @@ -103,7 +103,7 @@