exitSystemWithError(e);
}
}
private void showIndexBins(File bamFile,String contigName) {
SAMFileReader reader;
BAMIndex index;
reader = new SAMFileReader(bamFile);
reader.setValidationStringency(ValidationStringency.SILENT);
reader.enableIndexCaching(true);
index = reader.getIndex();
reader.queryOverlapping(contigName,1,reader.getFileHeader().getSequence(contigName).getSequenceLength()).close();
int numBins = 0;
int numChunks = 0;
int numLinearIndexEntries = 0;
try {
Field[] fields = index.getClass().getDeclaredFields();
for(Field field: fields) {
if(field.getName().equals("mLastReferenceRetrieved")) {
field.setAccessible(true);
Integer lastReferenceRetrieved = (Integer)field.get(index);
System.out.printf("Last reference retrieved: %d%n", lastReferenceRetrieved);
}
if(field.getName().equals("mQueriesByReference")) {
field.setAccessible(true);
Map<Integer,Object> cachedQueries = (Map<Integer,Object>)field.get(index);
for(Object bamIndexContent: cachedQueries.values()) {
List<Object> bins = null;
Map<Object,Object> binToChunkMap = null;
Object linearIndex = null;
Field[] indexContentFields = bamIndexContent.getClass().getDeclaredFields();
for(Field indexContentField: indexContentFields) {
if(indexContentField.getName().equals("mReferenceSequence")) {
indexContentField.setAccessible(true);
System.out.printf("Reference sequence: %d%n", indexContentField.getInt(bamIndexContent));
}
if(indexContentField.getName().equals("mBins")) {
indexContentField.setAccessible(true);
bins = (List<Object>)indexContentField.get(bamIndexContent);
}
if(indexContentField.getName().equals("mBinToChunks")) {
indexContentField.setAccessible(true);
binToChunkMap = (Map<Object,Object>)indexContentField.get(bamIndexContent);
}
if(indexContentField.getName().equals("mLinearIndex")) {
indexContentField.setAccessible(true);
linearIndex = indexContentField.get(bamIndexContent);
}
}
numBins = bins.size();
for(Object bin: bins) {
int binNumber;
Field[] binFields = bin.getClass().getDeclaredFields();
for(Field binField: binFields) {
if(binField.getName().equals("binNumber")) {
binField.setAccessible(true);
binNumber = binField.getInt(bin);
List<Object> chunks = (List<Object>)binToChunkMap.get(bin);
System.out.printf("\tBin: %d, number of chunks: %d%n",binNumber,chunks.size());
for(Object chunk: chunks)
System.out.printf("\t\tChunk: %s%n",chunk);
numChunks += chunks.size();
}
}
}
Field[] linearIndexFields = linearIndex.getClass().getDeclaredFields();
for(Field linearIndexField: linearIndexFields) {
if(linearIndexField.getName().equals("mIndexEntries")) {
linearIndexField.setAccessible(true);
long[] linearIndexEntries = (long[])linearIndexField.get(linearIndex);
System.out.printf("\t\tIndex entries: %d", linearIndexEntries.length);
for(long indexEntry: linearIndexEntries)
System.out.printf("%d,",indexEntry);
System.out.printf("%n");
numLinearIndexEntries = linearIndexEntries.length;
}
}
}
}
}
}
catch(IllegalAccessException ex) {
throw new ReviewedGATKException("Unable to examine cached index",ex);
}
System.out.printf("%nOverall: %d bins, %d chunks, %d linear index entries",numBins,numChunks,numLinearIndexEntries);
if(Sizeof.isEnabled())
System.out.printf(", total index size in bytes: %d",Sizeof.getObjectGraphSize(index));
System.out.println();
reader.close();
}