type coordinates = ( (Element.t * Coordinate.t) array) let of_xyz_file ~filename = let lexbuf = let ic = open_in filename in Lexing.from_channel ic in Xyz_parser.input Nuclei_lexer.read_all lexbuf let of_zmt_file ~filename = let ic = open_in filename in let rec aux accu = try let line = input_line ic in aux (line::accu) with End_of_file -> close_in ic; List.rev accu |> String.concat "\n" in aux [] |> Zmatrix.of_string |> Zmatrix.to_xyz |> Array.map (fun (e,x,y,z) -> (e, Coordinate.of_3_floats x y z )) let to_string atoms = " Nuclear Coordinates (Angstrom) ------------------------------ ----------------------------------------------------------------------- Center Atomic Element Coordinates (Angstroms) Number X Y Z ----------------------------------------------------------------------- " ^ (Array.mapi (fun i (e, coord) -> let coord = Coordinate.to_Angstrom coord in Printf.sprintf " %5d %5d %5s %12.6f %12.6f %12.6f" (i+1) (Element.to_int e) (Element.to_string e) (Coordinate.x coord) (Coordinate.y coord) (Coordinate.z coord) ) atoms |> Array.to_list |> String.concat "\n" ) ^ " ----------------------------------------------------------------------- "