package org.esa.beam.smos.ee2netcdf;
import com.bc.ceres.binio.CompoundData;
import com.bc.ceres.binio.SequenceData;
import org.esa.beam.dataio.netcdf.nc.NFileWriteable;
import org.esa.beam.dataio.netcdf.nc.NVariable;
import org.esa.beam.dataio.smos.L1cBrowseSmosFile;
import org.esa.beam.framework.datamodel.Product;
import org.esa.beam.smos.SmosUtils;
import org.esa.beam.smos.ee2netcdf.variable.VariableDescriptor;
import org.esa.beam.smos.ee2netcdf.variable.VariableWriter;
import org.esa.beam.smos.ee2netcdf.variable.VariableWriterFactory;
import java.io.IOException;
import java.util.Set;
class BrowseFormatExporter extends AbstractFormatExporter {
private int nBtData;
@Override
public void initialize(Product product, ExportParameter exportParameter) throws IOException {
super.initialize(product, exportParameter);
final String productName = product.getName();
nBtData = getBtDataDimension(productName);
}
@Override
public void addDimensions(NFileWriteable nFileWriteable) throws IOException {
nFileWriteable.addDimension("n_grid_points", gridPointCount);
nFileWriteable.addDimension("n_bt_data", nBtData);
}
@Override
public void writeData(NFileWriteable nFileWriteable) throws IOException {
final VariableWriter[] variableWriters = createVariableWriters(nFileWriteable);
final L1cBrowseSmosFile browseFile = (L1cBrowseSmosFile) explorerFile;
if (gpIndexList == null) {
for (int i = 0; i < gridPointCount; i++) {
writeGridPointAt(i, i, variableWriters, browseFile);
}
} else {
int writeIndex = 0;
for (int index : gpIndexList) {
writeGridPointAt(index, writeIndex, variableWriters, browseFile);
++writeIndex;
}
}
for (VariableWriter writer : variableWriters) {
writer.close();
}
}
private void writeGridPointAt(int readIndex, int writeIndex, VariableWriter[] variableWriters, L1cBrowseSmosFile browseFile) throws IOException {
final SequenceData btDataList = browseFile.getBtDataList(readIndex);
final CompoundData gridPointData = explorerFile.getGridPointData(readIndex);
for (VariableWriter writer : variableWriters) {
writer.write(gridPointData, btDataList, writeIndex);
}
}
// static access for testing only tb 2014-04-10
static int getBtDataDimension(String productName) {
final String productType = SmosUtils.getProductType(productName);
if ("MIR_BWLF1C".equalsIgnoreCase(productType) || "MIR_BWNF1C".equalsIgnoreCase(productType) || "MIR_BWSF1C".equalsIgnoreCase(productType)) {
return 4;
} else if ("MIR_BWLD1C".equalsIgnoreCase(productType) || "MIR_BWND1C".equalsIgnoreCase(productType) || "MIR_BWSD1C".equalsIgnoreCase(productType)) {
return 2;
} else {
throw new IllegalArgumentException("unsupported product: " + productName);
}
}
private VariableWriter[] createVariableWriters(NFileWriteable nFileWriteable) {
final Set<String> variableNameKeys = variableDescriptors.keySet();
final VariableWriter[] variableWriters = new VariableWriter[variableNameKeys.size()];
int index = 0;
for (final String ncVariableName : variableNameKeys) {
final NVariable nVariable = nFileWriteable.findVariable(ncVariableName);
final VariableDescriptor variableDescriptor = variableDescriptors.get(ncVariableName);
variableWriters[index] = VariableWriterFactory.create(nVariable, variableDescriptor, gridPointCount, nBtData);
index++;
}
return variableWriters;
}
}