Visualizes Quality Control(QC) Results of the Metabolomics for Quartet Project.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. (ns quartet-metqc-report.task
  2. (:require [quartet-metqc-report.metqc :as metqc]
  3. [local-fs.core :as fs-lib]
  4. [tservice-core.plugins.env :refer [add-env-to-path create-task! update-task!]]
  5. [tservice-core.plugins.util :as util]
  6. [clojure.data.json :as json]
  7. [clojure.tools.logging :as log]
  8. [tservice-core.tasks.async :refer [publish-event! make-events-init]]))
  9. (defn date
  10. []
  11. (.format (java.text.SimpleDateFormat. "yyyy-MM-dd")
  12. (new java.util.Date)))
  13. (defn update-process!
  14. [^String task-id ^Integer percentage]
  15. (let [record (cond
  16. (= percentage 100) {:status "Finished"
  17. :percentage 100
  18. :finished_time (util/time->int (util/now))}
  19. (= percentage -1) {:status "Failed"
  20. :finished_time (util/time->int (util/now))}
  21. :else {:percentage percentage})
  22. record (merge {:id task-id} record)]
  23. (update-task! record)))
  24. (defn update-log-process!
  25. "Update message into log file and process into database."
  26. [log-path coll task-id process]
  27. (spit log-path (json/write-str coll))
  28. (update-process! task-id process))
  29. (defn post-handler
  30. [{{:keys [name data_file metadata_file description owner plugin-context]
  31. :or {description (format "Quality control report for %s" name)}
  32. :as payload} :body}]
  33. (log/info (format "Create a report %s with %s" name payload))
  34. (let [payload (merge {:description description} payload)
  35. data-file (metqc/correct-filepath data_file)
  36. metadata-file (metqc/correct-filepath metadata_file)
  37. workdir (fs-lib/dirname data-file)
  38. log-path (fs-lib/join-paths workdir "log")
  39. response {:report (format "%s/multiqc_report.html" workdir)
  40. :log log-path}
  41. task-id (create-task! {:name name
  42. :description description
  43. :payload payload
  44. :owner owner
  45. :plugin-name "quartet-metqc-report"
  46. :plugin-type "ReportPlugin"
  47. :plugin-version (:plugin-version plugin-context)
  48. :response response})
  49. result-dir (fs-lib/join-paths workdir "results")]
  50. (fs-lib/create-directories! result-dir)
  51. (spit log-path (json/write-str {:status "Running"
  52. :msg ""}))
  53. (update-process! task-id 0)
  54. (publish-event! "quartet_metqc_report"
  55. {:data-file data-file
  56. :metadata-file metadata-file
  57. :dest-dir workdir
  58. :task-id task-id
  59. :metadata {:name name
  60. :description description
  61. :plugin-name "quartet-metqc-report"
  62. :plutin-type "ReportPlugin"
  63. :plugin-version (:plugin-version plugin-context)}})
  64. response))
  65. (defn- make-report!
  66. [{:keys [data-file metadata-file dest-dir metadata task-id]}]
  67. (let [log-path (fs-lib/join-paths dest-dir "log")
  68. result-dir (fs-lib/join-paths dest-dir "results")
  69. parameters-file (fs-lib/join-paths result-dir "general_information.json")
  70. results (util/chain-fn-coll [(fn []
  71. (update-process! task-id 20)
  72. (metqc/call-metqc! data-file metadata-file result-dir))
  73. (fn []
  74. (update-process! task-id 50)
  75. (spit parameters-file (json/write-str {"Report Name" (:name metadata)
  76. "Description" (:description metadata)
  77. "Report Tool" (format "%s-%s"
  78. (:plugin-name metadata)
  79. (:plugin-version metadata))
  80. "Team" "Quartet Team"
  81. "Date" (date)}))
  82. {:status "Success" :msg ""})
  83. (fn []
  84. (update-process! task-id 80)
  85. (metqc/multiqc result-dir dest-dir
  86. {:template "quartet_metabolite_report"
  87. :title "Quartet Report for Metabolomics"
  88. :env {:PATH (add-env-to-path "quartet-metqc-report")}}))]
  89. (fn [result] (= (:status result) "Success")))
  90. status (:status (last results))
  91. msg (apply str (map :msg results))
  92. process (if (= status "Success") 100 -1)]
  93. (log/info (format "Running batch command: %s" (pr-str results)))
  94. (update-log-process! log-path {:status status
  95. :msg msg}
  96. task-id process)))
  97. (def events-init
  98. "Automatically called during startup; start event listener for quartet_metqc_report events."
  99. (make-events-init "quartet_metqc_report" make-report!))