Files
Terrasaur/src/main/java/terrasaur/altwg/pipeline/AltwgMLNNamer.java
2025-04-28 11:12:38 -04:00

213 lines
6.5 KiB
Java

/*
* The MIT License
* Copyright © 2025 Johns Hopkins University Applied Physics Laboratory
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package terrasaur.altwg.pipeline;
import terrasaur.enums.AltwgDataType;
import terrasaur.fits.FitsHdr.FitsHdrBuilder;
import terrasaur.fits.HeaderTag;
import terrasaur.utils.StringUtil;
public class AltwgMLNNamer implements ProductNamer {
public AltwgMLNNamer() {
super();
}
@Override
public String getNameFrag(String productName, int fieldNum) {
String nameFrag = "";
return nameFrag;
}
/**
* ALTWG MLN naming convention applies only to one productType - the ALTWG NFT-MLN.
*
* @param hdrBuilder - contains values that are used to create the MLN according to naming
* convention.
* @param altwgProduct - N/A. Included here as part of the interface structure.
* @param isGlobal - N/A. Included here as part of the interface structure.
*/
@Override
public String productbaseName(
FitsHdrBuilder hdrBuilder, AltwgDataType altwgProduct, boolean isGlobal) {
// initialize string fragments for NFT name. This will help identify
// which string fragments have not been updated by the method.
String gsd = "gsd";
String dataSrc = "dataSrc";
String dataSrcfile = "dataSrcFile";
String productType = "nftdtm";
String cLon = "cLon";
String cLat = "cLat";
String prodVer = "prodVer";
String productID = "prodID";
// find relevant information in the hdrBuilder map.
double gsdD = gsdFromHdr(hdrBuilder);
int gsdI = (int) Math.round(gsdD);
String fileUnits = "mm";
gsd = String.format("%05d", gsdI) + fileUnits;
// HeaderTag key = HeaderTag.GSD;
// if (hdrBuilder.containsKey(key)) {
// gsd = hdrBuilder.getCard(key).getValue();
//
// double gsdD = Double.parseDouble(gsd);
// String fileUnits = "";
// if (hdrBuilder.getCard(key).getComment().contains("[mm]")) {
// fileUnits = "mm";
// } else if (hdrBuilder.getCard(key).getComment().contains("[cm]")) {
//
// // mandated to use mm! change the units
// gsdD = gsdD * 10.0D;
// gsdI = (int) Math.round(gsdD);
// }
//
// System.out.println("gsd:" + gsd);
// System.out.println("file units:" + fileUnits);
//
// }
HeaderTag key = HeaderTag.DATASRC;
if (hdrBuilder.containsKey(key)) {
dataSrc = hdrBuilder.getCard(key).getValue().toLowerCase();
// data source should only be 3 chars long
if (dataSrc.length() > 3) {
dataSrc = dataSrc.substring(0, 3);
}
}
key = HeaderTag.CLON;
if (hdrBuilder.containsKey(key)) {
cLon = hdrBuilder.getCard(key).getValue();
}
key = HeaderTag.CLAT;
if (hdrBuilder.containsKey(key)) {
cLat = hdrBuilder.getCard(key).getValue();
}
key = HeaderTag.DATASRCF;
if (hdrBuilder.containsKey(key)) {
dataSrcfile = hdrBuilder.getCard(key).getValue();
}
key = HeaderTag.PRODVERS;
if (hdrBuilder.containsKey(key)) {
prodVer = hdrBuilder.getCard(key).getValue();
prodVer = prodVer.replaceAll("\\.", "");
}
// hardcode region to local
String region = "l";
StringBuilder sb = new StringBuilder();
String delim = "_";
sb.append(region);
sb.append(delim);
sb.append(gsd);
sb.append(delim);
sb.append(dataSrc);
sb.append(delim);
sb.append(productType);
sb.append(delim);
/*
* determine product ID. For OLA it is the center lat,lon For SPC it is the NFT feature id,
* which is assumed to be the first 5 chars in DATASRC
*/
if (dataSrc.contains("ola")) {
// follow ALTWG product naming convention for center lat, lon
productID = ALTWGProductNamer.clahLon(cLat, cLon);
} else {
productID = dataSrcfile.substring(0, 5);
}
sb.append(productID);
sb.append(delim);
sb.append("v");
sb.append(prodVer);
return sb.toString().toLowerCase();
}
@Override
public String getVersion(FitsHdrBuilder hdrBuilder) {
String version = "";
return version;
}
/**
* Extract ground sample distance from FitsHdrBuilder. GSD is needed as part of naming convention.
* GSD in units of mm.
*/
@Override
public double gsdFromHdr(FitsHdrBuilder hdrBuilder) {
// find relevant information in the hdrBuilder map.
double gsdD = Double.NaN;
HeaderTag key = HeaderTag.GSD;
if (hdrBuilder.containsKey(key)) {
String gsd = hdrBuilder.getCard(key).getValue();
gsdD = Double.parseDouble(gsd);
String fileUnits = "";
if (hdrBuilder.getCard(key).getComment().contains("[mm]")) {
fileUnits = "mm";
} else if (hdrBuilder.getCard(key).getComment().contains("[cm]")) {
// mandated to use mm! change the units
gsdD = gsdD * 10.0D;
fileUnits = "mm";
}
System.out.println("gsd:" + gsd);
System.out.println("file units:" + fileUnits);
} else {
String errMesg =
"ERROR! Could not find keyword:" + HeaderTag.GSD.toString() + " in hdrBuilder";
throw new RuntimeException(errMesg);
}
return gsdD;
}
@Override
public NameConvention getNameConvention() {
return NameConvention.ALTNFTMLN;
}
@Override
/** Parse the filename using the ALTWG MLN naming convention and return the GSD value. */
public double gsdFromFilename(String filename) {
String[] splitStr = filename.split("_");
// GSD is second element
String gsd = splitStr[1];
gsd = gsd.replace("mm", "");
return StringUtil.parseSafeD(gsd);
}
}