Skip to content
Snippets Groups Projects
Unverified Commit 6a4de281 authored by Ian Humphrey's avatar Ian Humphrey Committed by GitHub
Browse files

Merge pull request #526 from AgoinsUSGS/kaguya

Agoins Kaguya changes
parents fd937abf 43eae7c2
No related branches found
No related tags found
No related merge requests found
/**
* @file
*
* Unless noted otherwise, the portions of Isis written by the USGS are public
* domain. See individual third-party library and package descriptions for
* intellectual property information,user agreements, and related information.
*
* Although Isis has been used by the USGS, no warranty, expressed or implied,
* is made by the USGS as to the accuracy and functioning of such software
* and related material nor shall the fact of distribution constitute any such
* warranty, and no responsibility is assumed by the USGS in connection
* therewith.
*
* For additional information, launch
* $ISISROOT/doc//documents/Disclaimers/Disclaimers.html in a browser or see
* the Privacy & Disclaimers page on the Isis website,
* http://isis.astrogeology.usgs.gov, and the USGS privacy and disclaimers on
* http://www.usgs.gov/privacy.html.
*/
#include "KaguyaTcCamera.h"
#include "CameraDetectorMap.h"
#include "CameraDistortionMap.h"
#include "CameraFocalPlaneMap.h"
#include "CameraGroundMap.h"
#include "CameraSkyMap.h"
#include <QString>
#include "IException.h"
#include "IString.h"
#include "iTime.h"
#include "NaifStatus.h"
using namespace std;
namespace Isis {
/**
* Constructor for the Kaguya TC Camera Model
*
* @param lab Pvl Label to create the camera model from
*
* Data can be found in /work/projects/jaxa01
* To unpack this data:
* 1. mv or cp filename.sl2 to filename.tar
* 2. tar xvf filename.tar
* 3. mv or cp filename.igz to filename.img.gz
* 4. gzip -d filename.img.gz
* 5. filename.img are the files to be imported using kaguyatc2isis
*
* @internal
* @history 2018-10-02 Adam Goins & Jeannie Backer - Original Version
*/
KaguyaTcCamera::KaguyaTcCamera(Cube &cube) : LineScanCamera(cube) {
m_instrumentNameLong = "Terrain Camera";
m_instrumentNameShort = "TC";
m_spacecraftNameLong = "Kaguya";
m_spacecraftNameShort = "Kaguya";
QString msg = "Kaguya TC Camera is still under development.";
throw IException(IException::Programmer, msg, _FILEINFO_);
NaifStatus::CheckErrors();
// Get the camera characteristics
SetFocalLength();
SetPixelPitch();
// Get the start time in et
Pvl &lab = *cube.label();
PvlGroup inst = lab.findGroup("Instrument", Pvl::Traverse);
// set variables startTime and exposureDuration
double time = iTime((QString)inst["StartTime"]).Et();
// divide exposure duration keyword value by 1000 to convert to seconds
double exposureDuration = ((double) inst["ExposureDuration"]) / 1000.0;
pair<iTime, iTime> shuttertimes = ShutterOpenCloseTimes(time, exposureDuration);
// Add half exposure duration to get time at center of image
iTime centerTime = shuttertimes.first.Et() + exposureDuration / 2.0;
// Setup detector map
new CameraDetectorMap(this);
// Setup focal plane map
CameraFocalPlaneMap *focalMap = new CameraFocalPlaneMap(this, naifIkCode());
focalMap->SetDetectorOrigin(
Spice::getDouble("INS" + toString(naifIkCode()) +
"_BORESIGHT_SAMPLE"),
Spice::getDouble(0.5);
// Setup distortion map
new CameraDistortionMap(this);
// Setup the ground and sky map
new CameraGroundMap(this);
new CameraSkyMap(this);
setTime(centerTime);
LoadCache();
NaifStatus::CheckErrors();
}
/**
* @author 2018-10-02 Adam Goins & Jeannie Backer
* @internal
* @history 2018-10-02 Adam Goins & Jeannie Backer - Original version.
*/
pair<iTime, iTime> KaguyaTcCamera::ShutterOpenCloseTimes(double time,
double exposureDuration) {
return FramingCamera::ShutterOpenCloseTimes(time, exposureDuration);
}
/**
* CK frame ID - - Instrument Code from spacit run on CK
*
* @return @b int The appropriate instrument code for the "Camera-matrix"
* Kernel Frame ID
*/
int KaguyaTcCamera::CkFrameId() const {
return (-131000);
}
/**
* CK Reference ID - J2000
*
* @return @b int The appropriate instrument code for the "Camera-matrix"
* Kernel Reference ID
*/
int KaguyaTcCamera::CkReferenceId() const {
return (1);
}
/**
* SPK Reference ID - J2000
*
* @return @b int The appropriate instrument code for the Spacecraft
* Kernel Reference ID
*/
int KaguyaTcCamera::SpkReferenceId() const {
return (1);
}
}
/**
* This is the function that is called in order to instantiate a KaguyaCamera
* object.
*
* @param lab Cube labels
*
* @return Isis::Camera* Kaguya
*/
extern "C" Isis::Camera *KaguyaTcCameraPlugin(Isis::Cube &cube) {
return new Isis::KaguyaTcCamera(cube);
}
#ifndef KaguyaTcCamera_h
#define KaguyaTcCamera_h
/**
* @file
*
* Unless noted otherwise, the portions of Isis written by the USGS are public
* domain. See individual third-party library and package descriptions for
* intellectual property information,user agreements, and related information.
*
* Although Isis has been used by the USGS, no warranty, expressed or implied,
* is made by the USGS as to the accuracy and functioning of such software
* and related material nor shall the fact of distribution constitute any such
* warranty, and no responsibility is assumed by the USGS in connection
* therewith.
*
* For additional information, launch
* $ISISROOT/doc//documents/Disclaimers/Disclaimers.html in a browser or see
* the Privacy &amp; Disclaimers page on the Isis website,
* http://isis.astrogeology.usgs.gov, and the USGS privacy and disclaimers on
* http://www.usgs.gov/privacy.html.
*/
#include "FramingCamera.h"
namespace Isis {
class KaguyaTcCamera : public LineScanCamera {
public:
KaguyaTcCamera(Cube &cube);
//! Destroys the KaguyaTcCamera object.
~KaguyaTcCamera() {};
virtual std::pair <iTime, iTime> ShutterOpenCloseTimes(double time,
double exposureDuration);
virtual int CkFrameId() const;
virtual int CkReferenceId() const;
virtual int SpkReferenceId() const;
};
};
#endif
ifeq ($(ISISROOT), $(BLANK))
.SILENT:
error:
echo "Please set ISISROOT";
else
include $(ISISROOT)/make/isismake.objs
endif
\ No newline at end of file
/**
* @file
*
* Unless noted otherwise, the portions of Isis written by the USGS are public
* domain. See individual third-party library and package descriptions for
* intellectual property information,user agreements, and related information.
*
* Although Isis has been used by the USGS, no warranty, expressed or implied,
* is made by the USGS as to the accuracy and functioning of such software
* and related material nor shall the fact of distribution constitute any such
* warranty, and no responsibility is assumed by the USGS in connection
* therewith.
*
* For additional information, launch
* $ISISROOT/doc//documents/Disclaimers/Disclaimers.html in a browser or see
* the Privacy &amp; Disclaimers page on the Isis website,
* http://isis.astrogeology.usgs.gov, and the USGS privacy and disclaimers on
* http://www.usgs.gov/privacy.html.
*/
#include <QDebug>
#include <iomanip>
#include <iostream>
#include "Camera.h"
#include "CameraFactory.h"
#include "FileName.h"
#include "IException.h"
#include "iTime.h"
#include "Preference.h"
#include "Pvl.h"
#include "PvlGroup.h"
#include "KaguyaTcCamera.h"
using namespace std;
using namespace Isis;
void TestLineSamp(Camera *cam, double samp, double line);
/**
* Unit test for Kaguya Tc Camera.
*
* @internal
* @history 2018-08-15 Jeannie Backer - Updated lat/lon changes due to
* changes in focal length.
*/
int main(void) {
Preference::Preferences(true);
qDebug() << "Unit Test for KaguyaTcCamera...";
try {
// These should be lat/lon at center of image. To obtain these numbers for a new cube/camera,
// set both the known lat and known lon to zero and copy the unit test output
// "Latitude off by: " and "Longitude off by: " values directly into these variables.
double knownLat = 0; //
double knownLon = 0; //
Cube c("$tgo/testData/CAS-MCO-2016-11-22T16.38.39.354-NIR-02036-00.cub", "r");
KaguyaTcCamera *cam = (KaguyaTcCamera *) CameraFactory::Create(c);
qDebug() << "FileName: " << FileName(c.fileName()).name();
qDebug() << "CK Frame: " << cam->instrumentRotation()->Frame();
qDebug() << "";
// Test kernel IDs
qDebug() << "Kernel IDs: ";
qDebug() << "CK Frame ID = " << cam->CkFrameId();
qDebug() << "CK Reference ID = " << cam->CkReferenceId();
qDebug() << "SPK Target ID = " << cam->SpkTargetId();
qDebug() << "SPK Reference ID = " << cam->SpkReferenceId();
qDebug() << "";
// Test Shutter Open/Close
const PvlGroup &inst = c.label()->findGroup("Instrument", Pvl::Traverse);
double exposureDuration = toDouble( inst["ExposureDuration"][0] );
QString stime = inst["StartTime"];
double et;
str2et_c(stime.toLatin1().data(), &et);
pair <iTime, iTime> shuttertimes = cam->ShutterOpenCloseTimes(et, exposureDuration);
qDebug() << qSetRealNumberPrecision(18) << "Shutter open = " << shuttertimes.first.Et();
qDebug() << qSetRealNumberPrecision(18) << "Shutter close = " << shuttertimes.second.Et();
qDebug() << qSetRealNumberPrecision(18) << "Focal Length = " << cam->FocalLength();
qDebug() << "";
// Test all four corners to make sure the conversions are right
qDebug() << "For upper left corner ...";
TestLineSamp(cam, 1.0, 1.0);
qDebug() << "For upper right corner ...";
TestLineSamp(cam, cam->Samples(), 1.0);
qDebug() << "For lower left corner ...";
TestLineSamp(cam, 1.0, cam->Lines());
qDebug() << "For lower right corner ...";
TestLineSamp(cam, cam->Samples(), cam->Lines());
double samp = cam->Samples() / 2;
double line = cam->Lines() / 2;
qDebug() << "For center pixel position ...";
if(!cam->SetImage(samp, line)) {
qDebug() << "ERROR";
return 0;
}
if(abs(cam->UniversalLatitude() - knownLat) < 1E-13) {
qDebug() << "Latitude OK";
}
else {
qDebug() << qSetRealNumberPrecision(18)
<< "Latitude off by: " << cam->UniversalLatitude() - knownLat;
}
if(abs(cam->UniversalLongitude() - knownLon) < 1E-11) {
qDebug() << "Longitude OK";
}
else {
qDebug() << qSetRealNumberPrecision(18)
<< "Longitude off by: " << cam->UniversalLongitude() - knownLon;
}
}
catch(IException &e) {
e.print();
}
}
void TestLineSamp(Camera *cam, double samp, double line) {
bool success = cam->SetImage(samp, line);
if(success) {
success = cam->SetUniversalGround(cam->UniversalLatitude(), cam->UniversalLongitude());
}
if(success) {
double deltaSamp = samp - cam->Sample();
double deltaLine = line - cam->Line();
if(fabs(deltaSamp) < 1.1e-2) deltaSamp = 0.0;
if(fabs(deltaLine) < 1.0e-2) deltaLine = 0.0;
qDebug() << "DeltaSample = " << deltaSamp;
qDebug() << "DeltaLine = " << deltaLine;
qDebug() << "";
}
else {
qDebug() << "DeltaSample = ERROR";
qDebug() << "DeltaLine = ERROR";
qDebug() << "";
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment