package org.esa.beam.smos.ee2netcdf;
import com.bc.ceres.binio.CompoundData;
import org.esa.beam.dataio.netcdf.nc.NFileWriteable;
import org.esa.beam.dataio.netcdf.nc.NVariable;
import org.esa.beam.framework.datamodel.MetadataAttribute;
import org.esa.beam.framework.datamodel.MetadataElement;
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 L2FormatExporter extends AbstractFormatExporter {
@Override
public void initialize(Product product, ExportParameter exportParameter) throws IOException {
super.initialize(product, exportParameter);
applyChiSquareScalingIfNecessary(product);
}
@Override
public void addDimensions(NFileWriteable nFileWriteable) throws IOException {
nFileWriteable.addDimension("n_grid_points", gridPointCount);
}
@Override
public void writeData(NFileWriteable nFileWriteable) throws IOException {
final VariableWriter[] variableWriters = createVariableWriters(nFileWriteable);
if (gpIndexList == null) {
for (int i = 0; i < gridPointCount; i++) {
writeCompound(i, i, variableWriters);
}
} else {
int writeIndex = 0;
for (int index : gpIndexList) {
writeCompound(index, writeIndex, variableWriters);
++writeIndex;
}
}
for (VariableWriter writer : variableWriters) {
writer.close();
}
}
private void applyChiSquareScalingIfNecessary(Product product) {
final String productType = product.getProductType();
if (SmosUtils.isSmUserFormat(productType)) {
final MetadataElement specificProductHeader = ExporterUtils.getSpecificProductHeader(product);
if (specificProductHeader == null) return;
final MetadataAttribute chi2ScaleAttribute = specificProductHeader.getAttribute("Chi_2_Scale");
if (chi2ScaleAttribute == null) {
return;
}
final double scaleFactor = chi2ScaleAttribute.getData().getElemDouble();
if (scaleFactor != 1.0) {
ExporterUtils.correctScaleFactor(variableDescriptors, "Chi_2", scaleFactor);
}
}
}
private void writeCompound(int readIndex, int writeIndex, VariableWriter[] variableWriters) throws IOException {
final CompoundData gridPointData = explorerFile.getGridPointData(readIndex);
for (VariableWriter writer : variableWriters) {
writer.write(gridPointData, null, writeIndex);
}
}
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, -1);
index++;
}
return variableWriters;
}
}