V 2.02.10ba for user testing

This commit is contained in:
Douglas Gillespie 2024-03-22 09:42:24 -07:00
parent ef1a6cf5ee
commit 52d8697844
26 changed files with 819 additions and 51 deletions

View File

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.pamguard</groupId>
<artifactId>Pamguard</artifactId>
<version>2.02.10ad</version>
<version>2.02.10ba</version>
<name>Pamguard Java12+</name>
<description>Pamguard for Java 12+, using Maven to control dependcies</description>
<url>www.pamguard.org</url>

View File

@ -0,0 +1,12 @@
package PamController;
/**
* Provides a set of functions that can check and repair data.
* @author dg50
*
*/
public interface DataIntegrityChecker {
public boolean checkDataStore();
}

View File

@ -29,4 +29,11 @@ public interface DataOutputStore extends OfflineDataStore {
*/
public boolean deleteDataFrom(long timeMillis);
/**
* Get a data integrity checker. This can be called at startup to see if there is a problem.
* @return
*/
public DataIntegrityChecker getInegrityChecker();
}

View File

@ -31,12 +31,12 @@ public class PamguardVersionInfo {
* Version number, major version.minorversion.sub-release.
* Note: can't go higher than sub-release 'f'
*/
static public final String version = "2.02.10ad";
static public final String version = "2.02.10ba";
/**
* Release date
*/
static public final String date = "13 March 2024";
static public final String date = "22 March 2024";
// /**
// * Release type - Beta or Core

View File

@ -1,6 +1,7 @@
package PamUtils.worker;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Window;
import javax.swing.BoxLayout;
@ -39,6 +40,18 @@ public class PamWorkDialog extends PamDialog {
getButtonPanel().setVisible(false);
setDialogComponent(mainPanel);
setResizable(true);
if (parentFrame != null) {
Dimension prefSize = this.getPreferredSize();
Point screenLoc = parentFrame.getLocationOnScreen();
int x = (parentFrame.getWidth()-prefSize.width)/2;
int y = (parentFrame.getHeight()-prefSize.height)/2;
if (screenLoc != null) {
x += screenLoc.x;
y += screenLoc.y;
}
setLocation(x, y);
}
}
public void update(PamWorkProgressMessage progressMsg) {

View File

@ -29,6 +29,7 @@ public class RWTethysDataProvider extends AutoTethysProvider {
Parameters parameters = detection.getParameters();
parameters.setScore((double) rweDataUnit.rweSound.soundType);
double snr = 20.*Math.log10(rweDataUnit.rweSound.signal/rweDataUnit.rweSound.noise);
snr = AutoTethysProvider.roundDecimalPlaces(snr, 1);
parameters.setSNRDB(snr);
return detection;

View File

@ -37,6 +37,7 @@ import dataMap.OfflineDataMap;
import dataMap.OfflineDataMapPoint;
import PamController.AWTScheduler;
import PamController.DataInputStore;
import PamController.DataIntegrityChecker;
import PamController.DataOutputStore;
import PamController.OfflineDataStore;
import PamController.PamControlledUnit;
@ -74,6 +75,7 @@ import annotation.binary.AnnotationBinaryData;
import annotation.handler.AnnotationHandler;
import backupmanager.BackupInformation;
import binaryFileStorage.backup.BinaryBackupStream;
import binaryFileStorage.checker.BinaryIntegrityChecker;
import binaryFileStorage.layoutFX.BinaryStoreGUIFX;
/**
@ -946,6 +948,8 @@ PamSettingsSource, DataOutputStore {
PamController.getInstance().notifyModelChanged(PamControllerInterface.CHANGED_OFFLINE_DATASTORE);
// System.out.println("BinaryDataMapMaker really done " + this);
dataMapMaker = null;
getInegrityChecker().checkDataStore();
}
@Override
@ -2593,5 +2597,9 @@ PamSettingsSource, DataOutputStore {
public String getDataLocation() {
return binaryStoreSettings.getStoreLocation();
}
@Override
public DataIntegrityChecker getInegrityChecker() {
return new BinaryIntegrityChecker(this);
}
}

View File

@ -0,0 +1,54 @@
package binaryFileStorage.checker;
import java.util.ArrayList;
import PamController.DataIntegrityChecker;
import PamController.PamController;
import PamView.dialog.warn.WarnOnce;
import PamguardMVC.PamDataBlock;
import binaryFileStorage.BinaryStore;
import dataMap.OfflineDataMap;
public class BinaryIntegrityChecker implements DataIntegrityChecker {
private BinaryStore binaryStore;
public BinaryIntegrityChecker(BinaryStore binaryStore) {
this.binaryStore = binaryStore;
}
public boolean checkDataStore() {
checkMapOverlaps();
return true;
}
private boolean checkMapOverlaps() {
boolean ok = true;
ArrayList<PamDataBlock> dataBlocks = binaryStore.getStreamingDataBlocks(false);
for (PamDataBlock aBlock : dataBlocks) {
ok &= checkMapOverlaps(aBlock);
}
return ok;
}
private boolean checkMapOverlaps(PamDataBlock aBlock) {
OfflineDataMap dataMap = aBlock.getOfflineDataMap(binaryStore);
if (dataMap == null) {
return true;
}
long overlaps = dataMap.checkOverlaps();
if (overlaps <= 0) {
return true;
}
String warn = String.format("<html>Binary data %s has overlapping data files, with a maximum overlap of %3.1fs<br>"
+ "This can occur when data have been reprocessed multiple times offline into "
+ "the same folders.<br>Since files sometimes get slightly different names, old files are"
+ "not always overwritten. <br>"
+ "You should determine which files are 'old' by looking at file creation dates and delete them.",
aBlock.getLongDataName(), (double) overlaps / 1000.);
WarnOnce.showNamedWarning("BINOVERLAPWARNING", PamController.getMainFrame(), "Data Integrity Warning", warn, WarnOnce.WARNING_MESSAGE);
return false;
}
}

View File

@ -844,4 +844,23 @@ abstract public class OfflineDataMap<TmapPoint extends OfflineDataMapPoint> {
obs.updateDataMap(this, mapPoint);
}
}
/**
* Check to see if any data maps overlap in time.
* @return largest overlap between maps. 0 or -ve means no overlap.
*/
public long checkOverlaps() {
long bigLap = Long.MIN_VALUE;
TmapPoint prevPoint = null;
for (TmapPoint mapPoint : mapPoints) {
if (prevPoint != null) {
long olap = prevPoint.getEndTime() - mapPoint.getStartTime();
// if (mapPoint.getStartTime() < prevPoint.getEndTime()) {
bigLap = Math.max(olap, bigLap);
// }
}
prevPoint = mapPoint;
}
return bigLap;
}
}

View File

@ -18,6 +18,7 @@ import generalDatabase.backup.DatabaseBackupStream;
import pamScrollSystem.ViewLoadObserver;
import pamViewFX.pamTask.PamTaskUpdate;
import PamController.AWTScheduler;
import PamController.DataIntegrityChecker;
import PamController.DataOutputStore;
import PamController.OfflineDataStore;
import PamController.PamConfiguration;
@ -524,5 +525,10 @@ public class DBControlUnit extends DBControl implements DataOutputStore {
}
return state;
}
@Override
public DataIntegrityChecker getInegrityChecker() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -32,6 +32,8 @@ import PamController.PamSettingManager;
import PamController.PamSettings;
import PamUtils.PamFileChooser;
import PamUtils.PamFileFilter;
import PamUtils.worker.PamWorkWrapper;
import PamUtils.worker.PamWorker;
import PamView.PamTabPanel;
import PamView.dialog.warn.WarnOnce;
import PamguardMVC.PamDataBlock;
@ -104,7 +106,9 @@ public class TethysControl extends PamControlledUnit implements PamSettings, Tet
serverCheckTimer = new Timer(10000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
checkServer();
ServerStatus serverState = checkServer();
// check less often when it's OK to generate less debug output.
serverCheckTimer.setDelay(serverState.ok ? 600000 : 5000);
}
});
serverCheckTimer.setInitialDelay(0);
@ -527,7 +531,32 @@ public class TethysControl extends PamControlledUnit implements PamSettings, Tet
}
}
private void countProjectDetections() {
// /**
// * Count project detections in a worker thread;
// */
// public void countProjectDetectionsT() {
// sendStateUpdate(new TethysState(StateType.EXPORTRDATA, Collection.Detections));
// PamWorker<String> worker = new PamWorker<String>(new PamWorkWrapper<String>() {
//
// @Override
// public String runBackgroundTask(PamWorker<String> pamWorker) {
// countProjectDetections();
// return null;
// }
//
// @Override
// public void taskFinished(String result) {
// sendStateUpdate(new TethysState(StateType.NEWPAMGUARDSELECTION, Collection.Detections));
//
// }
// }, getGuiFrame(), 0, "Updating detections counts");
// worker.start();
// }
/**
* Count project detections in the current thread.
*/
private synchronized void countProjectDetections() {
if (dataBlockSynchInfos == null) {
return;
}
@ -551,12 +580,6 @@ public class TethysControl extends PamControlledUnit implements PamSettings, Tet
i++;
}
// int[] counts = dbxmlQueries.countDataForProject(deplData.getProject(), dataPrefixes);
// if (counts != null) {
// for ( i = 0; i < counts.length; i++ ) {
// dataBlockSynchInfos.get(i).setDataCount(counts[i]);
// }
// }
}
/**
@ -690,11 +713,9 @@ public class TethysControl extends PamControlledUnit implements PamSettings, Tet
* @param dataBlock
*/
public void exportedDetections(PamDataBlock dataBlock) {
sendStateUpdate(new TethysState(StateType.EXPORTRDATA, Collection.Detections));
countProjectDetections();
sendStateUpdate(new TethysState(StateType.NEWPAMGUARDSELECTION, Collection.Detections));
// sendStateUpdate(new TethysState(StateType.NEWPAMGUARDSELECTION, Collection.Detections));
}
/**
* @return the calibrationHandler
*/

