All Downloads are FREE. Search and download functionalities are using the official Maven repository.

picard.illumina.parser.MultiTileBclFileUtil Maven / Gradle / Ivy

Go to download

A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) data and formats such as SAM/BAM/CRAM and VCF.

There is a newer version: 3.2.0
Show newest version
package picard.illumina.parser;

import htsjdk.samtools.util.IOUtil;
import picard.illumina.parser.fakers.MultiTileBclFileFaker;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * NextSeq-style bcl's have all tiles for a cycle in a single file.
 */
public class MultiTileBclFileUtil extends ParameterizedFileUtil {
    final File basecallLaneDir;
    final File bci;
    final TileIndex tileIndex;
    final CycleIlluminaFileMap cycleFileMap = new CycleIlluminaFileMap();

    MultiTileBclFileUtil(final File basecallLaneDir, final int lane) {
        // Since these file names do not contain lane number, first two args to ctor are the same.
        super("^(\\d{4}).bcl.bgzf$", ".bcl.bgzf", basecallLaneDir,
                new MultiTileBclFileFaker(), lane);
        this.basecallLaneDir = basecallLaneDir;
        bci = new File(basecallLaneDir, "s_" + lane + ".bci");
        // Do this once rather than when deciding if these files exist and again later.
        final File[] cycleFiles = IOUtil.getFilesMatchingRegexp(base, matchPattern);
        if (bci.exists()) {
            tileIndex = new TileIndex(bci);
            if (cycleFiles != null) {
                for (final File file : cycleFiles) {
                    final String fileName = file.getName();
                    final String cycleNum = fileName.substring(0, fileName.indexOf('.'));
                    final IlluminaFileMap fileMap = new IlluminaFileMap();
                    for(final Integer tile : tileIndex.getTiles()) {
                        fileMap.put(tile, file);
                    }
                    cycleFileMap.put(Integer.valueOf(cycleNum), fileMap);
                }
            }
        } else {
            tileIndex = null;
        }

    }

    public CycleIlluminaFileMap getFiles(final List tiles, final int[] cycles) {
        // Filter input list of cycles according to which actually exist
        final ArrayList goodCycleList = new ArrayList(cycles.length);
        for (final int cycle : cycles) {
            if (cycleFileMap.containsKey(cycle)) {
                goodCycleList.add(cycle);
            }
        }
        // Ensure cycles are sorted.
        Collections.sort(goodCycleList);
        final int[] goodCycles = new int[goodCycleList.size()];
        for (int i = 0; i < goodCycles.length; ++i) {
            goodCycles[i] = goodCycleList.get(i);
        }

        // Create the map.
        final CycleIlluminaFileMap cycledMap = new CycleIlluminaFileMap();
        if (goodCycles.length > 0) {
            for(final int cycle : goodCycles) {
                final IlluminaFileMap fileMap = cycleFileMap.get(cycle).keep(tiles);
                cycledMap.put(cycle, fileMap);
            }
        }
        return cycledMap;
    }

    @Override
    public boolean filesAvailable() {
        return bci.exists() && !cycleFileMap.isEmpty();
    }

    @Override
    public List getTiles() {
        if (tileIndex == null) {
            return Collections.emptyList();
        }
        return tileIndex.getTiles();
    }

    @Override
    public List verify(final List expectedTiles, final int[] expectedCycles) {
        if (tileIndex == null) {
            return Collections.singletonList("Tile index(" + bci.getAbsolutePath() + ") does not exist!");
        }
        final List ret = tileIndex.verify(expectedTiles);
        for (final int expectedCycle : expectedCycles) {
            if (!cycleFileMap.containsKey(expectedCycle)) {
                ret.add(expectedCycle + ".bcl.bgzf not found in " + base);
            }
        }
        return ret;
    }

    @Override
    public List fakeFiles(final List expectedTiles, final int[] expectedCycles,
                                  final IlluminaFileUtil.SupportedIlluminaFormat format) {
        if (tileIndex == null) {
            return Collections.singletonList("Tile index(" + bci.getAbsolutePath() + ") does not exist!");
        }
        final List ret = tileIndex.verify(expectedTiles);
        for (final int expectedCycle : expectedCycles) {
            if (!cycleFileMap.containsKey(expectedCycle)) {
                ret.add(expectedCycle + ".bcl.bgzf not found in " + base);
            }
        }
        return ret;
    }
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy