Output logs to AppUser/Roaming/Parasitemia/Logs
[master-thesis.git] / Parasitemia / ParasitemiaUI / Utils.fs
1 module ParasitemiaUI.Utils
2
3 open System.IO
4
5 open Newtonsoft.Json
6
7 open Types
8
9 let inline listAsStr (s : 'a seq) =
10 s |> Seq.fold (fun acc obj -> acc + (if acc = "" then "" else ", ") + string obj) ""
11
12 let percentText (nbTotal : int, nb : int) : string =
13 if nbTotal = 0 then
14 ""
15 else
16 let percent = 100. * (float nb) / (float nbTotal)
17 sprintf "%.1f %% (%d / %d)" percent nb nbTotal
18
19 let predefinedPPIFilename = "predefined-ppi.json"
20 let predefinedPPIFilepath = Path.Combine (Constants.USER_DIRECTORY, predefinedPPIFilename)
21
22 let sensorSizesFilename = "sensor-sizes.json"
23 let sensorSizesFilepath = Path.Combine (Constants.USER_DIRECTORY, sensorSizesFilename)
24
25 let private savePredefinedPPIToFile (predefinedPPI : PredefinedPPI list) =
26 try
27 Directory.CreateDirectory Constants.USER_DIRECTORY |> ignore
28 use file = new StreamWriter (predefinedPPIFilepath)
29 file.Write (JsonConvert.SerializeObject (predefinedPPI, JsonSerializerSettings (Formatting = Formatting.Indented)))
30 with
31 ex ->
32 Logger.Log.Error "Unable to save predefined PPI to file \"%s\": %O" predefinedPPIFilepath ex
33
34 let private saveSensorSizesToFile (sensorSizes : SensorSize list) =
35 try
36 Directory.CreateDirectory Constants.USER_DIRECTORY |> ignore
37 use file = new StreamWriter (sensorSizesFilepath)
38 file.Write (JsonConvert.SerializeObject (sensorSizes, JsonSerializerSettings (Formatting = Formatting.Indented)))
39 with
40 ex ->
41 Logger.Log.Error "Unable to save sensor sizes to file \"%s\": %O" sensorSizesFilepath ex
42
43 let predefinedPPI : PredefinedPPI list =
44 try
45 use file = new StreamReader (predefinedPPIFilepath)
46 JsonConvert.DeserializeObject<PredefinedPPI list> (file.ReadToEnd ())
47 with
48 | _ex ->
49 savePredefinedPPIToFile defaultPredefinedPPI
50 defaultPredefinedPPI
51
52 let sensorSizes : SensorSize list =
53 try
54 use file = new StreamReader (sensorSizesFilepath)
55 JsonConvert.DeserializeObject<SensorSize list> (file.ReadToEnd ())
56 with
57 | _ex ->
58 saveSensorSizesToFile defaultSensorSizes
59 defaultSensorSizes
60
61 let toRomanNumber (v : int) : string =
62 let rec decompose (v : int) : string =
63 if v >= 1000 then
64 "M" + decompose (v - 1000)
65 elif v >= 900 then
66 "CM" + decompose (v - 900)
67 elif v >= 500 then
68 "D" + decompose (v - 500)
69 elif v >= 400 then
70 "CD" + decompose (v - 400)
71 elif v >= 100 then
72 "C" + decompose (v - 100)
73 elif v >= 90 then
74 "XC" + decompose (v - 90)
75 elif v >= 50 then
76 "L" + decompose (v - 50)
77 elif v >= 40 then
78 "XL" + decompose (v - 40)
79 elif v >= 10 then
80 "X" + decompose (v - 10)
81 elif v >= 9 then
82 "IX" + decompose (v - 9)
83 elif v >= 5 then
84 "V" + decompose (v - 5)
85 elif v >= 4 then
86 "IV" + decompose (v - 4)
87 elif v >= 1 then
88 "I" + decompose (v - 1)
89 else
90 ""
91 decompose v
92
93 let argsHelp =
94 let programName = System.AppDomain.CurrentDomain.FriendlyName
95 "Usage of Parasitemia:\n" +
96 "Non-interactive mode:\n" +
97 (sprintf " %s (--folder <folder>|--file <file>) --output <folder> [--debug]\n" programName) +
98 " --folder <folder> : an input folder containing images to analyze\n" +
99 " --file <file> : an image file to be analyzed\n" +
100 " --output <folder> : a folder to put the results\n" +
101 " --debug : output more information like intermediate images (it takes more CPU and memory) and write debug information to the log files\n" +
102
103 "Interactive mode:\n" +
104 (sprintf " %s [<document-file>] [--debug]\n" programName) +
105 " <document-file> : a PIAZ file to automatically open at startup\n" +
106 " --debug : output information like intermediate images in the current directory (it takes more CPU and memory)"