package com.illumina.basespace.igv.bam; import java.util.List; import java.util.UUID; import java.util.logging.Logger; import org.broad.igv.PreferenceManager; import org.broad.igv.data.CoverageDataSource; import org.broad.igv.feature.genome.Genome; import org.broad.igv.renderer.DataRange; import org.broad.igv.sam.AlignmentDataManager; import org.broad.igv.sam.AlignmentTrack; import org.broad.igv.sam.CoverageTrack; import org.broad.igv.sam.SpliceJunctionFinderTrack; import org.broad.igv.track.Track; import org.broad.igv.ui.util.MessageUtils; import com.illumina.basespace.ApiClient; import com.illumina.basespace.entity.File; import com.illumina.basespace.entity.FileCompact; import com.illumina.basespace.igv.BaseSpaceResourceLocator; import com.illumina.basespace.igv.BaseSpaceTrackLoader; import com.illumina.basespace.igv.BaseSpaceUtil; import com.illumina.basespace.igv.IBaseSpaceTrackLoader; import com.illumina.basespace.igv.IResourceLocatorFactory; import com.illumina.basespace.igv.bam.BAMLocatorFactory.BAMTrackLoader; public class BAMLocatorFactory implements IResourceLocatorFactory<BAMTrackLoader> { private static final Logger log = Logger.getLogger(BaseSpaceTrackLoader.class.getPackage().getName()); @Override public BAMTrackLoader newLocator(UUID clientId,ApiClient client,File check, List<FileCompact> filesInDirectory) { if (check.getName().toLowerCase().endsWith("bam")) { FileCompact fcBai = BaseSpaceUtil.findFile(check.getName() + ".bai", filesInDirectory); if (fcBai != null) { return new BAMTrackLoader(clientId, check, client.getFile(fcBai.getId()).get()); } } return null; } public class BAMTrackLoader extends BaseSpaceResourceLocator implements IBaseSpaceTrackLoader<BAMTrackLoader> { private File indexFile; public BAMTrackLoader(UUID clientId,File bamFile,File baiFile) { super(clientId,bamFile,".bam"); this.indexFile = baiFile; } public File getBaiFile() { return indexFile; } @Override public String getDescription() { return "BaseSpace BAM"; } @Override public boolean loadTrack(BAMTrackLoader locator, List<Track> newTracks, Genome genome) { try { String dsName = locator.getTrackName(); log.fine("Loading BAM Track " + dsName + " for genome " + genome.getDisplayName()); AlignmentDataManager dataManager = new BaseSpaceAlignmentDataManager(locator, genome); if (!dataManager.hasIndex()) { MessageUtils.showMessage("<html>Could not load index file for: " + locator.getPath() + "<br> An index file is required for SAM & BAM files."); return false; } AlignmentTrack alignmentTrack = new AlignmentTrack(locator, dataManager, genome); // parser.loadTrack(locator, alignmentTrack.setName(dsName); final String coverageTrackName = alignmentTrack.getName() + " Coverage"; final CoverageDataSource coverageDataSource = new BaseSpaceCoverageDataSource((BAMTrackLoader) locator, 0,coverageTrackName, genome); CoverageTrack covTrack = new CoverageTrack(locator,coverageTrackName, genome); covTrack.setDataSource(coverageDataSource); covTrack.setDataRange(new DataRange(0, 0,10)); covTrack.setAutoScale(true); covTrack.setVisible(PreferenceManager.getInstance().getAsBoolean(PreferenceManager.SAM_SHOW_COV_TRACK)); newTracks.add(covTrack); alignmentTrack.setCoverageTrack(covTrack); covTrack.setDataManager(dataManager); dataManager.setCoverageTrack(covTrack); boolean showSpliceJunctionTrack = PreferenceManager.getInstance().getAsBoolean( PreferenceManager.SAM_SHOW_JUNCTION_TRACK); if (showSpliceJunctionTrack) { SpliceJunctionFinderTrack spliceJunctionTrack = new SpliceJunctionFinderTrack(locator, alignmentTrack.getName() + " Junctions", dataManager); spliceJunctionTrack.setHeight(60); spliceJunctionTrack.setVisible(showSpliceJunctionTrack); newTracks.add(spliceJunctionTrack); alignmentTrack.setSpliceJunctionTrack(spliceJunctionTrack); } newTracks.add(alignmentTrack); } catch (Throwable t) { throw new RuntimeException("Error loading BAM", t); } return true; } } }