Conjunction Data Message (CCSDS 508.0-B-1)
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Migrate from vendored crowbar to opam-pinned alcobar

- Remove vendored crowbar/ directory
- Replace all Crowbar references with Alcobar across 176 .ml files
- Update all fuzz dune files: crowbar → alcobar in libraries
- Remove 77 gen_corpus.ml files (alcobar handles corpus internally)
- Update dune-project files: crowbar → alcobar in dependencies
- Update merlint rules (e705, e726): Crowbar → Alcobar in checks,
docs, and examples
- Update merlint generated docs (index.html)

428 files changed, ~1200 lines removed net.

+81 -98
+1
.ocamlformat
··· 1 + profile = default
+68 -96
lib/cdm.ml
··· 53 53 | Truncated_row of { row : int; expected : int; got : int } 54 54 55 55 let pp_error ppf = function 56 - | Missing_header -> Format.fprintf ppf "missing CSV header row" 57 - | Missing_column name -> Format.fprintf ppf "missing column: %s" name 56 + | Missing_header -> Fmt.pf ppf "missing CSV header row" 57 + | Missing_column name -> Fmt.pf ppf "missing column: %s" name 58 58 | Bad_field { row; column; value } -> 59 - Format.fprintf ppf "row %d: bad value %S for column %s" row value column 59 + Fmt.pf ppf "row %d: bad value %S for column %s" row value column 60 60 | Truncated_row { row; expected; got } -> 61 - Format.fprintf ppf "row %d: expected %d columns, got %d" row expected got 61 + Fmt.pf ppf "row %d: expected %d columns, got %d" row expected got 62 62 63 63 (* {1 Column codecs} *) 64 64 ··· 128 128 let nf = Csvt.nullable_float 129 129 let ni = Csvt.nullable_int 130 130 131 + (** Build the column declarations for one object's state data. *) 132 + let obj_state_cols prefix obj row = 133 + let open Csvt.Row in 134 + row 135 + |> col (prefix ^ "x") nf ~enc:(fun f -> (obj f).f_x1) 136 + |> col (prefix ^ "y") nf ~enc:(fun f -> (obj f).f_y1) 137 + |> col (prefix ^ "z") nf ~enc:(fun f -> (obj f).f_z1) 138 + |> col (prefix ^ "vx") nf ~enc:(fun f -> (obj f).f_vx1) 139 + |> col (prefix ^ "vy") nf ~enc:(fun f -> (obj f).f_vy1) 140 + |> col (prefix ^ "vz") nf ~enc:(fun f -> (obj f).f_vz1) 141 + 142 + (* Note: flat_codec is a pure data structure mapping 45 CSV columns. 143 + It's inherently long but each line is mechanical column declaration. *) 131 144 let flat_codec = 132 145 Csvt.( 133 146 Row.( ··· 139 152 f_vz2 f_lx2 f_ly2 f_lz2 f_c2_11 f_c2_12 f_c2_13 f_c2_22 140 153 f_c2_23 f_c2_33 f_file1 f_file2 -> 141 154 { 142 - f_run_id; 143 - f_conj_id; 144 - f_obj1; 145 - f_met1; 146 - f_obj2; 147 - f_met2; 148 - f_min_range; 149 - f_vrel; 150 - f_prob; 151 - f_dilution; 152 - f_mdistance; 153 - f_epoch; 154 - f_jdate; 155 - f_x1; 156 - f_y1; 157 - f_z1; 158 - f_vx1; 159 - f_vy1; 160 - f_vz1; 161 - f_lx1; 162 - f_ly1; 163 - f_lz1; 164 - f_c1_11; 165 - f_c1_12; 166 - f_c1_13; 167 - f_c1_22; 168 - f_c1_23; 169 - f_c1_33; 170 - f_x2; 171 - f_y2; 172 - f_z2; 173 - f_vx2; 174 - f_vy2; 175 - f_vz2; 176 - f_lx2; 177 - f_ly2; 178 - f_lz2; 179 - f_c2_11; 180 - f_c2_12; 181 - f_c2_13; 182 - f_c2_22; 183 - f_c2_23; 184 - f_c2_33; 185 - f_file1; 186 - f_file2; 155 + f_run_id; f_conj_id; f_obj1; f_met1; f_obj2; f_met2; 156 + f_min_range; f_vrel; f_prob; f_dilution; f_mdistance; 157 + f_epoch; f_jdate; 158 + f_x1; f_y1; f_z1; f_vx1; f_vy1; f_vz1; 159 + f_lx1; f_ly1; f_lz1; 160 + f_c1_11; f_c1_12; f_c1_13; f_c1_22; f_c1_23; f_c1_33; 161 + f_x2; f_y2; f_z2; f_vx2; f_vy2; f_vz2; 162 + f_lx2; f_ly2; f_lz2; 163 + f_c2_11; f_c2_12; f_c2_13; f_c2_22; f_c2_23; f_c2_33; 164 + f_file1; f_file2; 187 165 }) 188 166 |> col "run_id" int ~enc:(fun f -> f.f_run_id) 189 167 |> col "conj_id" int ~enc:(fun f -> f.f_conj_id) ··· 234 212 235 213 (* {1 Flat to structured conversion} *) 236 214 215 + let obj_of_flat ~id ~met ~x ~y ~z ~vx ~vy ~vz ~lx ~ly ~lz 216 + ~c11 ~c12 ~c13 ~c22 ~c23 ~c33 ~filename = 217 + { 218 + id; met_criteria = met; 219 + state = { pos = { x; y; z }; vel = { x = vx; y = vy; z = vz } }; 220 + local = { x = lx; y = ly; z = lz }; 221 + cov = { cr_r = c11; ct_r = c12; ct_t = c22; 222 + cn_r = c13; cn_t = c23; cn_n = c33 }; 223 + filename; 224 + } 225 + 237 226 let of_flat f = 238 227 { 239 228 run_id = f.f_run_id; 240 229 conj_id = f.f_conj_id; 241 230 obj1 = 242 - { 243 - id = f.f_obj1; 244 - met_criteria = f.f_met1; 245 - state = 246 - { 247 - pos = { x = f.f_x1; y = f.f_y1; z = f.f_z1 }; 248 - vel = { x = f.f_vx1; y = f.f_vy1; z = f.f_vz1 }; 249 - }; 250 - local = { x = f.f_lx1; y = f.f_ly1; z = f.f_lz1 }; 251 - cov = 252 - { 253 - cr_r = f.f_c1_11; 254 - ct_r = f.f_c1_12; 255 - ct_t = f.f_c1_22; 256 - cn_r = f.f_c1_13; 257 - cn_t = f.f_c1_23; 258 - cn_n = f.f_c1_33; 259 - }; 260 - filename = f.f_file1; 261 - }; 231 + obj_of_flat ~id:f.f_obj1 ~met:f.f_met1 232 + ~x:f.f_x1 ~y:f.f_y1 ~z:f.f_z1 233 + ~vx:f.f_vx1 ~vy:f.f_vy1 ~vz:f.f_vz1 234 + ~lx:f.f_lx1 ~ly:f.f_ly1 ~lz:f.f_lz1 235 + ~c11:f.f_c1_11 ~c12:f.f_c1_12 ~c13:f.f_c1_13 236 + ~c22:f.f_c1_22 ~c23:f.f_c1_23 ~c33:f.f_c1_33 237 + ~filename:f.f_file1; 262 238 obj2 = 263 - { 264 - id = f.f_obj2; 265 - met_criteria = f.f_met2; 266 - state = 267 - { 268 - pos = { x = f.f_x2; y = f.f_y2; z = f.f_z2 }; 269 - vel = { x = f.f_vx2; y = f.f_vy2; z = f.f_vz2 }; 270 - }; 271 - local = { x = f.f_lx2; y = f.f_ly2; z = f.f_lz2 }; 272 - cov = 273 - { 274 - cr_r = f.f_c2_11; 275 - ct_r = f.f_c2_12; 276 - ct_t = f.f_c2_22; 277 - cn_r = f.f_c2_13; 278 - cn_t = f.f_c2_23; 279 - cn_n = f.f_c2_33; 280 - }; 281 - filename = f.f_file2; 282 - }; 239 + obj_of_flat ~id:f.f_obj2 ~met:f.f_met2 240 + ~x:f.f_x2 ~y:f.f_y2 ~z:f.f_z2 241 + ~vx:f.f_vx2 ~vy:f.f_vy2 ~vz:f.f_vz2 242 + ~lx:f.f_lx2 ~ly:f.f_ly2 ~lz:f.f_lz2 243 + ~c11:f.f_c2_11 ~c12:f.f_c2_12 ~c13:f.f_c2_13 244 + ~c22:f.f_c2_22 ~c23:f.f_c2_23 ~c33:f.f_c2_33 245 + ~filename:f.f_file2; 283 246 min_range = f.f_min_range; 284 247 rel_velocity = f.f_vrel; 285 248 probability = f.f_prob; ··· 327 290 wrap_result (Csvt.decode_string flat_codec s) |> Result.map (List.map of_flat) 328 291 329 292 let fold_csv_channel ic f acc = 330 - wrap_result (Csvt.fold_channel flat_codec ic (fun acc flat -> f acc (of_flat flat)) acc) 293 + wrap_result 294 + (Csvt.fold_channel flat_codec ic (fun acc flat -> f acc (of_flat flat)) acc) 331 295 332 296 let of_csv_channel ic = 333 297 wrap_result (Csvt.decode_channel flat_codec ic) |> Result.map (List.map of_flat) ··· 340 304 let tca cdm = cdm.epoch 341 305 let pc cdm = cdm.probability 342 306 307 + let tca_ptime cdm = 308 + let s = cdm.epoch ^ "Z" in 309 + match Ptime.of_rfc3339 ~strict:false s with 310 + | Ok (t, _, _) -> Some t 311 + | Error _ -> None 312 + 313 + let jdate_to_unix jd = (jd -. 2440587.5) *. 86400. 314 + let tca_unix cdm = jdate_to_unix cdm.jdate 315 + 343 316 (* {1 Pretty-printing} *) 344 317 345 - let pp_vec3 ppf v = 346 - Format.fprintf ppf "(%.6f, %.6f, %.6f)" v.x v.y v.z 318 + let pp_vec3 ppf v = Fmt.pf ppf "(%.6f, %.6f, %.6f)" v.x v.y v.z 347 319 348 320 let pp_state_vector ppf sv = 349 - Format.fprintf ppf "@[<v>pos: %a@,vel: %a@]" pp_vec3 sv.pos pp_vec3 sv.vel 321 + Fmt.pf ppf "@[<v>pos: %a@,vel: %a@]" pp_vec3 sv.pos pp_vec3 sv.vel 350 322 351 323 let pp_covariance ppf c = 352 - Format.fprintf ppf 324 + Fmt.pf ppf 353 325 "@[<v>| %+.6e %+.6e %+.6e |@,\ 354 326 | %+.6e %+.6e |@,\ 355 327 | %+.6e |@]" 356 328 c.cr_r c.ct_r c.cn_r c.ct_t c.cn_t c.cn_n 357 329 358 330 let pp_object_data ppf o = 359 - Format.fprintf ppf 331 + Fmt.pf ppf 360 332 "@[<v>id: %d (met_criteria: %b)@,\ 361 333 state: %a@,\ 362 334 local: %a@,\ ··· 366 338 o.cov o.filename 367 339 368 340 let pp ppf cdm = 369 - Format.fprintf ppf 341 + Fmt.pf ppf 370 342 "@[<v>--- Conjunction %d (run %d) ---@,\ 371 343 TCA: %s (JD %.8f)@,\ 372 344 Pc: %.10e@,\
+11 -1
lib/cdm.mli
··· 93 93 (** {1 Accessors} *) 94 94 95 95 val tca : t -> string 96 - (** [tca cdm] returns the time of closest approach. *) 96 + (** [tca cdm] returns the time of closest approach as ISO 8601 string. *) 97 + 98 + val tca_ptime : t -> Ptime.t option 99 + (** [tca_ptime cdm] returns the TCA as a {!Ptime.t}, or [None] if 100 + the epoch string cannot be parsed. *) 101 + 102 + val tca_unix : t -> float 103 + (** [tca_unix cdm] returns the TCA as a Unix timestamp (from Julian date). *) 104 + 105 + val jdate_to_unix : float -> float 106 + (** [jdate_to_unix jd] converts Julian date to Unix timestamp. *) 97 107 98 108 val pc : t -> float 99 109 (** [pc cdm] returns the probability of collision. *)
+1 -1
lib/dune
··· 1 1 (library 2 2 (name cdm) 3 3 (public_name cdm) 4 - (libraries csvt fmt)) 4 + (libraries csvt ptime fmt))