use of htsjdk.samtools.SamReaderFactory in project jvarkit by lindenb.
the class BamStats01 method doWork.
@Override
public int doWork(final List<String> inputs) {
final List<String> args = new ArrayList<>(IOUtils.unrollFiles(inputs));
try {
this.out = super.openFileOrStdoutAsPrintStream(this.outputFile);
out.print("#Filename\tSample");
for (Category2 cat2 : Category2.values()) {
for (Category cat1 : Category.values()) {
// je je suis libertineuuh, je suis une cat1
out.print("\t" + cat2 + "_" + cat1);
}
if (bedFile == null)
break;
}
out.println();
final SamReaderFactory srf = super.createSamReaderFactory();
if (args.isEmpty()) {
final SamReader r = srf.open(SamInputResource.of(stdin()));
run("stdin", r);
r.close();
} else {
for (final String filename : args) {
LOG.info("Reading from " + filename);
final SamReader sfr = srf.open(new File(filename));
run(filename, sfr);
sfr.close();
}
}
out.flush();
this.out.flush();
this.out.close();
return RETURN_OK;
} catch (Exception e) {
LOG.error(e);
return -1;
} finally {
CloserUtil.close(out);
}
}
use of htsjdk.samtools.SamReaderFactory in project jvarkit by lindenb.
the class BamStats02 method doWork.
@Override
public int doWork(List<String> args) {
SamReader samFileReader = null;
PrintWriter out = null;
try {
if (bedFile != null) {
LOG.info("Reading BED file " + bedFile);
this.intervals = super.readBedFileAsBooleanIntervalTreeMap(bedFile);
}
out = super.openFileOrStdoutAsPrintWriter(outputFile);
boolean first = true;
out.print("#");
for (final STRING_PROPS p : STRING_PROPS.values()) {
if (!first)
out.print("\t");
first = false;
out.print(p.name());
}
for (final INT_PROPS p : INT_PROPS.values()) {
out.print("\t");
out.print(p.name());
}
for (final SAMFlag flg : SAMFlag.values()) {
out.print("\t");
out.print(flg.name());
}
out.print("\t");
out.print("count");
out.println();
final SamReaderFactory srf = super.createSamReaderFactory();
if (args.isEmpty()) {
LOG.info("Reading from stdin");
samFileReader = srf.open(SamInputResource.of(stdin()));
run("stdin", samFileReader, out);
samFileReader.close();
samFileReader = null;
} else {
for (final String filename : IOUtils.unrollFiles(args)) {
LOG.info("Reading from " + filename);
samFileReader = srf.open(new File(filename));
run(filename, samFileReader, out);
samFileReader.close();
samFileReader = null;
}
}
out.flush();
return RETURN_OK;
} catch (Exception err) {
LOG.error(err);
return -1;
} finally {
CloserUtil.close(samFileReader);
CloserUtil.close(out);
}
}
use of htsjdk.samtools.SamReaderFactory in project jvarkit by lindenb.
the class Biostar172515 method doWork.
@Override
public int doWork(final List<String> inputFiles) {
final SamReaderFactory samReaderFactory = SamReaderFactory.makeDefault().setOption(SamReaderFactory.Option.CACHE_FILE_BASED_INDEXES, Boolean.TRUE).validationStringency(ValidationStringency.LENIENT);
OutputStream stream = null;
SamReader samReader = null;
Set<String> args = IOUtils.unrollFiles(inputFiles);
try {
stream = super.openFileOrStdoutAsStream(this.outputFile);
XMLOutputFactory xof = XMLOutputFactory.newFactory();
this.w = xof.createXMLStreamWriter(stream);
this.w.writeStartDocument("UTF-8", "1.0");
this.w.writeStartElement("bai-list");
for (final String filename : args) {
this.w.writeStartElement("bam");
this.w.writeAttribute("bam", filename);
samReader = samReaderFactory.open(SamInputResource.of(filename));
this.w.writeAttribute("has-index", String.valueOf(samReader.hasIndex()));
if (!samReader.hasIndex()) {
this.w.writeEndElement();
samReader.close();
continue;
}
final SamReader.Indexing indexing = samReader.indexing();
if (!indexing.hasBrowseableIndex()) {
this.w.writeComment("no browseable index");
this.w.writeEndElement();
samReader.close();
continue;
}
final SAMSequenceDictionary dict = samReader.getFileHeader().getSequenceDictionary();
this.w.writeAttribute("n_ref", String.valueOf(dict.size()));
final BrowseableBAMIndex baiFile;
try {
baiFile = indexing.getBrowseableIndex();
} catch (Exception err) {
this.w.writeComment("no browseable index");
this.w.writeEndElement();
samReader.close();
continue;
}
for (int tid = 0; tid < dict.size(); ++tid) {
final SAMSequenceRecord ssr = dict.getSequence(tid);
final BAMIndexMetaData baiMetaData = baiFile.getMetaData(tid);
this.w.writeStartElement("reference");
this.w.writeAttribute("ref-id", String.valueOf(tid));
this.w.writeAttribute("ref-name", ssr.getSequenceName());
this.w.writeAttribute("ref-length", String.valueOf(ssr.getSequenceLength()));
this.w.writeAttribute("n_aligned", String.valueOf(baiMetaData.getAlignedRecordCount()));
BinList binList = baiFile.getBinsOverlapping(tid, 1, ssr.getSequenceLength());
int n_bin = 0;
for (@SuppressWarnings("unused") final Bin binItem : binList) n_bin++;
this.w.writeAttribute("n_bin", String.valueOf(n_bin));
this.w.writeAttribute("n_no_coor", String.valueOf(baiMetaData.getUnalignedRecordCount()));
for (final Bin binItem : binList) {
this.w.writeStartElement("bin");
this.w.writeAttribute("first-locus", String.valueOf(baiFile.getFirstLocusInBin(binItem)));
this.w.writeAttribute("last-locus", String.valueOf(baiFile.getLastLocusInBin(binItem)));
this.w.writeAttribute("level", String.valueOf(baiFile.getLevelForBin(binItem)));
final BAMFileSpan span = baiFile.getSpanOverlapping(binItem);
this.w.writeAttribute("first-offset", String.valueOf(span.getFirstOffset()));
final List<Chunk> chunks = span.getChunks();
this.w.writeAttribute("n_chunk", String.valueOf(chunks.size()));
for (final Chunk chunk : chunks) {
this.w.writeEmptyElement("chunk");
this.w.writeAttribute("chunk_beg", String.valueOf(chunk.getChunkStart()));
this.w.writeAttribute("chunk_end", String.valueOf(chunk.getChunkEnd()));
}
this.w.writeEndElement();
}
this.w.writeEndElement();
}
this.w.writeEndElement();
samReader.close();
}
this.w.writeEndElement();
this.w.flush();
this.w.close();
return 0;
} catch (final Exception err) {
LOG.error(err);
return -1;
} finally {
CloserUtil.close(this.w);
CloserUtil.close(stream);
CloserUtil.close(samReader);
this.w = null;
}
}
use of htsjdk.samtools.SamReaderFactory in project jvarkit by lindenb.
the class BioAlcidae method execute_bam.
private int execute_bam(String source) throws IOException {
SamReader in = null;
SAMRecordIterator iter = null;
try {
SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
if (source == null) {
in = srf.open(SamInputResource.of(stdin()));
} else {
in = srf.open(SamInputResource.of(source));
}
iter = in.iterator();
bindings.put("header", in.getFileHeader());
bindings.put("iter", iter);
bindings.put("format", "sam");
this.script.eval(bindings);
this.writer.flush();
return RETURN_OK;
} catch (Exception e) {
LOG.error(e);
return -1;
} finally {
CloserUtil.close(in);
CloserUtil.close(iter);
bindings.remove("header");
bindings.remove("iter");
bindings.remove("format");
}
}
use of htsjdk.samtools.SamReaderFactory in project jvarkit by lindenb.
the class IgvReview method start.
@Override
public void start(final Stage stage) throws Exception {
stage.setTitle(getClass().getSimpleName());
Predicate<VariantContext> ctxFilter;
Map<String, String> params = super.getParameters().getNamed();
if (params.containsKey("--filter")) {
ctxFilter = JexlVariantPredicate.create(params.get("--filter"));
} else {
ctxFilter = V -> true;
}
final List<String> args = super.getParameters().getUnnamed();
final File configFile;
if (args.isEmpty()) {
final FileChooser fc = new FileChooser();
final String lastDirStr = preferences.get(LAST_USED_DIR_KEY, null);
if (lastDirStr != null && !lastDirStr.isEmpty()) {
fc.setInitialDirectory(new File(lastDirStr));
}
fc.getExtensionFilters().addAll(Collections.singletonList(new FileChooser.ExtensionFilter("Config file", "*.config", "*.cfg", "*.list")));
configFile = fc.showOpenDialog(stage);
} else if (args.size() == 1) {
configFile = new File(args.get(0));
} else {
configFile = null;
}
if (configFile == null || !configFile.exists()) {
JfxUtils.dialog().cause("Illegal number of arguments or file doesn't exists.").show(stage);
Platform.exit();
return;
}
if (configFile.isFile() && configFile.getParentFile() != null) {
this.preferences.put(LAST_USED_DIR_KEY, configFile.getParentFile().getPath());
}
final List<String> configLines = Files.readAllLines(configFile.toPath());
final Predicate<String> ignoreComment = (S) -> !S.startsWith("#");
final Predicate<String> predVcf = S -> S.endsWith(".vcf") || S.endsWith(".vcf.gz");
if (configLines.stream().filter(ignoreComment).filter(predVcf).count() != 1) {
JfxUtils.dialog().cause("Found more than one vcf file in " + configFile).show(stage);
Platform.exit();
return;
}
final File vcfFile = configLines.stream().filter(ignoreComment).filter(predVcf).map(S -> new File(S)).findFirst().get();
LOG.info("Opening vcf file and loading in memory");
VCFFileReader vfr = null;
CloseableIterator<VariantContext> iter = null;
final Set<String> sampleNames;
try {
this.variants.clear();
vfr = new VCFFileReader(vcfFile, false);
this.vcfHeader = vfr.getFileHeader();
sampleNames = new HashSet<>(this.vcfHeader.getSampleNamesInOrder());
if (sampleNames.isEmpty()) {
JfxUtils.dialog().cause("No Genotypes in " + vcfFile).show(stage);
Platform.exit();
return;
}
iter = vfr.iterator();
this.variants.addAll(iter.stream().filter(ctxFilter).filter(CTX -> CTX.isVariant()).collect(Collectors.toList()));
} catch (final Exception err) {
JfxUtils.dialog().cause(err).show(stage);
Platform.exit();
return;
} finally {
CloserUtil.close(iter);
CloserUtil.close(vfr);
}
if (this.variants.isEmpty()) {
JfxUtils.dialog().cause("No Variants").show(stage);
Platform.exit();
return;
}
final SAMSequenceDictionary dict = this.vcfHeader.getSequenceDictionary();
if (dict == null || dict.isEmpty()) {
JfxUtils.dialog().cause(JvarkitException.VcfDictionaryMissing.getMessage(vcfFile.getPath())).show(stage);
Platform.exit();
return;
}
final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.LENIENT);
configLines.stream().filter(ignoreComment).filter(S -> S.endsWith(".bam")).map(S -> new File(S)).forEach(F -> {
final SamReader samIn = srf.open(F);
final SAMFileHeader header = samIn.getFileHeader();
CloserUtil.close(samIn);
String sample = null;
for (final SAMReadGroupRecord rg : header.getReadGroups()) {
String s = rg.getSample();
if (s == null)
continue;
if (sample == null) {
sample = s;
} else if (!sample.equals(s)) {
JfxUtils.dialog().cause("Two samples in " + F).show(stage);
Platform.exit();
return;
}
}
if (sample == null) {
JfxUtils.dialog().cause("No sample in " + F + ". Ignoring").show(stage);
return;
}
if (!sampleNames.contains(sample)) {
JfxUtils.dialog().cause("Not in VCF header " + sample + " / " + F + ". Ignoring").show(stage);
return;
}
this.sample2bamFile.put(sample, F);
});
if (this.sample2bamFile.isEmpty()) {
JfxUtils.dialog().cause("No valid bam file in " + configFile).show(stage);
return;
}
sampleNames.retainAll(this.sample2bamFile.keySet());
if (sampleNames.isEmpty()) {
JfxUtils.dialog().cause("No Sample associated to bam").show(stage);
return;
}
ObservableList<VariantAndGenotype> genotypes = FXCollections.observableArrayList(this.variants.stream().flatMap(CTX -> CTX.getGenotypes().stream().filter(G -> sampleNames.contains(G.getSampleName())).map(G -> new VariantAndGenotype(CTX, G))).collect(Collectors.toList()));
if (genotypes.isEmpty()) {
JfxUtils.dialog().cause("No Genotype to show").show(stage);
return;
}
Menu menu = new Menu("File");
MenuItem menuItem = new MenuItem("Save as...");
menuItem.setOnAction(AE -> {
saveVariantsAs(stage);
});
menu.getItems().add(menuItem);
menuItem = new MenuItem("Save");
menuItem.setOnAction(AE -> {
if (this.saveAsFile != null) {
saveVariants(stage, this.saveAsFile);
} else {
saveVariantsAs(stage);
}
});
menu.getItems().add(menuItem);
menu.getItems().add(new SeparatorMenuItem());
menuItem = new MenuItem("Quit");
menuItem.setOnAction(AE -> {
Platform.exit();
});
menu.getItems().add(menuItem);
MenuBar bar = new MenuBar(menu);
this.genotypeTable = new TableView<>(genotypes);
this.genotypeTable.getColumns().add(makeColumn("CHROM", G -> G.ctx.getContig()));
this.genotypeTable.getColumns().add(makeColumn("POS", G -> G.ctx.getStart()));
this.genotypeTable.getColumns().add(makeColumn("ID", G -> G.ctx.getID()));
this.genotypeTable.getColumns().add(makeColumn("REF", G -> G.ctx.getReference().getDisplayString()));
this.genotypeTable.getColumns().add(makeColumn("ALT", G -> G.ctx.getAlternateAlleles().stream().map(A -> A.getDisplayString()).collect(Collectors.joining(","))));
this.genotypeTable.getColumns().add(makeColumn("Sample", G -> G.g.getSampleName()));
this.genotypeTable.getColumns().add(makeColumn("Type", G -> G.g.getType().name()));
this.genotypeTable.getColumns().add(makeColumn("Alleles", G -> G.g.getAlleles().stream().map(A -> A.getDisplayString()).collect(Collectors.joining(","))));
TableColumn<VariantAndGenotype, String> reviewCol = new TableColumn<>("Review");
reviewCol.setCellValueFactory(C -> C.getValue().getReviewProperty());
reviewCol.setCellFactory(TextFieldTableCell.forTableColumn());
reviewCol.setOnEditCommit((E) -> {
int y = E.getTablePosition().getRow();
this.genotypeTable.getItems().get(y).setReview(E.getNewValue());
});
reviewCol.setEditable(true);
this.genotypeTable.getColumns().add(reviewCol);
this.genotypeTable.getSelectionModel().cellSelectionEnabledProperty().set(true);
this.genotypeTable.setEditable(true);
final ContextMenu cm = new ContextMenu();
MenuItem mi1 = new MenuItem("Menu 1");
cm.getItems().add(mi1);
MenuItem mi2 = new MenuItem("Menu 2");
cm.getItems().add(mi2);
this.genotypeTable.setOnMousePressed(event -> {
if (event.isPrimaryButtonDown() && (event.getClickCount() == 3 || event.isShiftDown())) {
moveIgvTo(stage, genotypeTable.getSelectionModel().getSelectedItem());
} else if (event.isSecondaryButtonDown()) {
cm.show(genotypeTable, event.getScreenX(), event.getScreenY());
}
});
final BorderPane pane2 = new BorderPane(this.genotypeTable);
pane2.setPadding(new Insets(10, 10, 10, 10));
VBox vbox1 = new VBox(bar, pane2);
final Scene scene = new Scene(vbox1, 500, 300);
stage.setScene(scene);
stage.show();
}
Aggregations