View File

@ -12,6 +12,7 @@ import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import PamUtils.PamCalendar;
import nilus.Helper;
public class TethysTimeFuncs {
@ -54,6 +55,18 @@ public class TethysTimeFuncs {
* @return
*/
public static XMLGregorianCalendar fromGregorianXML(String gregorianString) {
try {
XMLGregorianCalendar xmlCal = Helper.timestamp(gregorianString);
return xmlCal;
} catch (DatatypeConfigurationException e1) {
// TODO Auto-generated catch block
// e1.printStackTrace();
}
/**
* Above should work just fine. If it doesn't use my own code below...
*/
// typical string is 2018-10-20T00:00:00Z
if (gregorianString == null) {
return null;

View File

@ -23,6 +23,7 @@ import nilus.Deployment;
import tethys.TethysControl;
import tethys.swing.NewProjectDialog;
import tethys.swing.SelectProjectDialog;
import tethys.tooltips.TethysTips;
/**
* Panel for entering project information
@ -109,6 +110,12 @@ public class ProjectInformationPanel {
});
}
project.setToolTipText(TethysTips.findTip(Deployment.class, "Project"));
cruise.setToolTipText(TethysTips.findTip(Deployment.class, "Cruise"));
region.setToolTipText(TethysTips.findTip(Deployment.class, "Region"));
site.setToolTipText(TethysTips.findTip(Deployment.class, "Site"));
}
/**

View File

@ -6,11 +6,16 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Set;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import nilus.Detection;
import nilus.Detections;
import nilus.SpeciesIDType;
import tethys.TethysControl;
import tethys.TethysTimeFuncs;
@ -54,6 +59,8 @@ public class BinnedGranularityHandler extends GranularityHandler {
public void prepare(long timeMillis) {
// long binStart = DetectionsHandler.roundDownBinStart(timeMillis, binDurationMillis);
// startBin(binStart);
// startBin(timeMillis);
currentDetections.clear();
}
// private void startBin(long timeMillis) {
@ -169,4 +176,9 @@ public class BinnedGranularityHandler extends GranularityHandler {
return closeBins(timeMillis);
}
@Override
protected boolean autoEffortFix(Detections detections, Detection det) {
return contractDetection(detections, det);
}
}

View File

@ -3,6 +3,7 @@ package tethys.detection;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import nilus.Detection;
import nilus.Detections;
import tethys.TethysControl;
import tethys.output.StreamExportParams;
import tethys.output.TethysExportParams;
@ -37,4 +38,9 @@ public class CallGranularityHandler extends GranularityHandler {
return null;
}
@Override
protected boolean autoEffortFix(Detections detections, Detection det) {
return expandEffort(detections, det);
}
}

View File

@ -1,9 +1,13 @@
package tethys.detection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import javax.swing.SwingWorker;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.XMLGregorianCalendar;
import PamController.PamControlledUnit;
import PamController.PamController;
@ -11,6 +15,7 @@ import PamController.PamguardVersionInfo;
import PamModel.PamPluginInterface;
import PamUtils.PamCalendar;
import PamView.dialog.PamDialog;
import PamView.dialog.warn.WarnOnce;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import PamguardMVC.PamProcess;
@ -438,6 +443,7 @@ public class DetectionsHandler extends CollectionHandler {
}
dataBlock.loadViewerData(mapPoint.getStartTime(), mapPoint.getEndTime(), null);
ArrayList<PamDataUnit> dataCopy = dataBlock.getDataCopy(deployment.getAudioStart(), deployment.getAudioEnd(), true, dataSelector);
Collections.sort(dataCopy);
skipCount += dataBlock.getUnitsCount() - dataCopy.size();
DetectionGroup onEffort = currentDetections.getOnEffort();
for (PamDataUnit dataUnit : dataCopy) {
@ -470,7 +476,9 @@ public class DetectionsHandler extends CollectionHandler {
exportObserver.update(prog);
closeDetectionsDocument(currentDetections, mapPoint.getEndTime());
try {
dbxmlConnect.postAndLog(currentDetections);
if (checkDetectionsDocument(currentDetections, granularityHandler)) {
dbxmlConnect.postAndLog(currentDetections);
}
} catch (TethysException e) {
tethysControl.showException(e);
}
@ -502,7 +510,9 @@ public class DetectionsHandler extends CollectionHandler {
lastUnitTime, totalCount, exportCount, skipCount, DetectionExportProgress.STATE_WRITING);
closeDetectionsDocument(currentDetections, deployment.getAudioEnd());
try {
dbxmlConnect.postAndLog(currentDetections);
if (checkDetectionsDocument(currentDetections, granularityHandler)) {
dbxmlConnect.postAndLog(currentDetections);
}
} catch (TethysException e) {
tethysControl.showException(e);
}
@ -584,6 +594,50 @@ public class DetectionsHandler extends CollectionHandler {
private void closeDetectionsDocument(Detections detections, Long audioEnd) {
detections.getEffort().setEnd(TethysTimeFuncs.xmlGregCalFromMillis(audioEnd));
}
/**
* Run some checks on the Detections document prior to submission. <br>
* Currently, is is just a check that the detections are within the effort times.
* @param detections Detections document
* @return false if there is an outstanding problem.
*/
private boolean checkDetectionsDocument(Detections detections, GranularityHandler granularityHandler) {
XMLGregorianCalendar effStart = detections.getEffort().getStart();
XMLGregorianCalendar effEnd = detections.getEffort().getEnd();
DetectionGroup dets = detections.getOnEffort();
List<Detection> detList = dets.getDetection();
ListIterator<Detection> detIt = detList.listIterator();
while (detIt.hasNext()) {
Detection det = detIt.next();
XMLGregorianCalendar detS = det.getStart();
XMLGregorianCalendar detE = det.getEnd();
if (effStart.compare(detS) == DatatypeConstants.GREATER) {
if (granularityHandler.autoEffortFix(detections, det)) {
continue;
}
String str = String.format("<html>A Detection at %s starts before the document effort start at %s<br>"
+ "Do you want to adjust the effort start time or abort export ?</html>", detS, effStart);
int ans = WarnOnce.showNamedWarning("TETHYSDETNOTINEFFORT", tethysControl.getGuiFrame(), "Detection Document Warning", str, WarnOnce.OK_CANCEL_OPTION);
if (ans == WarnOnce.CANCEL_OPTION) {
return false;
}
detections.getEffort().setStart(detS);
}
if (effEnd.compare(detE) == DatatypeConstants.LESSER) {
if (granularityHandler.autoEffortFix(detections, det)) {
continue;
}
String str = String.format("<html>A Detection at %s-%s ends <br>after the document effort end at %s<br>"
+ "Do you want to adjust the effort end time or abort export ?</html>", detS, detE, effStart);
int ans = WarnOnce.showNamedWarning("TETHYSDETNOTINEFFORT", tethysControl.getGuiFrame(), "Detection Document Warning", str, WarnOnce.OK_CANCEL_OPTION);
if (ans == WarnOnce.CANCEL_OPTION) {
return false;
}
detections.getEffort().setEnd(detE);
}
}
return true;
}
/**
* Worker thread for exporting detections.

View File

@ -11,6 +11,7 @@ import java.util.Map.Entry;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import nilus.Detection;
import nilus.Detections;
import nilus.SpeciesIDType;
import tethys.TethysControl;
import tethys.TethysTimeFuncs;
@ -48,7 +49,7 @@ public class EncounterGranularityHandler extends GranularityHandler {
@Override
public void prepare(long timeMillis) {
currentDetections.clear();
}
@Override
@ -77,6 +78,7 @@ public class EncounterGranularityHandler extends GranularityHandler {
currentDetections.put(groupName, det);
}
else {
// add to current detection. Set new end time and increment count
det.setEnd(TethysTimeFuncs.xmlGregCalFromMillis(dataUnit.getEndTimeInMilliseconds()));
int count = det.getCount().intValue() + 1;
@ -122,34 +124,17 @@ public class EncounterGranularityHandler extends GranularityHandler {
}
}
// private Detection[] checkCurrentEncounters(long timeMilliseconds) {
// if (currentDetections == null || currentDetections.size() == 0) {
// return null;
// }
// int nGood = 0;
// Detection[] newDetections = new Detection[currentDetections.size()];
// Iterator<Detection> detIt = currentDetections.iterator();
// while (detIt.hasNext()) {
// Detection aDet = detIt.next();
// Long detEnd = TethysTimeFuncs.millisFromGregorianXML(aDet.getEnd());
// if (timeMilliseconds-detEnd > maxGapMillis) {
// detIt.remove();
// newDetections[nGood++] = aDet;
// }
// }
//
// if (nGood == 0) {
// return null;
// }
// else {
// return Arrays.copyOf(newDetections, nGood);
// }
// }
@Override
public Detection[] cleanup(long timeMillis) {
// get everything still on the go.
return checkCurrentEncounters(timeMillis + maxGapMillis);
return checkCurrentEncounters(timeMillis + maxGapMillis*10);
}
@Override
protected boolean autoEffortFix(Detections detections, Detection det) {
return expandEffort(detections, det);
}
}

View File

@ -1,8 +1,16 @@
package tethys.detection;
import java.util.List;
import java.util.ListIterator;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.XMLGregorianCalendar;
import PamguardMVC.PamDataBlock;
import PamguardMVC.PamDataUnit;
import nilus.Detection;
import nilus.DetectionGroup;
import nilus.Detections;
import nilus.GranularityEnumType;
import tethys.TethysControl;
import tethys.output.StreamExportParams;
@ -118,4 +126,93 @@ public abstract class GranularityHandler {
}
return null;
}
/**
* Automatically fix mismatches between effort and detections. This will be called if a
* detection or part of a detection is outside of the start and end defined by the effort. If it's a
* small difference, i.e. if the detection at least overlaps the effort then it can be automatically
* fixed by truncating the detection (for binned types) or by a small extension to the effort (for encounter
* and call types).
* @param detections nilus Detections object
* @param det a single detection
* @return true if it was fixed automatically. False otherwise.
*/
protected abstract boolean autoEffortFix(Detections detections, Detection det);
/**
* Check that the detection at least overlaps the effort period.
* @param detections nilus Detections object
* @param det a single detection
* @return true if the overlap
*/
protected boolean effortOverlap(Detections detections, Detection det) {
XMLGregorianCalendar effStart = detections.getEffort().getStart();
XMLGregorianCalendar effEnd = detections.getEffort().getEnd();
XMLGregorianCalendar detStart = det.getStart();
XMLGregorianCalendar detEnd = det.getEnd();
if (effStart.compare(detEnd) == DatatypeConstants.GREATER) {
return false;
}
if (effEnd.compare(detStart) == DatatypeConstants.LESSER) {
return false;
}
return true;
}
/**
* Fix effort / detection problem but contracting the start / end times of the detection
* @param detections nilus Detections object
* @param det a single detection
* @return true if fixed automatically
*/
protected boolean contractDetection(Detections detections, Detection det) {
if (effortOverlap(detections, det) == false) {
return false;
}
// at least some overlap, so fix it.
// going to fix it my shortening the detection, and leave the effort alone.
XMLGregorianCalendar effStart = detections.getEffort().getStart();
XMLGregorianCalendar effEnd = detections.getEffort().getEnd();
XMLGregorianCalendar detStart = det.getStart();
XMLGregorianCalendar detEnd = det.getEnd();
if (effStart.compare(detStart) == DatatypeConstants.GREATER) {
System.out.printf("Fix Detections change detection start from %s to %s\n", detStart, effStart);
det.setStart(effStart);
}
if (effEnd.compare(detEnd) == DatatypeConstants.LESSER) {
System.out.printf("Fix Detections change detection end from %s to %s\n", detEnd, effEnd);
det.setEnd(effEnd);
}
return true;
}
/**
* Fix effort / detection problem but expanding the start / end times of the effort
* @param detections nilus Detections object
* @param det a single detection
* @return true if fixed automatically
*/
protected boolean expandEffort(Detections detections, Detection det) {
if (effortOverlap(detections, det) == false) {
return false;
}
// at least some overlap, so fix it.
// going to fix it my shortening the detection, and leave the effort alone.
XMLGregorianCalendar effStart = detections.getEffort().getStart();
XMLGregorianCalendar effEnd = detections.getEffort().getEnd();
XMLGregorianCalendar detStart = det.getStart();
XMLGregorianCalendar detEnd = det.getEnd();
if (effStart.compare(detStart) == DatatypeConstants.GREATER) {
System.out.printf("Fix Detections change effort start from %s to %s\n", effStart, detStart);
detections.getEffort().setStart(detStart);
}
if (effEnd.compare(detEnd) == DatatypeConstants.LESSER) {
System.out.printf("Fix Detections change effort end from %s to %s\n", effEnd, detEnd);
detections.getEffort().setEnd(detEnd);
}
return true;
}
}

View File

@ -56,7 +56,7 @@ public class NilusChecker {
for (Field f : emptyFields) {
msg += String.format("<br>Field %s in object %s", f.getName(), f.getDeclaringClass().getName());
}
msg += "<br><br>It is likely that this document will fail to write to the Tethys database.</html>";
msg += "<br><br>It is possible that this document will fail to write to the Tethys database.</html>";
String tit = "Incomplete Tethys data";
WarnOnce.showWarning(owner, tit, msg, WarnOnce.WARNING_MESSAGE);
return false;

View File

@ -286,6 +286,7 @@ abstract public class AutoTethysProvider implements TethysDataProvider {
detParams.setMaxFreqHz(freqs[1]);
}
double ampli = dataUnit.getAmplitudeDB();
ampli = roundDecimalPlaces(ampli, 1);
detParams.setReceivedLevelDB(ampli);
// DataUnitBaseData basicData = dataUnit.getBasicData();
gotTonalContour(dataUnit, detParams);

View File

@ -5,6 +5,7 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
@ -131,7 +132,7 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa
dataBlockName.setText(dataBlock.getLongDataName());
}
// need to re-thread this to stop user panicing that nothing is happening.
PamWorker w = new PamWorker<String>(this, getTethysControl().getGuiFrame(), 0, "Searching database");
PamWorker w = new PamWorker<String>(this, getTethysControl().getGuiFrame(), 0, "Searching database for " + dataBlock.getDataName());
w.start();
}
@ -241,20 +242,50 @@ public class DatablockDetectionsPanel extends TethysGUIPanel implements StreamTa
if (ans != WarnOnce.OK_OPTION) {
return;
}
ArrayList<Detections> toDelete = new ArrayList();
for (int i = 0; i < rows.length; i++) {
int row = rows[i];
PDetections pDets = detectionsForRow(row);
if (pDets == null) {
continue;
}
try {
getTethysControl().getDbxmlConnect().deleteDocument(pDets.detections);
} catch (TethysException e) {
getTethysControl().showException(e);
}
toDelete.add(pDets.detections);
}
getTethysControl().exportedDetections(dataBlock);
selectDataBlock(dataBlock); // force table update.
DeleteDocs dd = new DeleteDocs(toDelete);
PamWorker<Integer> worker = new PamWorker(dd, getTethysControl().getGuiFrame(), 1, "Deleting Detections documents");
worker.start();
}
private class DeleteDocs implements PamWorkWrapper<Integer> {
private ArrayList<Detections> toDelete;
public DeleteDocs(ArrayList<Detections> toDelete) {
this.toDelete = toDelete;
}
@Override
public Integer runBackgroundTask(PamWorker<Integer> pamWorker) {
for (Detections dets : toDelete) {
try {
getTethysControl().getDbxmlConnect().deleteDocument(dets);
} catch (TethysException e) {
getTethysControl().showException(e);
}
}
return toDelete.size();
}
@Override
public void taskFinished(Integer result) {
getTethysControl().exportedDetections(dataBlock);
selectDataBlock(dataBlock); // force table update.
}
}
protected void deleteDocument(PDetections pDets) {

View File

@ -28,6 +28,9 @@ public class XMLStringView extends PamDialog {
getCancelButton().setVisible(false);
setModal(false);
getOkButton().setText("Close");
getOkButton().setToolTipText("Close window");
}
public static void showDialog(Window parent, String collection, String documentId, String xmlString) {
@ -38,7 +41,7 @@ public class XMLStringView extends PamDialog {
@Override
public boolean getParams() {
return false;
return true;
}
@Override

View File

@ -19,6 +19,7 @@ import metadata.PamguardMetaData;
import nilus.Deployment;
import nilus.DeploymentRecoveryDetails;
import tethys.TethysTimeFuncs;
import tethys.tooltips.TethysTips;
public class DeploymentPeriodPanel {
@ -68,6 +69,9 @@ public class DeploymentPeriodPanel {
enableControls();
}
});
deploymentStart.setToolTipText(TethysTips.findTip(DeploymentRecoveryDetails.class, "TimeStamp"));
deploymentEnd.setToolTipText(TethysTips.findTip(DeploymentRecoveryDetails.class, "TimeStamp"));
}
protected void enableControls() {

View File

@ -19,6 +19,7 @@ import PamView.PamGui;
import PamView.dialog.PamDialog;
import nilus.DescriptionType;
import tethys.niluswraps.WrappedDescriptionType;
import tethys.tooltips.TethysTips;
/**
* Panel containing the three test entry fields for nilus.DescriptionType
@ -73,6 +74,10 @@ public class DescriptionTypePanel {
addScrollablePanel(tObjectives, "Objectives");
addScrollablePanel(tAbstract, "Abstract");
addScrollablePanel(tMethod, "Method");
tObjectives.setToolTipText(TethysTips.Detections_Description_Objectives);
tAbstract.setToolTipText(TethysTips.Detections_Description_Abstract);
tMethod.setToolTipText(TethysTips.Detections_Description_Method);
}
private void addScrollablePanel(JTextArea textArea, String title) {

View File

@ -10,6 +10,7 @@ import javax.swing.border.TitledBorder;
import PamView.dialog.PamGridBagContraints;
import nilus.ContactInfo.Address;
import tethys.tooltips.TethysTips;
import nilus.ResponsibleParty;
/**
@ -56,6 +57,11 @@ public class ResponsiblePartyPanel {
c.gridx = 0;
c.gridy++;
name.setToolTipText("Person responsible for data");
organisation.setToolTipText("Responsible organization");
position.setToolTipText("Persons role in organization");
email.setToolTipText("email address or other contact details");
}
public JPanel getMainPanel() {

View File

@ -0,0 +1,403 @@
package tethys.tooltips;
import java.lang.reflect.Field;
import nilus.Deployment;
/**
* Class to make it easy to find tooltips for a given nilus class and field nams. The constatns
* could be used directly, or can be found using findTip(Class, String) using the class type
* and field name for any nilus object.
* Tips were generates from a set of csv files extracted from the xml schema using Matlab code, then formatted
* in Matlab and pasted into this class, so will need to rerun that process should the xml schemas be updated.
*
* @author dg50
*
*/
public class TethysTips {
// public static void main(String[] args) {
// Class cls = Deployment.Data.class;
// String field = "Audio";
// String foundTip = findTip(cls, field);
// System.out.println(foundTip);
// }
/**
* find the tooltip for a given class and field within that class.
* @param aClass
* @param field
* @return found tip or null
*/
public static String findTip(Class aClass, String fieldName) {
Package pack = aClass.getPackage();
String packName = pack.toString();
String clsName = aClass.getCanonicalName();
if (clsName.startsWith("nilus.") == false) {
return null;
}
clsName = clsName.substring(6);
clsName = clsName.replace('.', '_');
String varName = clsName + "_" + fieldName;
// now try to find that field in this class and get it's value.
Field field = null;
try {
field = TethysTips.class.getDeclaredField(varName);
} catch (NoSuchFieldException | SecurityException e) {
return null;
}
if (field == null) {
return null;
}
Object tip = null;
try {
tip = field.get(null);
} catch (IllegalArgumentException | IllegalAccessException e) {
return null;
}
if (tip == null) {
return null;
}
return tip.toString();
}
// Annotations taken from schemata_csv
public static final String Calibration_Id = "Identifier of instrument, preamplifier, or hydrophone. Corresponds to elements in Deployment: Deployment/Instrument/Id, Deployment/Sensors/Audio/HydrophoneId, Deployment/Sensors/Audio[i]/PreampId. As instruments may be calibrated multiple times, it is not an error for duplicate Id values to appear. It is recommended that the three different types of identifiers (instrument, hydrophone, preamp) be distinct, but the Type element may be used to distinguish them if they are not.";
public static final String Calibration_TimeStamp = "Date and time of calibration";
public static final String Calibration_Type = "hydrophone, preamplifier, or end-to-end Indicates type of calibration";
public static final String Calibration_Process = "Process used to calibrate instrument.";
public static final String Calibration_ResponsibleParty = "Who conducted/managed the calibration?";
public static final String Calibration_IntensityReference_uPa = "Reference intensity in µ Pascals for dB measurements. Commonly used: underwater acoustics: 1 terrestrial acoustics: 20";
public static final String Calibration_Sensitivity_dBV = "Optional measurement of transducer sensitivity at 1 kHz.";
public static final String Calibration_Sensitivity_V = "Optional measurement of Sensitivity_dBV on a linear scale, provided by many transducer manufacturers.";
public static final String Calibration_Sensitivity_dBFS = "Optional measurement for digital transducers. Digital transducers do not output voltage measurements. In this case, the 1 kHz sensitivity measurement is measured relative to peak output of the full-scale signal instead of RMS. It should be noted that for sinusoidal signals, the RMS sensitivity will be 3 dB lower (Lewis, 2012). Lewis, J. (2012). \"Understanding Microphone Sensitivity,\" Analog Dialogue 46(2). 14-16.";
public static final String Calibration_FrequencyResponse = "Lists of frequencies (Hz) and responses (dB). Lists must be of equal length.";
public static final String Calibration_MetadataInfo = "Information about who is responsible for this metadata record, when it was created, and how often it is updated.";
public static final String Calibration_Process_Method = "Text based description of algorithm or citation";
public static final String Calibration_Process_Software = "Name of software that implements the algorithm or supports human analysts. This might be the name of a plug-in or extension module that is part of a larger program or system.";
public static final String Calibration_Process_Version = "Software version identifier";
public static final String Calibration_Process_Parameters = "Structured tags to describe parameters used in algorithm execution.";
public static final String Calibration_Process_SupportSoftware = "Software required in addition to the algorithm itself, e.g. Matlab, Ishmael, PAMGUARD, Triton, etc.";
public static final String Calibration_Process_SupportSoftware_Version = "Software version identifier.";
public static final String Calibration_Process_SupportSoftware_Parameters = "Structured tags to describe parameters used in algorithm execution.";
public static final String Calibration_ResponsibleParty_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";
public static final String Calibration_QualityAssurance_Quality = "Measurement is: unverified, valid, invalid";
public static final String Calibration_QualityAssurance_AlternateCalibration = "Provide an alternative calibration Id that should be used (if available) when the Quality value is invalid.";
public static final String Calibration_MetadataInfo_Contact = "based on ISO 19115";
public static final String Calibration_MetadataInfo_Date = "Last update.";
public static final String Calibration_MetadataInfo_UpdateFrequency = "How often are these data updated? as-needed, unplanned, or yearly";
public static final String Calibration_MetadataInfo_Contact_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";
// Annotations taken from schemata_csv
public static final String Deployment_Id = "Character sequence that uniquely identifies this deployment.";
public static final String Deployment_Description = "Objectives, abstract and high-level methods.";
public static final String Deployment_Project = "Name of project associated with this deployment. Can be related to a geographic region, funding source, etc.";
public static final String Deployment_DeploymentId = "A number related to either the Nth deployment operation in a series of deployments or the Nth deployment at a specific site. This is different from Id which is a unqiue identifier for the deployment. If a vessel deployed 5 instruments, they might all have the same DeploymentId. While not enforced, it is expected that the combination of Project, DeploymentId, and (Site or Cruise) to be unique.";
public static final String Deployment_DeploymentAlias = "Alternative deployment description.";
public static final String Deployment_Site = "Name of a location where instruments are frequently deployed. Can be something as simple as a letter or a geographic name. Strongly recommended for long-term time series recorded at a specific point.";
public static final String Deployment_SiteAliases = "Alternative names for the deployment location";
public static final String Deployment_Cruise = "Name of deployment cruise.";
public static final String Deployment_Platform = "On what platform is the instrument deployed? (e.g. mooring, tag)";
public static final String Deployment_Region = "Name of geographic region.";
public static final String Deployment_Instrument = "Instrument type and identifier.";
public static final String Deployment_SamplingDetails = "Information about recordings on each channel. Sample rate, quantization bits, etc.";
public static final String Deployment_Data = "Data from instrument, a URI is provided when not present (typical for audio).";
public static final String Deployment_DeploymentDetails = "Instrument deployment location, time, etc.";
public static final String Deployment_RecoveryDetails = "Instrument recovery, location, time, etc.";
public static final String Deployment_Sensors = "Sensors on instrument.";
public static final String Deployment_MetadataInfo = "Party responsible for this record. Some applications may make this mandatory.";
public static final String Deployment_Description_Objectives = "What are the objectives of this effort? Examples: Beamform to increase SNR for detection. Detect every click of a rare species. Verify data quality.";
public static final String Deployment_Description_Abstract = "Overview of effort.";
public static final String Deployment_Description_Method = "High-level description of the method used.";
public static final String Deployment_Instrument_Type = "Instrument type, e.g. HARP, EAR, Popup, DMON, Rock Hopper, etc.";
public static final String Deployment_Instrument_InstrumentId = "Instrument identifier, e.g. serial number";
public static final String Deployment_Instrument_GeometryType = "Sensor attachment \"rigid\" - relative geometry is fixed, \"cabled\" - relative geometry may be expected to deform depending on movement, currents, etc.";
public static final String Deployment_SamplingDetails_Channel_ChannelNumber = "Channels and sensors are bound together from Start to End. While not enforced, we assume channels are numbered from 1 to N.";
public static final String Deployment_SamplingDetails_Channel_SensorNumber = "Audio sensor index within the Sensors element. This allows us to associate a channel with a physical hydrophone.";
public static final String Deployment_SamplingDetails_Channel_Sampling = "Sampling rate and quantization may change over time.";
public static final String Deployment_SamplingDetails_Channel_Gain = "Initial gain setting (assumed 0 if not populated) and any subsequent changes.";
public static final String Deployment_SamplingDetails_Channel_DutyCycle = "Duty cycle is represented by the recording duration and the interval from the start of one recording session to the next. A duration of 3 m and an interval of 5 m would represent a 60% duty cycle, 3 m on, 2 m off.";
public static final String Deployment_SamplingDetails_Channel_Sampling_Regimen = "Sampling regimen may change over time. Each entry shows the start of a sampling configuration.";
public static final String Deployment_SamplingDetails_Channel_Sampling_Regimen_SampleRate_kHz = "Number of samples per second in kHz, e.g. 192 is 192,000 samples/s";
public static final String Deployment_SamplingDetails_Channel_Sampling_Regimen_SampleBits = "Number of bits per sample.";
public static final String Deployment_SamplingDetails_Channel_Gain_Regimen_Gain_rel = "Only used if gain is not calibrated. Relative gain may be a number on a dial.";
public static final String Deployment_SamplingDetails_Channel_DutyCycle_Regimen = "Duty cycling regimen may change over time. Each entry shows the start of a duty cycle configuration. The abscence of entries indicates continuous sampling as would having equal values in RecordingDuration_m and RecordingInterval_m.";
public static final String Deployment_SamplingDetails_Channel_DutyCycle_Regimen_TimeStamp = "Indicates when the duty cycle becomes active. It remains active until the next Regimen entry.";
public static final String Deployment_SamplingDetails_Channel_DutyCycle_Regimen_RecordingDuration_s = "The amount of time in minutes during each recording interval when the data logger is recoring. Use the attribute Offset_s when the recording does not begin at the beginning of each recording interval.";
public static final String Deployment_SamplingDetails_Channel_DutyCycle_Regimen_RecordingInterval_s = "Time between consecutive recordings. If RecordingDuration_s is 1800 s and RecordingInterval_s is 3600 s, then we record for the 30 min of each hour.";
public static final String Deployment_QualityAssurance_Description = "Text based description of process.";
public static final String Deployment_QualityAssurance_ResponsibleParty = "based on ISO 19115";
public static final String Deployment_QualityAssurance_Quality = "If no quality assurance, create an entry of Category unverified spanning the acoustic record.";
public static final String Deployment_QualityAssurance_Description_Objectives = "What are the objectives of this effort? Examples: Beamform to increase SNR for detection. Detect every click of a rare species. Verify data quality.";
public static final String Deployment_QualityAssurance_Description_Abstract = "Overview of effort.";
public static final String Deployment_QualityAssurance_Description_Method = "High-level description of the method used.";
public static final String Deployment_QualityAssurance_ResponsibleParty_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";
public static final String Deployment_QualityAssurance_Quality_Category = "categories: unverified, good, compromised, unusable";
public static final String Deployment_QualityAssurance_Quality_FrequencyRange = "QA metric applies to what frequency range?";
public static final String Deployment_QualityAssurance_Quality_Comment = "Additional qualitative information";
public static final String Deployment_Data_Audio = "Information about audio data.";
public static final String Deployment_Data_Tracks = "A set of measurements about a ship/instrument's track line.";
public static final String Deployment_Data_Audio_URI = "Uniform Resource Indicator that points to audio content. Examples: digital object identifier, web address, or even a simple string describing the storage location.";
public static final String Deployment_Data_Audio_Processed = "Pointer to location of data that has been processed (e.g. checked for quality, decimated, etc.)";
public static final String Deployment_Data_Audio_Raw = "Pointer to raw data from the instrument.";
public static final String Deployment_Data_Tracks_Track = "A set of sorted (by time) points associated with one or more tracklines.";
public static final String Deployment_Data_Tracks_TrackEffort = "Not all measurements are associated with an instrument/ship's planned trackline (e.g. when in chase mode or transiting between tracklines). Specify times for track effort here if needed.";
public static final String Deployment_Data_Tracks_URI = "Pointer to trackline information.";
public static final String Deployment_Data_Tracks_Track_TrackId = "Optional trackline number. If unimportant, everything can be put in one Points element.";
public static final String Deployment_Data_Tracks_Track_Point = "Timestamped measurements: long/lat, bearing, etc. Points should be sorted by timestamp.";
public static final String Deployment_Data_Tracks_Track_Point_Bearing_DegN = "Bearing in degrees [0, 360) relative to true or magnetic north (as specified by north attribute, default magnetic)";
public static final String Deployment_Data_Tracks_Track_Point_Speed_kn = "Speed in knots";
public static final String Deployment_Data_Tracks_Track_Point_Pitch_deg = "Instrument pitch [0, 360) degrees";
public static final String Deployment_Data_Tracks_Track_Point_Roll_deg = "Instrument roll [0, 360) degrees";
public static final String Deployment_Data_Tracks_Track_Point_Elevation_m = "Instrument elevation (meters) relative to average sea level.";
public static final String Deployment_Data_Tracks_Track_Point_GroundElevation_m = "Ground or seabed elevation (meters) relative to average sea level.";
public static final String Deployment_Data_Tracks_Track_Point_Longitude = "Expressed in degrees East [0, 360)";
public static final String Deployment_Data_Tracks_Track_Point_Latitude = "Expressed in degrees North [-90, 90]";
public static final String Deployment_Data_Tracks_TrackEffort_OnPath_FocalArea = "This element is used to provide names that specify a focal area in which the study was conducted, such as a National Marine Sanctuary.";
public static final String Deployment_Data_Tracks_TrackEffort_OffPath_FocalArea = "This element is used to provide names that specify a focal area in which the study was conducted, such as a National Marine Sanctuary.";
public static final String Deployment_DeploymentDetails_Longitude = "Expressed in degrees East [0, 360)";
public static final String Deployment_DeploymentDetails_Latitude = "Expressed in degrees North [-90, 90]";
public static final String Deployment_DeploymentDetails_ElevationInstrument_m = "The elevation at which this instrument is positioned.";
public static final String Deployment_DeploymentDetails_DepthInstrument_m = "Not usually required. This field is designed to record depth with respect to the ground or seabed. Uses for this field include mines and alpine lakes.";
public static final String Deployment_DeploymentDetails_Elevation_m = "Elevation of ground/sea bed";
public static final String Deployment_DeploymentDetails_TimeStamp = "Time at which instrument was deployed/recovered. Lost instruments: set recovery time to deployment time.";
public static final String Deployment_DeploymentDetails_AudioTimeStamp = "Recording start or end - May differ from deployment time.";
public static final String Deployment_DeploymentDetails_ResponsibleParty = "based on ISO 19115";
public static final String Deployment_DeploymentDetails_ResponsibleParty_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";
public static final String Deployment_RecoveryDetails_Longitude = "Expressed in degrees East [0, 360)";
public static final String Deployment_RecoveryDetails_Latitude = "Expressed in degrees North [-90, 90]";
public static final String Deployment_RecoveryDetails_ElevationInstrument_m = "The elevation at which this instrument is positioned.";
public static final String Deployment_RecoveryDetails_DepthInstrument_m = "Not usually required. This field is designed to record depth with respect to the ground or seabed. Uses for this field include mines and alpine lakes.";
public static final String Deployment_RecoveryDetails_Elevation_m = "Elevation of ground/sea bed";
public static final String Deployment_RecoveryDetails_TimeStamp = "Time at which instrument was deployed/recovered. Lost instruments: set recovery time to deployment time.";
public static final String Deployment_RecoveryDetails_AudioTimeStamp = "Recording start or end - May differ from deployment time.";
public static final String Deployment_RecoveryDetails_ResponsibleParty = "based on ISO 19115";
public static final String Deployment_RecoveryDetails_ResponsibleParty_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";
public static final String Deployment_Sensors_Audio_Number = "Sensor index. May be used to associate the sensor with other parts of the schema. For example, for Audio sensors, the Channel/SensorNumber can be set to a specific Sensor/Audio/Number, permitting us to determine information about the a hydrophone assembly.";
public static final String Deployment_Sensors_Audio_SensorId = "A value that uniquely identifies this sensor, e.g. a serial number.";
public static final String Deployment_Sensors_Audio_Geometry = "Geometry relative to platform";
public static final String Deployment_Sensors_Audio_Name = "Optional sensor name";
public static final String Deployment_Sensors_Audio_Description = "Optional description of sensor.";
public static final String Deployment_Sensors_Audio_HydrophoneId = "Optional hydrophone identifier.";
public static final String Deployment_Sensors_Audio_PreampId = "Optional preamplifier identifier.";
public static final String Deployment_Sensors_Depth_Number = "Sensor index. May be used to associate the sensor with other parts of the schema. For example, for Audio sensors, the Channel/SensorNumber can be set to a specific Sensor/Audio/Number, permitting us to determine information about the a hydrophone assembly.";
public static final String Deployment_Sensors_Depth_SensorId = "A value that uniquely identifies this sensor, e.g. a serial number.";
public static final String Deployment_Sensors_Depth_Geometry = "Geometry relative to platform";
public static final String Deployment_Sensors_Depth_Name = "Optional sensor name";
public static final String Deployment_Sensors_Depth_Description = "Optional description of sensor.";
public static final String Deployment_Sensors_Sensor_Number = "Sensor index. May be used to associate the sensor with other parts of the schema. For example, for Audio sensors, the Channel/SensorNumber can be set to a specific Sensor/Audio/Number, permitting us to determine information about the a hydrophone assembly.";
public static final String Deployment_Sensors_Sensor_SensorId = "A value that uniquely identifies this sensor, e.g. a serial number.";
public static final String Deployment_Sensors_Sensor_Geometry = "Geometry relative to platform";
public static final String Deployment_Sensors_Sensor_Name = "Optional sensor name";
public static final String Deployment_Sensors_Sensor_Description = "Optional description of sensor.";
public static final String Deployment_Sensors_Sensor_Type = "Description of data gathered by this sensor, e.g., temperature";
public static final String Deployment_Sensors_Sensor_Properties = "List of property elements describing the sensor. These may be arbitrary. Example: Properties can have child Units with value °C. Children may be nested.";
public static final String Deployment_MetadataInfo_Contact = "based on ISO 19115";
public static final String Deployment_MetadataInfo_Date = "Last update.";
public static final String Deployment_MetadataInfo_UpdateFrequency = "How often are these data updated? as-needed, unplanned, or yearly";
public static final String Deployment_MetadataInfo_Contact_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";
// Annotations taken from schemata_csv
public static final String Detections_Id = "Identification string that is unique to all documents of this type (currently optional, will be required in the future)";
public static final String Detections_Description = "Objectives, abstract and high-level methods.";
public static final String Detections_DataSource = "Acoustic data identifier.";
public static final String Detections_Algorithm = "Detailed methods.";
public static final String Detections_QualityAssurance = "Description of quality assurance checks (if any).";
public static final String Detections_UserId = "User that submitted the document.";
public static final String Detections_Effort = "Span and scope of detection effort.";
public static final String Detections_OnEffort = "Collection of individual detections.";
public static final String Detections_OffEffort = "Collection of off-effort (ad-hoc) detections. Each detection has the same format as the OnEffort ones.";
public static final String Detections_MetadataInfo = "Party responsible for this record. Some applications may make this mandatory.";
public static final String Detections_Description_Objectives = "What are the objectives of this effort? Examples: Beamform to increase SNR for detection. Detect every click of a rare species. Verify data quality.";
public static final String Detections_Description_Abstract = "Overview of effort.";
public static final String Detections_Description_Method = "High-level description of the method used.";
public static final String Detections_DataSource_EnsembleId = "Serves as a foreign key into the ensembles collection and must match an Id element in an ensemble document. Ensembles are used to group instruments together for a common purpose (e.g. large aperture array).";
public static final String Detections_DataSource_DeploymentId = "Serves as a foreign key into the Deployments collection and must match an Id element in a deployment document.";
public static final String Detections_Algorithm_Method = "Text based description of algorithm or citation";
public static final String Detections_Algorithm_Software = "Name of software that implements the algorithm or supports human analysts. This might be the name of a plug-in or extension module that is part of a larger program or system.";
public static final String Detections_Algorithm_Version = "Software version identifier";
public static final String Detections_Algorithm_Parameters = "Structured tags to describe parameters used in algorithm execution.";
public static final String Detections_Algorithm_SupportSoftware = "Software required in addition to the algorithm itself, e.g. Matlab, Ishmael, PAMGUARD, Triton, etc.";
public static final String Detections_Algorithm_SupportSoftware_Version = "Software version identifier.";
public static final String Detections_Algorithm_SupportSoftware_Parameters = "Structured tags to describe parameters used in algorithm execution.";
public static final String Detections_QualityAssurance_Description = "Text based description of process.";
public static final String Detections_QualityAssurance_ResponsibleParty = "based on ISO 19115";
public static final String Detections_QualityAssurance_Description_Objectives = "What are the objectives of this effort? Examples: Beamform to increase SNR for detection. Detect every click of a rare species. Verify data quality.";
public static final String Detections_QualityAssurance_Description_Abstract = "Overview of effort.";
public static final String Detections_QualityAssurance_Description_Method = "High-level description of the method used.";
public static final String Detections_QualityAssurance_ResponsibleParty_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";
public static final String Detections_Effort_Start = "Timestamp indicating the start of systematic effort to find the species and phenomena listed in the Effort/Kind entries.";
public static final String Detections_Effort_End = "Timestamp indicating end of systematic effort.";
public static final String Detections_Effort_dBReferenceIntensity_uPa = "All dB measurements are made relative to this value in uPa. Typical values are 1 for underwater acoustics and 20 for terrestrial acoustics.";
public static final String Detections_Effort_AnalysisGaps_Aperiodic = "Used to describe meaningful gaps in the analysis effort. Problems with the data should not be addressed here, but rather in Deployment/QualityAssurance/Quality. Note that tools may not take Gaps into account when reporting effort statistics.";
public static final String Detections_Effort_AnalysisGaps_Periodic_Regimen = "Peridoic analysis regimen may change over time. Each entry shows the start of an analysis regimen. The abscence of entries indicates continuous analysis as would having equal values in AnalysisDuration_s and AnalysisInterval_s. The time offsets in these fields are with respect to actual time. Duty cycled data are not taken into account in their specification. As an example, if we analyzed the first 30 min of each hour and the deployment's recording duty cycle were 15 min of recording every 30 min, this analysis duration would only result in 15 min of analysis every hour.";
public static final String Detections_Effort_AnalysisGaps_Periodic_Regimen_TimeStamp = "Indicates when the regimen becomes active. It remains active until the next Regimen entry.";
public static final String Detections_Effort_AnalysisGaps_Periodic_Regimen_AnalysisDuration_s = "When analysis starts, the data are analyzed for this many seconds. Optional attribute Offset_s may be used to denote the number of seconds after the timestamp that analysis started. If Offset_s is not present, analysis starts at the Timestamp.";
public static final String Detections_Effort_AnalysisGaps_Periodic_Regimen_AnalysisInterval_s = "Time between consecutive effort. If AnalysisDuration_s is 1800 s and AnalysisInterval_s is 3600 s, then we perform analysis on the first 30 min of each hour starting at TimeStamp.";
public static final String Detections_Effort_AnalysisGaps_Aperiodic_Start = "Timestamp indicating the start of a gap in the systematic effort to find the species and phenomena listed in the Effort/Kind entries.";
public static final String Detections_Effort_AnalysisGaps_Aperiodic_End = "Timestamp indicating end of systematic effort gap.";
public static final String Detections_Effort_AnalysisGaps_Aperiodic_Reason = "Reason for gap in analysis.";
public static final String Detections_Effort_Kind_SpeciesId = "Integrated Taxonomic Information System species identifier http://www.itis.gov/ for positive numbers. Negative numbers are used for physical phenomena.";
public static final String Detections_Effort_Kind_Call = "Name that describes call.";
public static final String Detections_Effort_Kind_Granularity = "Type of detections: call - individual call, encounter - set of calls, binned - presence detected within period specified by bin size attribute in Effort. grouped A set of individual detections of any granularity that have been grouped together. Examples include situations such as song or other groupings (e.g. detections of the same animals picked up on multiple instruments). Grouped detections may specify the individual detections regardless of their granularity that are part of the group. This is different from granularities encounter and binned where one might expect multiple calls to occur, but the individual detections are not recorded.";
public static final String Detections_Effort_Kind_Parameters_Subtype = "subcategory of call";
public static final String Detections_Effort_Kind_Parameters_FrequencyMeasurements_Hz = "Specifies a list of frequencies at which measurements are made. Each detection for this Kind should have a list of FrequencyMeasurements where each item corresponds to a frequency in this list. Useful for studying ambient sound or soundscapes. Be sure to declare Effort/ReferenceIntensity_uPa.";
public static final String Detections_OnEffort_Detection_Input_file = "Optional name of audio file (or indirect representation) from which this detection was generated.";
public static final String Detections_OnEffort_Detection_Start = "Time at which event started. For many detectors, this may not the actual starting time of the event.";
public static final String Detections_OnEffort_Detection_End = "Optional end time of event.";
public static final String Detections_OnEffort_Detection_Count = "An optional count of the number of times a call occurred within a bin or across an encounter.";
public static final String Detections_OnEffort_Detection_Event = "Optional tag for identifying this event uniquely within the stream. For human analysts, it is typical to use the time at which the detection was made in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ). When present, the combination of the event and attributes that uniquely identify the set of detections (or document name) must be uniqe.";
public static final String Detections_OnEffort_Detection_UnitId = "Specifies ensemble unit (when using an ensemble source).";
public static final String Detections_OnEffort_Detection_SpeciesId = "Integrated Taxonomic Information System species identifier http://www.itis.gov/ for positive numbers. Negative numbers are used for physical phenomena.";
public static final String Detections_OnEffort_Detection_Call = "In most cases, the call field should be present. May be omitted if the goal is species detection only, or repeated for multiple types of calls when the granularity effort is not \"call\".";
public static final String Detections_OnEffort_Detection_Image = "Name of image file (spectrogram, etc.)";
public static final String Detections_OnEffort_Detection_Audio = "Name of audio file (short snippet)";
public static final String Detections_OnEffort_Detection_Parameters_Subtype = "subcategory of call";
public static final String Detections_OnEffort_Detection_Parameters_Score = "Measure from detector, e.g. likelihood ratio, projection, etc.";
public static final String Detections_OnEffort_Detection_Parameters_Confidence = "Measure of confidence in detection. Range: [0, 1]";
public static final String Detections_OnEffort_Detection_Parameters_QualityAssurance = "Detection is: unverified, valid, invalid";
public static final String Detections_OnEffort_Detection_Parameters_ReceivedLevel_dB = "dB relative to reference intensity defined in Effort/ReferenceIntenstiy_uPa";
public static final String Detections_OnEffort_Detection_Parameters_FrequencyMeasurements_dB = "List of received levels at various frequencies relative to the reference value defiend in Effort/ReferenceIntensity_uPa. The frequency measurements should be consistent for each species and call type and must correspond to a a list of frequencies defined in Effort/Kind/SubType.";
public static final String Detections_OnEffort_Detection_Parameters_Peaks_Hz = "Typically used for spectra of short echolocation bursts, notes the spectral peaks in a list sorted from low to high frequency.";
public static final String Detections_OnEffort_Detection_Parameters_Duration_s = "When the call granularity is binned or encounter, this may be used to describe the mean duration of calls during the bout. As an example, at SIO we use this to track the mean duration of binned anthropogenic sources such as explosions.";
public static final String Detections_OnEffort_Detection_Parameters_Sideband_Hz = "Signal sideband frequencies in a list sorted from low to high frequency.";
public static final String Detections_OnEffort_Detection_Parameters_EventRef = "Reference to other detections for hierarchical organization.";
public static final String Detections_OnEffort_Detection_Parameters_UserDefined = "Study specific parameters";
public static final String Detections_OnEffort_Detection_Parameters_Tonal_Offset_s = "List of offsets from start in seconds";
public static final String Detections_OnEffort_Detection_Parameters_Tonal_Hz = "Frequency measurement for each Offset_s (Hz). List must be of same length as Offset_s";
public static final String Detections_OnEffort_Detection_Parameters_Tonal_dB = "Optional intensity measurment (dB) for each Offset_s (dB). List must be of the same length as Offset_s";
public static final String Detections_OffEffort_Detection_Input_file = "Optional name of audio file (or indirect representation) from which this detection was generated.";
public static final String Detections_OffEffort_Detection_Start = "Time at which event started. For many detectors, this may not the actual starting time of the event.";
public static final String Detections_OffEffort_Detection_End = "Optional end time of event.";
public static final String Detections_OffEffort_Detection_Count = "An optional count of the number of times a call occurred within a bin or across an encounter.";
public static final String Detections_OffEffort_Detection_Event = "Optional tag for identifying this event uniquely within the stream. For human analysts, it is typical to use the time at which the detection was made in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ). When present, the combination of the event and attributes that uniquely identify the set of detections (or document name) must be uniqe.";
public static final String Detections_OffEffort_Detection_UnitId = "Specifies ensemble unit (when using an ensemble source).";
public static final String Detections_OffEffort_Detection_SpeciesId = "Integrated Taxonomic Information System species identifier http://www.itis.gov/ for positive numbers. Negative numbers are used for physical phenomena.";
public static final String Detections_OffEffort_Detection_Call = "In most cases, the call field should be present. May be omitted if the goal is species detection only, or repeated for multiple types of calls when the granularity effort is not \"call\".";
public static final String Detections_OffEffort_Detection_Image = "Name of image file (spectrogram, etc.)";
public static final String Detections_OffEffort_Detection_Audio = "Name of audio file (short snippet)";
public static final String Detections_OffEffort_Detection_Parameters_Subtype = "subcategory of call";
public static final String Detections_OffEffort_Detection_Parameters_Score = "Measure from detector, e.g. likelihood ratio, projection, etc.";
public static final String Detections_OffEffort_Detection_Parameters_Confidence = "Measure of confidence in detection. Range: [0, 1]";
public static final String Detections_OffEffort_Detection_Parameters_QualityAssurance = "Detection is: unverified, valid, invalid";
public static final String Detections_OffEffort_Detection_Parameters_ReceivedLevel_dB = "dB relative to reference intensity defined in Effort/ReferenceIntenstiy_uPa";
public static final String Detections_OffEffort_Detection_Parameters_FrequencyMeasurements_dB = "List of received levels at various frequencies relative to the reference value defiend in Effort/ReferenceIntensity_uPa. The frequency measurements should be consistent for each species and call type and must correspond to a a list of frequencies defined in Effort/Kind/SubType.";
public static final String Detections_OffEffort_Detection_Parameters_Peaks_Hz = "Typically used for spectra of short echolocation bursts, notes the spectral peaks in a list sorted from low to high frequency.";
public static final String Detections_OffEffort_Detection_Parameters_Duration_s = "When the call granularity is binned or encounter, this may be used to describe the mean duration of calls during the bout. As an example, at SIO we use this to track the mean duration of binned anthropogenic sources such as explosions.";
public static final String Detections_OffEffort_Detection_Parameters_Sideband_Hz = "Signal sideband frequencies in a list sorted from low to high frequency.";
public static final String Detections_OffEffort_Detection_Parameters_EventRef = "Reference to other detections for hierarchical organization.";
public static final String Detections_OffEffort_Detection_Parameters_UserDefined = "Study specific parameters";
public static final String Detections_OffEffort_Detection_Parameters_Tonal_Offset_s = "List of offsets from start in seconds";
public static final String Detections_OffEffort_Detection_Parameters_Tonal_Hz = "Frequency measurement for each Offset_s (Hz). List must be of same length as Offset_s";
public static final String Detections_OffEffort_Detection_Parameters_Tonal_dB = "Optional intensity measurment (dB) for each Offset_s (dB). List must be of the same length as Offset_s";
public static final String Detections_MetadataInfo_Contact = "based on ISO 19115";
public static final String Detections_MetadataInfo_Date = "Last update.";
public static final String Detections_MetadataInfo_UpdateFrequency = "How often are these data updated? as-needed, unplanned, or yearly";
public static final String Detections_MetadataInfo_Contact_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";
// Annotations taken from schemata_csv
public static final String Ensemble_Id = "Ensemble name (unique identifier).";
public static final String Ensemble_Unit = "Associates a virtual unit of an ensemble with an actual deployment.";
public static final String Ensemble_ZeroPosition = "Provides a zero point to which relative localizations can be referenced.";
public static final String Ensemble_Unit_UnitId = "A unique unit number that identifies this instrument within the ensemble.";
public static final String Ensemble_Unit_DeploymentId = "Reference to a deployment document Id field. Uniquely identifies the deployment.";
public static final String Ensemble_ZeroPosition_Longitude = "Expressed in degrees East [0, 360)";
public static final String Ensemble_ZeroPosition_Latitude = "Expressed in degrees North [-90, 90]";
// Annotations taken from schemata_csv
public static final String Localize_Id = "Identification string that is unique to all documents of this type";
public static final String Localize_Description = "Text based description of process.";
public static final String Localize_DataSource = "Indicates the deployment or ensemble from which the process (e.g. detector) derived information.";
public static final String Localize_Algorithm = "Description of an algorithm or process.";
public static final String Localize_QualityAssurance = "Description of quality assurance checks (if any).";
public static final String Localize_ResponsibleParty = "Person/organization responsible for generating metadata";
public static final String Localize_UserId = "User that submitted the document.";
public static final String Localize_IntermediateData = "Derived data that is used for the localizations that the user wishes to retain.";
public static final String Localize_MetadataInfo = "Party responsible for this record. Some applications may make this mandatory.";
public static final String Localize_Description_Objectives = "What are the objectives of this effort? Examples: Beamform to increase SNR for detection. Detect every click of a rare species. Verify data quality.";
public static final String Localize_Description_Abstract = "Overview of effort.";
public static final String Localize_Description_Method = "High-level description of the method used.";
public static final String Localize_DataSource_EnsembleId = "Serves as a foreign key into the ensembles collection and must match an Id element in an ensemble document. Ensembles are used to group instruments together for a common purpose (e.g. large aperture array).";
public static final String Localize_DataSource_DeploymentId = "Serves as a foreign key into the Deployments collection and must match an Id element in a deployment document.";
public static final String Localize_Algorithm_Method = "Text based description of algorithm or citation";
public static final String Localize_Algorithm_Software = "Name of software that implements the algorithm or supports human analysts. This might be the name of a plug-in or extension module that is part of a larger program or system.";
public static final String Localize_Algorithm_Version = "Software version identifier";
public static final String Localize_Algorithm_Parameters = "Structured tags to describe parameters used in algorithm execution.";
public static final String Localize_Algorithm_SupportSoftware = "Software required in addition to the algorithm itself, e.g. Matlab, Ishmael, PAMGUARD, Triton, etc.";
public static final String Localize_Algorithm_SupportSoftware_Version = "Software version identifier.";
public static final String Localize_Algorithm_SupportSoftware_Parameters = "Structured tags to describe parameters used in algorithm execution.";
public static final String Localize_QualityAssurance_Description = "Text based description of process.";
public static final String Localize_QualityAssurance_ResponsibleParty = "based on ISO 19115";
public static final String Localize_QualityAssurance_Description_Objectives = "What are the objectives of this effort? Examples: Beamform to increase SNR for detection. Detect every click of a rare species. Verify data quality.";
public static final String Localize_QualityAssurance_Description_Abstract = "Overview of effort.";
public static final String Localize_QualityAssurance_Description_Method = "High-level description of the method used.";
public static final String Localize_QualityAssurance_ResponsibleParty_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";
public static final String Localize_ResponsibleParty_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";
public static final String Localize_Effort_Start = "Time at which we started looking for location information.";
public static final String Localize_Effort_End = "Time at which we stopped looking for location information.";
public static final String Localize_Effort_CoordinateSystem = "What type of localization information is produced?";
public static final String Localize_Effort_LocalizationType = "Type of localization effort: Bearing, Ranging, Point, Track";
public static final String Localize_Effort_CoordinateSystem_Type = "How are positions represented? WGS84: global positioning system lat/long, cartesian: m relative to a point, UTM: universal trans Mercatur map-projection, Bearing: Polar measurements of angle and possibly distance.";
public static final String Localize_Effort_CoordinateSystem_Relative = "For bearings, this gives the direction vector for the zero bearing. Angles are measured counter-clockwise to this vector. For cartesian coordinates, this provides the zero point relative to the deployment position or the ReferencePoint of an ensemble.";
public static final String Localize_Effort_CoordinateSystem_UTM = "Parameters for Universal Trans Mercatur projections. NEED TO INVESTIGATE FURTHER AS TO WHETHER THIS OR ANY OTHER PROJECTION IS WORTH ADDING";
public static final String Localize_Effort_CoordinateSystem_Relative_Bearing = "Designed to be a subset of OpenGML DirectionVectorType: http://schemas.opengis.net/gml/3.1.1/base/direction.xsd Unlike the OpenGML, direction may not be specified as a vector, and the verticalAngle is optional.";
public static final String Localize_Effort_CoordinateSystem_Relative_Bearing_HorizontalAngle = "Angle between a reference vector in the horizontal plane [0, 360]";
public static final String Localize_Effort_CoordinateSystem_Relative_Bearing_VerticalAngle = "Angle between a reference vector in the vertical plane: [-90, 90]";
public static final String Localize_Effort_CoordinateSystem_UTM_Zone = "NS zone [1-60]. Each zone covers 80°S to 84°N in 6° width zones. Zone 1 180 is 180-186° E with increasing zone #s corresponding to 6° eastward increments.";
public static final String Localize_Effort_ReferencedDocuments_Document_Type = "What type of document is being referenced? Detections or Localizations";
public static final String Localize_Effort_ReferencedDocuments_Document_Id = "Unique identifier string for the document being referenced.";
public static final String Localize_Effort_ReferencedDocuments_Document_Index = "All localizations that wish to reference other detections or localizations from the referenced document should use this index value.";
public static final String Localize_IntermediateData_Correlations_Correlation_Primary = "Primary hydropphone";
public static final String Localize_IntermediateData_Correlations_Correlation_Secondary = "Secondary hydropphone";
public static final String Localize_IntermediateData_Correlations_Correlation_Correlations = "Correlation between detections on primary hydrophone and signals on secondary hydrophones. Each column j is the set of lags corresponding to the j'th detection on the primary hydrophone.";
public static final String Localize_Localizations_Localization_Event = "Optional tag typically in ISO datetime format YYYY-MM-DDTHH:MM:SSZ identifying this event uniquely within the stream. For human analysts, it is typical to use the time at which the detection was made. When present, the combination of the event and attributes that uniquely identify the set of detections (or document name) must be uniqe.";
public static final String Localize_Localizations_Localization_TimeStamp = "Time of localization in reference time frame (e.g. time of arrival at primary hydrophone)";
public static final String Localize_Localizations_Localization_SpeciesId = "Species can be identified by the detections from the detections that are referenced. As these references are not mandatory, the optional SpeciesID can be used to identify the species that produced the localized source.";
public static final String Localize_Localizations_Localization_QualityAssurance = "Detection is: unverified, valid, invalid";
public static final String Localize_Localizations_Localization_Bearing = "Direction towards acoustic source.";
public static final String Localize_Localizations_Localization_Ranging = "Range and direction towards acoustic source. Combine with bearing, rename angular Rename StdError to Error specify in methods/algorrithm";
public static final String Localize_Localizations_Localization_WGS84 = "Longitude, latitude and possibly elevation of surce.";
public static final String Localize_Localizations_Localization_Cartesian = "Relative distance to source from receiver zero point.";
public static final String Localize_Localizations_Localization_Track = "Series of associated positions and timestamps";
public static final String Localize_Localizations_Localization_References_TimeReferenceEnsembleUnit = "STILL NEEDED? Time references which unit of the ensemble (see TimeReferenceChannel) when ensembles are used.";
public static final String Localize_Localizations_Localization_References_TimeReferenceChannel = "STILL NEEDED? Events are detected at different times on different channels, making it necessary to provide the instrument and channel on which the timestamp references.";
public static final String Localize_Localizations_Localization_References_Reference = "Detections/localization used in constructing this localization.";
public static final String Localize_Localizations_Localization_References_Reference_Index = "Must match instance of Index in ReferencedDocuments. This permits identification of a specific document.";
public static final String Localize_Localizations_Localization_References_Reference_EventRef = "Event identifier that uniquely identifies a detection or localization within a referenced document.";
public static final String Localize_Localizations_Localization_Bearing_HorizontalAngle = "Angle between a reference vector in the horizontal plane [0, 360]";
public static final String Localize_Localizations_Localization_Bearing_VerticalAngle = "Angle between a reference vector in the vertical plane: [-90, 90]";
public static final String Localize_Localizations_Localization_Bearing_Ambiguous = "Left right horizontal ambiguity about the bearing reference vector exists?";
public static final String Localize_Localizations_Localization_Bearing_StdError = "Standard error in degrees for the measurement.";
public static final String Localize_Localizations_Localization_Bearing_StdError_HorizontalAngle = "Angle between a reference vector in the horizontal plane [0, 360]";
public static final String Localize_Localizations_Localization_Bearing_StdError_VerticalAngle = "Angle between a reference vector in the vertical plane: [-90, 90]";
public static final String Localize_Localizations_Localization_Ranging_HorizontalAngle = "Angle between a reference vector in the horizontal plane [0, 360]";
public static final String Localize_Localizations_Localization_Ranging_VerticalAngle = "Angle between a reference vector in the vertical plane: [-90, 90]";
public static final String Localize_Localizations_Localization_Ranging_Range_m = "Distance to localized animal/object/phenomenon in meters.";
public static final String Localize_Localizations_Localization_Ranging_Ambiguous = "Left right horizontal ambiguity about the bearing reference vector exists?";
public static final String Localize_Localizations_Localization_Ranging_StdError_HorizontalAngle = "Angle between a reference vector in the horizontal plane [0, 360]";
public static final String Localize_Localizations_Localization_Ranging_StdError_VerticalAngle = "Angle between a reference vector in the vertical plane: [-90, 90]";
public static final String Localize_Localizations_Localization_Ranging_StdError_Range_m = "Distance to localized animal/object/phenomenon in meters.";
public static final String Localize_Localizations_Localization_WGS84_Longitude = "Expressed in degrees East [0, 360)";
public static final String Localize_Localizations_Localization_WGS84_Latitude = "Expressed in degrees North [-90, 90]";
public static final String Localize_Localizations_Localization_WGS84_AlternatePosition = "Add LongLat3 and StdError Cartesian";
public static final String Localize_Localizations_Localization_WGS84_StdError_Longitude = "Expressed in degrees East [0, 360)";
public static final String Localize_Localizations_Localization_WGS84_StdError_Latitude = "Expressed in degrees North [-90, 90]";
public static final String Localize_Localizations_Localization_Cartesian_BearingIDs = "If multiple bearings were used to create this localization, their ids can be provided.";
public static final String Localize_Localizations_Localization_Cartesian_Longitude = "Expressed in degrees East [0, 360)";
public static final String Localize_Localizations_Localization_Cartesian_Latitude = "Expressed in degrees North [-90, 90]";
public static final String Localize_Localizations_Localization_Cartesian_BearingIDs_EventRef = "Reference to individual bearing within this XML document.";
public static final String Localize_Localizations_Localization_Track_WGS84 = "Series of points or list of values for each type long/lat/depth/elevation/timestamp parameters for each call: receivedLevel_dB sourceLevel_dB ambient_dB";
public static final String Localize_Localizations_Localization_Track_Cartesian = "Todo: define Cartesian list";
public static final String Localize_Localizations_Localization_Track_WGS84_Bounds = "Bounding box for tempo-spatial data from northwest to southeast quadrant. If elevation/depth information is available, separate depth boundaries are given as well. Note that longitudes are always degrees east. When a track crosses 0° east, the northwest longitude will be > than the souteast longitude (e.g. a 2° path from 359°E to 1°E)";
public static final String Localize_Localizations_Localization_Track_WGS84_Bounds_NorthWest_Longitude = "Longitude is expressed in degrees East [0,360)";
public static final String Localize_Localizations_Localization_Track_WGS84_Bounds_NorthWest_Latitude = "Expressed in degrees North [-90,90]";
public static final String Localize_Localizations_Localization_Track_WGS84_Bounds_SouthEast_Longitude = "Longitude is expressed in degrees East [0,360)";
public static final String Localize_Localizations_Localization_Track_WGS84_Bounds_SouthEast_Latitude = "Expressed in degrees North [-90,90]";
public static final String Localize_MetadataInfo_Contact = "based on ISO 19115";
public static final String Localize_MetadataInfo_Date = "Last update.";
public static final String Localize_MetadataInfo_UpdateFrequency = "How often are these data updated? as-needed, unplanned, or yearly";
public static final String Localize_MetadataInfo_Contact_contactInfo_onlineResource = "We do not fully conform to the onlineResources of ISO 19115";}