lib.rs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. pub mod annotations;
  2. pub mod callers;
  3. pub mod config;
  4. pub mod in_out;
  5. pub mod sql;
  6. pub mod utils;
  7. pub mod variants;
  8. #[cfg(test)]
  9. mod tests {
  10. use anyhow::{Ok, Result};
  11. use indicatif::MultiProgress;
  12. use indicatif_log_bridge::LogWrapper;
  13. use log::info;
  14. use crate::{config::Config, sql::variants_sql::{load_variants_name, remove_variants_names}, variants::{VCFSource, VariantType, Variants, Variant}};
  15. use super::*;
  16. #[test]
  17. fn get_config() -> Result<()> {
  18. let conf_path = Config::path()?;
  19. println!("Configuration path {}", conf_path.to_str().unwrap());
  20. Ok(())
  21. }
  22. #[test]
  23. fn load_from_vcf() -> Result<()> {
  24. let name = "CAMARA";
  25. let logger =
  26. env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info"))
  27. .build();
  28. let multi = MultiProgress::new();
  29. LogWrapper::new(multi.clone(), logger).try_init().unwrap();
  30. let cfg = Config::get()?;
  31. let deepvariant_diag_vcf = format!(
  32. "{}/{name}/diag/DeepVariant/{name}_diag_DeepVariant_PASSED.vcf.gz",
  33. cfg.longreads_results_dir
  34. );
  35. if !std::path::Path::new(&deepvariant_diag_vcf).exists() {
  36. panic!("{deepvariant_diag_vcf} is required")
  37. }
  38. let deepvariant_mrd_vcf = format!(
  39. "{}/{name}/mrd/DeepVariant/{name}_mrd_DeepVariant_PASSED.vcf.gz",
  40. cfg.longreads_results_dir
  41. );
  42. if !std::path::Path::new(&deepvariant_mrd_vcf).exists() {
  43. panic!("{deepvariant_mrd_vcf} is required")
  44. }
  45. let mrd_bam = format!(
  46. "{}/{name}/mrd/{name}_mrd_hs1.bam",
  47. cfg.longreads_results_dir
  48. );
  49. if !std::path::Path::new(&mrd_bam).exists() {
  50. panic!("{mrd_bam} is required")
  51. }
  52. let clairs_vcf = format!(
  53. "{}/{name}/diag/ClairS/{name}_diag_clairs_PASSED.vcf.gz",
  54. cfg.longreads_results_dir
  55. );
  56. if !std::path::Path::new(&clairs_vcf).exists() {
  57. panic!("{clairs_vcf} is required")
  58. }
  59. let clairs_indels_vcf = format!(
  60. "{}/{name}/diag/ClairS/{name}_diag_clairs_indel_PASSED.vcf.gz",
  61. cfg.longreads_results_dir
  62. );
  63. if !std::path::Path::new(&clairs_indels_vcf).exists() {
  64. panic!("{clairs_indels_vcf} is required")
  65. }
  66. let sniffles_vcf = format!(
  67. "{}/{name}/diag/Sniffles/{name}_diag_sniffles.vcf",
  68. cfg.longreads_results_dir
  69. );
  70. let sniffles_mrd_vcf = format!(
  71. "{}/{name}/mrd/Sniffles/{name}_mrd_sniffles.vcf",
  72. cfg.longreads_results_dir
  73. );
  74. if !std::path::Path::new(&sniffles_vcf).exists() {
  75. panic!("{sniffles_vcf} is required")
  76. }
  77. let nanomonsv_vcf = format!(
  78. "{}/{name}/diag/nanomonsv/{name}_diag_nanomonsv_PASSED.vcf.gz",
  79. cfg.longreads_results_dir
  80. );
  81. if !std::path::Path::new(&nanomonsv_vcf).exists() {
  82. panic!("{nanomonsv_vcf} is required")
  83. }
  84. let db_path = "/data/db_results.sqlite".to_string();
  85. let loh_path = format!(
  86. "{}/{name}/diag/{name}_loh.vcf.gz",
  87. cfg.longreads_results_dir
  88. );
  89. let sources = vec![
  90. (
  91. deepvariant_diag_vcf.as_str(),
  92. &VCFSource::DeepVariant,
  93. &VariantType::Somatic,
  94. ),
  95. (
  96. deepvariant_mrd_vcf.as_str(),
  97. &VCFSource::DeepVariant,
  98. &VariantType::Constitutionnal,
  99. ),
  100. (
  101. clairs_vcf.as_str(),
  102. &VCFSource::ClairS,
  103. &VariantType::Somatic,
  104. ),
  105. (
  106. sniffles_vcf.as_str(),
  107. &VCFSource::Sniffles,
  108. &VariantType::Somatic,
  109. ),
  110. (
  111. sniffles_mrd_vcf.as_str(),
  112. &VCFSource::Sniffles,
  113. &VariantType::Constitutionnal,
  114. ),
  115. (
  116. nanomonsv_vcf.as_str(),
  117. &VCFSource::Nanomonsv,
  118. &VariantType::Somatic,
  119. ),
  120. ];
  121. let mut variants = Variants::from_vcfs(name.to_string(), sources, &cfg, multi.clone())?;
  122. variants.vcf_filters();
  123. variants.write_vcf_cat(&loh_path, &variants::VariantCategory::LOH)?;
  124. variants.bam_filters(&mrd_bam);
  125. variants.keep_somatics_un();
  126. info!("Variants retained: {}", variants.len());
  127. variants.merge();
  128. variants.sort()?;
  129. variants.vep();
  130. info!("Variants retained: {}", variants.len());
  131. let gff_path = "/data/ref/hs1/features_not_in_vep.gff.gz";
  132. variants.annotate_gff_feature(gff_path)?;
  133. variants.echtvar_annotate(&deepvariant_mrd_vcf)?;
  134. info!("{:?}", variants.data.get(10));
  135. variants.filter_snp()?;
  136. variants.stats()?;
  137. if std::path::Path::new(&db_path).exists() {
  138. remove_variants_names(&db_path, &name)?;
  139. }
  140. variants.save_sql(&db_path)?;
  141. variants.stats_sql(&db_path)?;
  142. info!("Variants : {}", variants.len());
  143. Ok(())
  144. }
  145. #[test]
  146. fn load_from_db() -> Result<()> {
  147. let name = "CAMARA";
  148. let logger =
  149. env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info"))
  150. .build();
  151. let multi = MultiProgress::new();
  152. LogWrapper::new(multi.clone(), logger).try_init().unwrap();
  153. let mut variants = load_variants_name(name, &multi)?;
  154. let v = variants.get_cat(&variants::VariantCategory::Constit);
  155. let v = v.iter().filter(|v| 0.25 < v.vaf.unwrap() && v.vaf.unwrap() < 0.75 ).map(|v| {
  156. }).collect::<Vec<Variant>>();
  157. lev
  158. variants.write_vcf_cat("test.vcf.gz", &variants::VariantCategory::Somatic)?;
  159. println!("{} variants loaded from db.", variants.len());
  160. Ok(())
  161. }
  162. }