diff --git a/Data/extract_data.ml b/Data/extract_data.ml new file mode 100644 index 0000000..0022d0f --- /dev/null +++ b/Data/extract_data.ml @@ -0,0 +1,91 @@ +let read_file filename = + let ic = open_in filename in + let rec aux accu = + try + let new_accu = + (input_line ic) :: accu + in + aux new_accu + with End_of_file -> + (close_in ic; List.rev accu) + in + aux [] + + +let rec find_x x = function + | [] -> [] + | line :: rest -> + let line = String.trim line in + match String.split_on_char ' ' line with + | x_test :: _ -> + if x_test = x then line :: rest + else find_x x rest + | _ -> find_x x rest + +let get find_x conversion lines = + match find_x lines with + | line :: rest -> + begin + match String.split_on_char '=' line with + | _ :: n :: _ -> conversion @@ String.trim n, rest + | _ -> raise Exit + end + | [] -> raise Exit + +let read_float x = + match String.split_on_char ' ' x with + | x :: _ -> float_of_string x + | [] -> invalid_arg x + + +let find_summary = find_x "N_det" +let get_ndet = get find_summary int_of_string + +let find_nstates = find_x "N_states" +let get_nstates = get find_nstates int_of_string + +let find_nsop = find_x "N_sop" +let get_nsop = get find_nsop int_of_string + +let find_variance = find_x "Variance" +let get_variance = get find_variance read_float + +let find_pt2 = find_x "PT2" +let get_pt2 = get find_pt2 read_float + +let find_rpt2 = find_x "rPT2" +let get_rpt2 = get find_rpt2 read_float + +let find_e = find_x "E" +let get_e = get find_e float_of_string + + +let rec read_block lines = + let ndet, lines = get_ndet lines in + let nstates, lines = get_nstates lines in + let nsop, lines = get_nsop lines in + Printf.printf "%10d %10d" ndet nsop ; + let rec aux lines = function + | 0 -> (Printf.printf "\n%!" ; lines) + | n -> ( + let e, lines = get_e lines in + let variance, lines = get_variance lines in + let pt2, lines = get_pt2 lines in + let rpt2, lines = get_rpt2 lines in + Printf.printf " %16.10e %16.10f %16.10f" pt2 rpt2 e; + aux lines (n-1) ) + in + aux lines nstates + +let rec read_blocks lines = + try + let lines = read_block lines in + read_blocks lines + with Exit -> () + +let () = + Array.iteri (fun i fname -> + if i = 0 then () else + let lines = read_file fname in + read_blocks lines) Sys.argv +