de.charite.compbio.jannovar.cmd.annotate_pos.AnnotatePositionCommand Maven / Gradle / Ivy
package de.charite.compbio.jannovar.cmd.annotate_pos;
import de.charite.compbio.jannovar.JannovarException;
import de.charite.compbio.jannovar.annotation.*;
import de.charite.compbio.jannovar.annotation.builders.AnnotationBuilderOptions;
import de.charite.compbio.jannovar.cmd.CommandLineParsingException;
import de.charite.compbio.jannovar.cmd.JannovarAnnotationCommand;
import de.charite.compbio.jannovar.hgvs.AminoAcidCode;
import de.charite.compbio.jannovar.reference.GenomePosition;
import de.charite.compbio.jannovar.reference.GenomeVariant;
import de.charite.compbio.jannovar.reference.PositionType;
import de.charite.compbio.jannovar.reference.Strand;
import net.sourceforge.argparse4j.inf.Namespace;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Allows the annotation of a single position.
*
* @author Marten Jaeger
* @author Manuel Holtgrewe
* @author Max Schubach
*/
public class AnnotatePositionCommand extends JannovarAnnotationCommand {
/**
* Configuration
*/
private JannovarAnnotatePosOptions options;
public AnnotatePositionCommand(String argv[], Namespace args) throws CommandLineParsingException {
this.options = new JannovarAnnotatePosOptions();
this.options.setFromArgs(args);
}
/**
* This function will simply annotate given chromosomal position with HGVS compliant output.
*
* For example, the change chr1:909238G>C could be converted to
* PLEKHN1:NM_032129.2:c.1460G>C,p.(Arg487Pro).
*
* @param options configuration for the command
* @throws AnnotationException on problems in the annotation process
*/
@Override
public void run() throws JannovarException {
System.err.println("Options");
System.err.println(options.toString());
System.err.println("Deserializing transcripts...");
deserializeTranscriptDefinitionFile(options.getDatabaseFilePath());
final AnnotationBuilderOptions abOptions = new AnnotationBuilderOptions(options.isNt3PrimeShifting(), false);
final VariantAnnotator annotator = new VariantAnnotator(refDict, chromosomeMap, abOptions);
System.out.println("#change\teffect\thgvs_annotation\tmessages");
for (String chromosomalChange : options.getGenomicChanges()) {
// Parse the chromosomal change string into a GenomeChange object.
final GenomeVariant genomeChange = parseGenomeChange(chromosomalChange);
// Construct VariantAnnotator for building the variant annotations.
VariantAnnotations annoList = null;
try {
annoList = annotator.buildAnnotations(genomeChange);
} catch (Exception e) {
System.err.println(String.format("[ERROR] Could not annotate variant %s!", chromosomalChange));
e.printStackTrace(System.err);
continue;
}
// Obtain first or all functional annotation(s) and effect(s).
final String annotation;
final String effect;
final String messages;
VariantAnnotationsTextGenerator textGenerator;
if (options.isShowAll())
textGenerator = new AllAnnotationListTextGenerator(annoList, 0, 1);
else
textGenerator = new BestAnnotationListTextGenerator(annoList, 0, 1);
annotation = textGenerator.buildHGVSText(
options.isUseThreeLetterAminoAcidCode() ? AminoAcidCode.THREE_LETTER : AminoAcidCode.ONE_LETTER);
effect = textGenerator.buildEffectText();
messages = textGenerator.buildMessages();
System.out.println(String.format("%s\t%s\t%s\t%s", chromosomalChange.toString(), effect, annotation, messages));
}
}
private GenomeVariant parseGenomeChange(String changeStr) throws JannovarException {
Pattern pat = Pattern.compile("(chr[0-9MXY]+):([0-9]+)([ACGTN]*)>([ACGTN]*)");
Matcher match = pat.matcher(changeStr);
if (!match.matches()) {
System.err.println("[ERROR] Input string for the chromosomal change " + changeStr
+ " does not fit the regular expression ... :(");
System.exit(3);
}
int chr = refDict.getContigNameToID().get(match.group(1));
int pos = Integer.parseInt(match.group(2));
String ref = match.group(3);
String alt = match.group(4);
return new GenomeVariant(new GenomePosition(refDict, Strand.FWD, chr, pos, PositionType.ONE_BASED), ref, alt);
}
}