Visualizes Quality Control(QC) results from proteomics data 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.

task.clj 5.6KB

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