diff --git a/doc/tools/ExportcBioportal.md b/doc/tools/ExportcBioportal.md index 0003379e7..432db744e 100644 --- a/doc/tools/ExportcBioportal.md +++ b/doc/tools/ExportcBioportal.md @@ -1,5 +1,5 @@ ### ExportcBioportal tool help - ExportcBioportal (2023_06-98-g044e3ed3) + ExportcBioportal (2023_09-38-ga9141a54) Converts a FASTQ file to FASTA format. @@ -12,6 +12,8 @@ Optional parameters: -test Uses the test database instead of on the production database. Default value: 'false' + -debug Provide additional debug output on stdout. + Default value: 'false' Special parameters: --help Shows this help and exits. @@ -20,6 +22,6 @@ --tdx Writes a Tool Definition Xml file. The file name is the application name with the suffix '.tdx'. ### ExportcBioportal changelog - ExportcBioportal 2023_06-98-g044e3ed3 + ExportcBioportal 2023_09-38-ga9141a54 [back to ngs-bits](https://github.com/imgag/ngs-bits) \ No newline at end of file diff --git a/doc/tools/FastqCheckUMI.md b/doc/tools/FastqCheckUMI.md new file mode 100644 index 000000000..631eb471f --- /dev/null +++ b/doc/tools/FastqCheckUMI.md @@ -0,0 +1,25 @@ +### FastqCheckUMI tool help + FastqCheckUMI (2023_09-38-ga9141a54) + + Returns the UMI info of a FastQ file on STDOUT. + + Mandatory parameters: + -in Input FASTQ file. + + Optional parameters: + -out Output file containing the result string. If unset, writes to STDOUT. + Default value: '' + -lines Number of lines which should be checked. (default: 10) + Default value: '10' + + Special parameters: + --help Shows this help and exits. + --version Prints version and exits. + --changelog Prints changeloge and exits. + --tdx Writes a Tool Definition Xml file. The file name is the application name with the suffix '.tdx'. + +### FastqCheckUMI changelog + FastqCheckUMI 2023_09-38-ga9141a54 + + 2023-10-05 Initial commit. +[back to ngs-bits](https://github.com/imgag/ngs-bits) \ No newline at end of file diff --git a/doc/tools/VariantFilterAnnotations.md b/doc/tools/VariantFilterAnnotations.md index 5c4ff1cdd..e9ddf7144 100644 --- a/doc/tools/VariantFilterAnnotations.md +++ b/doc/tools/VariantFilterAnnotations.md @@ -1,5 +1,5 @@ ### VariantFilterAnnotations tool help - VariantFilterAnnotations (2023_03-107-g2a1d2478) + VariantFilterAnnotations (2023_09-38-ga9141a54) Filter a variant list in GSvar format based on variant annotations. @@ -80,16 +80,15 @@ Parameters: action - Action to perform [default=FILTER] [valid=REMOVE,FILTER] Predicted pathogenic Filter for variants predicted to be pathogenic. - Pathogenicity predictions used by this filter are: phyloP, Sift, PolyPhen, CADD and REVEL. + Pathogenicity predictions used by this filter are: phyloP, CADD, REVEL and AlphaMissense. Parameters: min - Minimum number of pathogenic predictions [default=1] [min=1] action - Action to perform [default=FILTER] [valid=KEEP,FILTER] skip_high_impact - Do not apply this filter to variants with impact 'HIGH'. [default=false] + cutoff_phylop - Minimum phyloP score for a pathogenic prediction. The phyloP score is not used if set to -10.0. [default=1.6] cutoff_cadd - Minimum CADD score for a pathogenic prediction. The CADD score is not used if set to 0.0. [default=20] [min=0] cutoff_revel - Minimum REVEL score for a pathogenic prediction. The REVEL score is not used if set to 0.0. [default=0.9] [min=0] [max=1] - cutoff_phylop - Minimum phyloP score for a pathogenic prediction. The phyloP score is not used if set to -10.0. [default=1.6] - ignore_sift - Do not used the Sift score. If unset, Sift consequence 'D' is considered pathogenic. [default=false] - ignore_polyphen - Do not used the PolyPhen score. If unset, PolyPhen consequence 'D' is considered pathogenic. [default=false] + cutoff_alphamissense - Minimum AlphaMissense score for a pathogenic prediction. The AlphaMissense score is not used if set to 0.0. [default=0.564] [min=0] [max=1] RNA ASE allele frequency Filter based on the allele specific expression allele frequency. Parameters: min_af - Minimal expression allele frequency. [default=0] [min=0.0] [max=1.0] @@ -143,8 +142,8 @@ build - Genome build used for pseudoautosomal region coordinates [default=hg38] [valid=hg19,hg38] Tumor zygosity Filter based on the zygosity of tumor-only samples. Filters out germline het/hom calls. Parameters: - het_af_range - Consider allele frequencies of 50% ± het_af_range as heterozygous and thus as germline. [default=0] [min=0] [max=49.9] - hom_af_range - Consider allele frequencies of 100% ± hom_af_range as homozygous and thus as germline. [default=0] [min=0] [max=99.9] + het_af_range - Consider allele frequencies of 50% ± het_af_range as heterozygous and thus as germline. [default=0] [min=0] [max=49.9] + hom_af_range - Consider allele frequencies of 100% ± hom_af_range as homozygous and thus as germline. [default=0] [min=0] [max=99.9] Variant quality Filter for variant quality Parameters: qual - Minimum variant quality score (Phred) [default=250] [min=0] @@ -175,7 +174,7 @@ --tdx Writes a Tool Definition Xml file. The file name is the application name with the suffix '.tdx'. ### VariantFilterAnnotations changelog - VariantFilterAnnotations 2023_03-107-g2a1d2478 + VariantFilterAnnotations 2023_09-38-ga9141a54 2018-07-30 Replaced command-line parameters by INI file and added many new filters. 2017-06-14 Refactoring of genotype-based filters: now also supports multi-sample filtering of affected and control samples. diff --git a/src/GSvar/MainWindow.cpp b/src/GSvar/MainWindow.cpp index a153f9f8b..a56ba2270 100644 --- a/src/GSvar/MainWindow.cpp +++ b/src/GSvar/MainWindow.cpp @@ -5896,7 +5896,7 @@ void MainWindow::on_actionImportSampleRelations_triggered() void MainWindow::on_actionImportSampleHpoTerms_triggered() { importBatch("Import sample HPO terms", - "Batch import of sample HPO terms. Must contain the following tab-separated fields:
sample1, HPO term id, e.g. 'HP:0003002'", + "Batch import of sample HPO terms. Must contain the following tab-separated fields:
sample1, HPO term id e.g. 'HP:0003002'", "sample_disease_info", QStringList() << "sample_id" << "disease_info" ); diff --git a/src/GSvar/VariantDetailsDockWidget.cpp b/src/GSvar/VariantDetailsDockWidget.cpp index fabee1d1f..e0e0c6cf6 100644 --- a/src/GSvar/VariantDetailsDockWidget.cpp +++ b/src/GSvar/VariantDetailsDockWidget.cpp @@ -83,10 +83,9 @@ void VariantDetailsDockWidget::setLabelTooltips(const VariantList& vl) //pathogenicity predictions ui->label_phylop->setToolTip(vl.annotationDescriptionByName("phyloP").description()); - ui->label_sift->setToolTip(vl.annotationDescriptionByName("Sift").description()); - ui->label_polyphen->setToolTip(vl.annotationDescriptionByName("PolyPhen").description()); ui->label_cadd->setToolTip(vl.annotationDescriptionByName("CADD").description()); - ui->label_revel->setToolTip(vl.annotationDescriptionByName("REVEL").description()); + ui->label_revel->setToolTip(vl.annotationDescriptionByName("REVEL", false).description()); // optional + ui->label_alphamissense->setToolTip(vl.annotationDescriptionByName("AlphaMissense", false).description()); // optional (license and support of old //splicing/regulatory ui->label_maxentscan->setToolTip(vl.annotationDescriptionByName("MaxEntScan").description()); @@ -180,10 +179,9 @@ void VariantDetailsDockWidget::updateVariant(const VariantList& vl, int index) //pathogenity predictions setAnnotation(ui->phylop, vl, index, "phyloP"); - setAnnotation(ui->sift, vl, index, "Sift"); - setAnnotation(ui->polyphen, vl, index, "PolyPhen"); setAnnotation(ui->cadd, vl, index, "CADD"); setAnnotation(ui->revel, vl, index, "REVEL"); + setAnnotation(ui->alphamissense, vl, index, "AlphaMissense"); //splicing/regulatory setAnnotation(ui->maxentscan, vl, index, "MaxEntScan"); @@ -410,10 +408,6 @@ void VariantDetailsDockWidget::setAnnotation(QLabel* label, const VariantList& v text = anno; } } - else if(name=="Sift" || name=="PolyPhen") - { - text = anno.replace("D", formatText("D", RED)).replace("P", formatText("P", ORANGE)); - } else if(name=="REVEL") { bool ok = true; @@ -431,6 +425,23 @@ void VariantDetailsDockWidget::setAnnotation(QLabel* label, const VariantList& v text = anno; } } + else if(name=="AlphaMissense") + { + bool ok = true; + double value = anno.toDouble(&ok); + if (ok && value>=0.564) + { + text = formatText(anno, RED); + } + else if (ok && value<=0.34) + { + text = formatText(anno, GREEN); + } + else + { + text = anno; + } + } else if(name=="classification") { bool ok = true; diff --git a/src/GSvar/VariantDetailsDockWidget.ui b/src/GSvar/VariantDetailsDockWidget.ui index 1eccdbcbf..8cac4067c 100644 --- a/src/GSvar/VariantDetailsDockWidget.ui +++ b/src/GSvar/VariantDetailsDockWidget.ui @@ -1293,31 +1293,30 @@ 3 - - - - <html><head/><body><p><span style=" font-weight:600; color:#222222;">Pathogenicity</span></p></body></html> - - - - - + + - + 0 0 + + + 0 + 0 + + - phyloP: + - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - + + 0 @@ -1333,29 +1332,23 @@ - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - 0 - 0 - - - - Sift: + + + + Qt::Vertical - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + 1 + 1 + - + - - + + 0 @@ -1371,45 +1364,17 @@ - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - - 0 - 0 - - - - PolyPhen: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - 0 - 0 - - + + - REVEL: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + <html><head/><body><p><span style=" font-weight:600; color:#222222;">Pathogenicity</span></p></body></html> - - + + 0 @@ -1430,7 +1395,7 @@ - + @@ -1446,59 +1411,53 @@ - - + + - + 0 0 - - - 0 - 0 - - - + AlphaMissense: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - + + - + 0 0 - - - 0 - 0 - - - + phyloP: - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - Qt::Vertical + + + + + 0 + 0 + - - - 1 - 1 - + + REVEL: - + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + diff --git a/src/cppNGS-TEST/FilterCascade_Test.h b/src/cppNGS-TEST/FilterCascade_Test.h index 260f20f5a..a1e9d7cf2 100644 --- a/src/cppNGS-TEST/FilterCascade_Test.h +++ b/src/cppNGS-TEST/FilterCascade_Test.h @@ -633,26 +633,18 @@ private slots: filter.setString("action", "FILTER"); filter.setInteger("min", 1); filter.apply(vl, result); - I_EQUAL(result.countPassing(), 24); + I_EQUAL(result.countPassing(), 17); filter.setInteger("min", 2); filter.apply(vl, result); - I_EQUAL(result.countPassing(), 6); - - filter.setInteger("min", 3); - filter.apply(vl, result); - I_EQUAL(result.countPassing(), 1); - - filter.setInteger("min", 4); - filter.apply(vl, result); I_EQUAL(result.countPassing(), 0); //KEEP result.reset(false); filter.setString("action", "KEEP"); - filter.setInteger("min", 2); + filter.setInteger("min", 1); filter.apply(vl, result); - I_EQUAL(result.countPassing(), 6); + I_EQUAL(result.countPassing(), 17); } void FilterAnnotationText_apply() diff --git a/src/cppNGS/FilterCascade.cpp b/src/cppNGS/FilterCascade.cpp index 20c5e63a5..cf924bef9 100644 --- a/src/cppNGS/FilterCascade.cpp +++ b/src/cppNGS/FilterCascade.cpp @@ -2001,21 +2001,22 @@ bool FilterAnnotationPathogenic::annotatedPathogenic(const Variant& v) const FilterPredictionPathogenic::FilterPredictionPathogenic() { name_ = "Predicted pathogenic"; - description_ = QStringList() << "Filter for variants predicted to be pathogenic." << "Pathogenicity predictions used by this filter are: phyloP, Sift, PolyPhen, CADD and REVEL."; + description_ = QStringList() << "Filter for variants predicted to be pathogenic." << "Pathogenicity predictions used by this filter are: phyloP, CADD, REVEL and AlphaMissense."; params_ << FilterParameter("min", FilterParameterType::INT, 1, "Minimum number of pathogenic predictions"); params_.last().constraints["min"] = "1"; params_ << FilterParameter("action", FilterParameterType::STRING, "FILTER", "Action to perform"); params_.last().constraints["valid"] = "KEEP,FILTER"; params_ << FilterParameter("skip_high_impact", FilterParameterType::BOOL, false, "Do not apply this filter to variants with impact 'HIGH'."); //cutoffs + params_ << FilterParameter("cutoff_phylop", FilterParameterType::DOUBLE, 1.6, "Minimum phyloP score for a pathogenic prediction. The phyloP score is not used if set to -10.0."); params_ << FilterParameter("cutoff_cadd", FilterParameterType::DOUBLE, 20.0, "Minimum CADD score for a pathogenic prediction. The CADD score is not used if set to 0.0."); params_.last().constraints["min"] = "0"; params_ << FilterParameter("cutoff_revel", FilterParameterType::DOUBLE, 0.9, "Minimum REVEL score for a pathogenic prediction. The REVEL score is not used if set to 0.0."); params_.last().constraints["min"] = "0"; params_.last().constraints["max"] = "1"; - params_ << FilterParameter("cutoff_phylop", FilterParameterType::DOUBLE, 1.6, "Minimum phyloP score for a pathogenic prediction. The phyloP score is not used if set to -10.0."); - params_ << FilterParameter("ignore_sift", FilterParameterType::BOOL, false, "Do not used the Sift score. If unset, Sift consequence 'D' is considered pathogenic."); - params_ << FilterParameter("ignore_polyphen", FilterParameterType::BOOL, false, "Do not used the PolyPhen score. If unset, PolyPhen consequence 'D' is considered pathogenic."); + params_ << FilterParameter("cutoff_alphamissense", FilterParameterType::DOUBLE, 0.564, "Minimum AlphaMissense score for a pathogenic prediction. The AlphaMissense score is not used if set to 0.0."); + params_.last().constraints["min"] = "0"; + params_.last().constraints["max"] = "1"; checkIsRegistered(); } @@ -2031,18 +2032,17 @@ void FilterPredictionPathogenic::apply(const VariantList& variants, FilterResult min = getInt("min"); i_phylop = annotationColumn(variants, "phyloP"); - i_sift = annotationColumn(variants, "Sift"); - i_polyphen = annotationColumn(variants, "PolyPhen"); i_cadd = annotationColumn(variants, "CADD"); i_revel = annotationColumn(variants, "REVEL"); + i_alphamissense = annotationColumn(variants, "AlphaMissense", false); //optional to support old GSvar files without AlphaMissense + skip_high_impact = getBool("skip_high_impact"); i_co_sp = annotationColumn(variants, "coding_and_splicing"); cutoff_cadd = getDouble("cutoff_cadd"); cutoff_revel = getDouble("cutoff_revel"); cutoff_phylop = getDouble("cutoff_phylop"); - ignore_sift = getBool("ignore_sift"); - ignore_polyphen = getBool("ignore_polyphen"); + cutoff_alphamissense = getDouble("cutoff_alphamissense"); if (getString("action")=="FILTER") { @@ -2070,16 +2070,6 @@ bool FilterPredictionPathogenic::predictedPathogenic(const Variant& v) const { int count = 0; - if (!ignore_sift && v.annotations()[i_sift].contains("D")) - { - ++count; - } - - if (!ignore_polyphen && v.annotations()[i_polyphen].contains("D")) - { - ++count; - } - if (cutoff_phylop>-10) { bool ok; @@ -2112,6 +2102,16 @@ bool FilterPredictionPathogenic::predictedPathogenic(const Variant& v) const } } + if (i_alphamissense>=0 && cutoff_alphamissense>0) //optional to support old GSvar files without AlphaMissense + { + bool ok; + double value = v.annotations()[i_alphamissense].toDouble(&ok); + if (ok && value>=cutoff_alphamissense) + { + ++count; + } + } + return count>=min; } diff --git a/src/cppNGS/FilterCascade.h b/src/cppNGS/FilterCascade.h index 267fdb958..2eea9da74 100644 --- a/src/cppNGS/FilterCascade.h +++ b/src/cppNGS/FilterCascade.h @@ -548,18 +548,16 @@ class CPPNGSSHARED_EXPORT FilterPredictionPathogenic mutable int min; mutable int i_phylop; - mutable int i_sift; - mutable int i_polyphen; mutable int i_cadd; mutable int i_revel; + mutable int i_alphamissense; mutable bool skip_high_impact; mutable int i_co_sp; mutable double cutoff_cadd; mutable double cutoff_revel; mutable double cutoff_phylop; - mutable bool ignore_sift; - mutable bool ignore_polyphen; + mutable double cutoff_alphamissense; }; //Annotation text filter