package com.isti.traceview.data.ims;
import gov.usgs.anss.cd11.CanadaException;
import gov.usgs.anss.cd11.ChannelSubframe;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
import com.isti.traceview.data.BufferedRandomAccessFile;
public class DAT2 extends Block {
private static final Logger logger = Logger.getLogger(DAT2.class);
private int[] data;
private WID2 wid2;
public DAT2(long startOffset, WID2 wid2) {
super(startOffset);
this.wid2 = wid2;
data = new int[wid2.getNumSamples()];
}
public int[] getData() {
return data;
}
public void read(BufferedRandomAccessFile input) throws IMSFormatException, IOException, ParseException, CanadaException {
header = input.readLine();
if (!header.startsWith("DAT2")) {
throw new IMSFormatException("Wrong data block header: " + header);
}
int numSamples = 0;
String line = "";
while (true) {
long filePointer = input.getFilePointer();
if (wid2.getCsf() == WID2.Compression.CSF) {
String l = input.readLine();
if (isBlockEnded(l)) {
numSamples = decodeCSF(numSamples, line);
input.seek(filePointer);
break;
}
line = line + l;
if (line.endsWith("=")) {
numSamples = decodeCSF(numSamples, line);
line = "";
}
} else if (wid2.getCsf() == WID2.Compression.INT) {
line = input.readLine();
// lg.debug(line);
if (isBlockEnded(line)) {
input.seek(filePointer);
break;
}
String[] lineParts = line.split("\\s+");
if (lineParts.length > 0) {
try {
for (String part : lineParts) {
if (part.length() > 0) {
data[numSamples] = Integer.parseInt(part.trim());
numSamples++;
}
}
} catch (NumberFormatException e) {
input.seek(filePointer);
logger.error("NumberFormatException:", e);
break;
}
}
} else {
throw new IMSFormatException("Unknown compression type");
}
}
if (numSamples != wid2.getNumSamples()) {
throw new IMSFormatException("Wrong samples count in data block: read " + numSamples + ", should be " + wid2.getNumSamples());
}
}
private int decodeCSF(int numSamples, String line) throws CanadaException {
List<ChannelSubframe> csfList = new ArrayList<ChannelSubframe>();
byte[] csfs = Base64.decodeBase64(line);
ByteBuffer bb = ByteBuffer.wrap(csfs);
while (bb.position() < bb.capacity()) {
csfList.add(new ChannelSubframe(bb));
}
for (ChannelSubframe csf : csfList) {
int[] samples = new int[csf.getNsamp()];
csf.getSamples(samples);
for(int i = 0; i<samples.length; i++){
data[numSamples+i]=samples[i];
}
numSamples += csf.getNsamp();
}
return numSamples;
}
}