6#include <QJsonDocument>
10#include <QMapIterator>
12#include <QSharedPointer>
18#include "CameraFactory.h"
19#include "ControlNet.h"
22#include "IException.h"
27#include "SerialNumberList.h"
28#include "SurfacePoint.h"
30using namespace boost::numeric::ublas;
39 m_numSimultaneousMeasures = 0;
40 m_numAsynchronousMeasures = 0;
61 QSharedPointer<LidarControlPoint>
point =
m_points.value(pointId, 0);
63 QString msg =
"Point " + pointId +
" is not in the lidar data.";
89 QList< QSharedPointer<LidarControlPoint> > pointlist =
points();
90 std::sort(pointlist.begin(), pointlist.end(),
113 return m_numSimultaneousMeasures;
122 return m_numAsynchronousMeasures;
132 return m_numSimultaneousMeasures + m_numAsynchronousMeasures;
151 QMapIterator< QString, Isis::Camera *> it(
p_cameraMap);
152 while (it.hasNext()) {
154 QString serialNumber = it.key();
165 QHashIterator< QString, QSharedPointer<LidarControlPoint> > p(
m_points);
166 while (p.hasNext()) {
171 for (
int m = 0; m < serialNums.size(); m++) {
178 IString msg =
"Lidar Control point [" + curPoint->GetId() +
179 "], measure [" + curMeasure->GetCubeSerialNumber() +
180 "] does not have a cube in the ISIS control net with a matching serial number";
184 curMeasure->SetCamera(cam);
187 if (!curMeasure->IsIgnored()) {
216 if (progress != NULL) {
217 progress->
SetText(
"Setting input images...");
222 for (
int i = 0; i < list.
size(); i++) {
224 QString filename = list.
fileName(i);
225 Cube cube(filename,
"r");
235 QString msg =
"Unable to create camera for cube file ";
240 if (progress != NULL)
245 QHashIterator< QString, QSharedPointer<LidarControlPoint> > p(
m_points);
246 while (p.hasNext()) {
251 for (
int m = 0; m < serialNums.size(); m++) {
262 IString msg =
"Control point [" + curPoint->GetId() +
263 "], measure [" + curMeasure->GetCubeSerialNumber() +
264 "] does not have a cube with a matching serial number";
283 QFile loadFile(lidarDataFile.expanded());
285 if (!loadFile.open(QIODevice::ReadOnly)) {
286 QString msg(
"Could not open " + loadFile.fileName());
291 QByteArray saveData = loadFile.readAll();
293 QJsonDocument loadDoc(QJsonDocument::fromJson(saveData));
294 if (loadDoc.isNull()) {
295 loadDoc = QJsonDocument::fromBinaryData(saveData);
298 int totalMeasures = 0;
301 QJsonObject lidarDataObject = loadDoc.object();
302 if (lidarDataObject.contains(
"points") && lidarDataObject[
"points"].isArray()) {
304 QJsonArray pointArray = lidarDataObject[
"points"].toArray();
305 for (
int pointIndex = 0; pointIndex < pointArray.size(); pointIndex++) {
307 QJsonObject pointObject = pointArray[pointIndex].toObject();
310 if (pointObject.contains(
"id") && pointObject[
"id"].isString()) {
311 id = pointObject[
"id"].toString();
315 if (pointObject.contains(
"range") && pointObject[
"range"].isDouble()) {
316 range = pointObject[
"range"].toDouble();
319 double sigmaRange = 0.0;
320 if (pointObject.contains(
"sigmaRange") && pointObject[
"sigmaRange"].isDouble()) {
321 sigmaRange = pointObject[
"sigmaRange"].toDouble();
325 if (pointObject.contains(
"time") && pointObject[
"time"].isDouble()) {
326 time = pointObject[
"time"].toDouble();
329 double latitude = 0.0;
330 if (pointObject.contains(
"latitude") && pointObject[
"latitude"].isDouble()) {
331 latitude = pointObject[
"latitude"].toDouble();
334 double longitude = 0.0;
335 if (pointObject.contains(
"longitude") && pointObject[
"longitude"].isDouble()) {
336 longitude = pointObject[
"longitude"].toDouble();
340 if (pointObject.contains(
"radius") && pointObject[
"radius"].isDouble()) {
341 radius = pointObject[
"radius"].toDouble();
344 QSharedPointer<LidarControlPoint> lcp =
347 lcp->setTime(
iTime(time));
348 lcp->setRange(range);
349 lcp->setSigmaRange(sigmaRange);
351 if (pointObject.contains(
"aprioriMatrix") &&
352 pointObject[
"aprioriMatrix"].isArray()) {
353 QJsonArray aprioriMatrixArray = pointObject[
"aprioriMatrix"].toArray();
354 boost::numeric::ublas::symmetric_matrix<double, upper> aprioriMatrix(3);
355 aprioriMatrix.clear();
356 aprioriMatrix(0, 0) = aprioriMatrixArray[0].toDouble();
357 aprioriMatrix(0, 1) = aprioriMatrix(1, 0) = aprioriMatrixArray[1].toDouble();
358 aprioriMatrix(0, 2) = aprioriMatrix(2, 0) = aprioriMatrixArray[2].toDouble();
359 aprioriMatrix(1, 1) = aprioriMatrixArray[3].toDouble();
360 aprioriMatrix(1, 2) = aprioriMatrix(2, 1) = aprioriMatrixArray[4].toDouble();
361 aprioriMatrix(2, 2) = aprioriMatrixArray[5].toDouble();
376 if (pointObject.contains(
"adjustedLatitude") &&
377 pointObject[
"adjustedLatitude"].isDouble() &&
378 pointObject.contains(
"adjustedLongitude") &&
379 pointObject[
"adjustedLongitude"].isDouble() &&
380 pointObject.contains(
"adjustedRadius") &&
381 pointObject[
"adjustedRadius"].isDouble()) {
383 double adjustedLatitude = 0.0;
384 adjustedLatitude = pointObject[
"adjustedLatitude"].toDouble();
386 double adjustedLongitude = 0.0;
387 adjustedLongitude = pointObject[
"adjustedLongitude"].toDouble();
389 double adjustedRadius = 0.0;
390 adjustedRadius = pointObject[
"radius"].toDouble();
392 if (pointObject.contains(
"adjustedMatrix") &&
393 pointObject[
"adjustedMatrix"].isArray()) {
394 QJsonArray adjustedMatrixArray = pointObject[
"adjustedMatrix"].toArray();
395 boost::numeric::ublas::symmetric_matrix<double, upper> adjustedMatrix(3);
396 adjustedMatrix.clear();
397 adjustedMatrix(0, 0) = adjustedMatrixArray[0].toDouble();
398 adjustedMatrix(0, 1) = adjustedMatrix(1, 0) = adjustedMatrixArray[1].toDouble();
399 adjustedMatrix(0, 2) = adjustedMatrix(2, 0) = adjustedMatrixArray[2].toDouble();
400 adjustedMatrix(1, 1) = adjustedMatrixArray[3].toDouble();
401 adjustedMatrix(1, 2) = adjustedMatrix(2, 1) = adjustedMatrixArray[4].toDouble();
402 adjustedMatrix(2, 2) = adjustedMatrixArray[5].toDouble();
417 if (pointObject.contains(
"simultaneousImages") &&
418 pointObject[
"simultaneousImages"].isArray()) {
419 QJsonArray simultaneousArray =
420 pointObject[
"simultaneousImages"].toArray();
422 for (
int simIndex = 0; simIndex < simultaneousArray.size(); simIndex ++) {
425 newSerial = simultaneousArray[simIndex].toString();
426 lcp->addSimultaneous(newSerial);
427 m_numSimultaneousMeasures++;
432 if (pointObject.contains(
"measures") && pointObject[
"measures"].isArray()) {
433 QJsonArray measureArray = pointObject[
"measures"].toArray();
434 for (
int measureIndex = 0; measureIndex < measureArray.size(); measureIndex++) {
436 QJsonObject measureObject = measureArray[measureIndex].toObject();
439 if (measureObject.contains(
"line") && measureObject[
"line"].toDouble()) {
440 line = measureObject[
"line"].toDouble();
444 if (measureObject.contains(
"sample") && measureObject[
"sample"].toDouble()) {
445 sample = measureObject[
"sample"].toDouble();
448 QString serialNumber;
449 if (measureObject.contains(
"serialNumber") && measureObject[
"serialNumber"].isString()) {
450 serialNumber = measureObject[
"serialNumber"].toString();
463 measure->SetCoordinate(sample, line);
464 measure->SetCubeSerialNumber(serialNumber);
474 m_numAsynchronousMeasures = totalMeasures - m_numSimultaneousMeasures;
493 if (format ==
Json) {
494 outputFile = outputFile.setExtension(
"json");
496 else if (format ==
Test) {
499 outputFile = outputFile.setExtension(
"json");
503 outputFile = outputFile.setExtension(
"dat");
505 QFile saveFile(outputFile.expanded());
507 if (!saveFile.open(QIODevice::WriteOnly)) {
508 QString msg(
"Could not open " + saveFile.fileName());
513 QJsonObject lidarDataObject;
514 QJsonArray pointArray;
516 foreach (QSharedPointer<LidarControlPoint> lcp,
points(sort)) {
518 QJsonObject pointObject;
519 pointObject[
"id"] = lcp->GetId();
520 pointObject[
"range"] = lcp->range();
521 pointObject[
"sigmaRange"] = lcp->sigmaRange();
522 pointObject[
"time"] = lcp->time().Et();
525 SurfacePoint aprioriSurfacePoint = lcp->GetAprioriSurfacePoint();
526 if (aprioriSurfacePoint.Valid()) {
532 symmetric_matrix<double, upper> aprioriMatrix = aprioriSurfacePoint.GetSphericalMatrix();
533 QJsonArray aprioriMatrixArray;
534 aprioriMatrixArray += aprioriMatrix(0, 0);
535 aprioriMatrixArray += aprioriMatrix(0, 1);
536 aprioriMatrixArray += aprioriMatrix(0, 2);
537 aprioriMatrixArray += aprioriMatrix(1, 1);
538 aprioriMatrixArray += aprioriMatrix(1, 2);
539 aprioriMatrixArray += aprioriMatrix(2, 2);
542 if ( aprioriMatrix(0, 0) != 0.0
543 || aprioriMatrix(0, 1) != 0.0
544 || aprioriMatrix(0, 2) != 0.0
545 || aprioriMatrix(1, 1) != 0.0
546 || aprioriMatrix(1, 2) != 0.0
547 || aprioriMatrix(2, 2) != 0.0 ) {
548 pointObject[
"aprioriMatrix"] = aprioriMatrixArray;
553 SurfacePoint adjustedSurfacePoint = lcp->GetAdjustedSurfacePoint();
554 if (adjustedSurfacePoint.Valid()) {
555 pointObject[
"adjustedLatitude"] =
557 pointObject[
"adjustedLongitude"] =
562 symmetric_matrix<double, upper> adjustedMatrix = adjustedSurfacePoint.GetSphericalMatrix();
563 QJsonArray adjustedMatrixArray;
564 adjustedMatrixArray += adjustedMatrix(0, 0);
565 adjustedMatrixArray += adjustedMatrix(0, 1);
566 adjustedMatrixArray += adjustedMatrix(0, 2);
567 adjustedMatrixArray += adjustedMatrix(1, 1);
568 adjustedMatrixArray += adjustedMatrix(1, 2);
569 adjustedMatrixArray += adjustedMatrix(2, 2);
572 if ( adjustedMatrix(0, 0) != 0.0
573 || adjustedMatrix(0, 1) != 0.0
574 || adjustedMatrix(0, 2) != 0.0
575 || adjustedMatrix(1, 1) != 0.0
576 || adjustedMatrix(1, 2) != 0.0
577 || adjustedMatrix(2, 2) != 0.0 ) {
578 pointObject[
"adjustedMatrix"] = adjustedMatrixArray;
583 QJsonArray simultaneousArray;
584 foreach (QString sn, lcp->snSimultaneous()) {
585 simultaneousArray.append(sn);
587 pointObject[
"simultaneousImages"] = simultaneousArray;
589 QJsonArray measureArray;
593 QJsonObject measureObject;
594 measureObject[
"line"] = measure->GetLine();
595 measureObject[
"sample"] = measure->GetSample();
596 measureObject[
"serialNumber"] = measure->GetCubeSerialNumber();
598 measureArray.append(measureObject);
602 pointObject[
"measures"] = measureArray;
604 pointArray.append(pointObject);
608 lidarDataObject[
"points"] = pointArray;
611 QJsonDocument lidarDataDoc(lidarDataObject);
612 if (format ==
Json || format ==
Test) {
613 saveFile.write(lidarDataDoc.toJson());
616 saveFile.write(lidarDataDoc.toBinaryData());
665 QList< ControlMeasure * > validMeasures;
671 if (!measure->IsIgnored()) {
672 validMeasures.append(measure);
676 return validMeasures;
686 IString msg =
"Cube Serial Number [" + serialNumber +
"] not found in "
691 QList< ControlMeasure * > measures;
692 foreach(QSharedPointer <LidarControlPoint>
point,
m_points) {
693 if (
point->HasSerialNumber(serialNumber)) {
694 measures.append(
point->GetMeasure(serialNumber));
@ Degrees
Degrees are generally considered more human readable, 0-360 is one circle, however most math does not...
static Camera * Create(Cube &cube)
Creates a Camera object using Pvl Specifications.
QString GetCubeSerialNumber() const
Return the serial number of the cube containing the coordinate.
Isis::Camera * Camera(int index)
Returns the camera list from the given image number.
@ Constrained
A Constrained point is a Control Point whose lat/lon/radius is somewhat established and should not be...
IO Handler for Isis Cubes.
Distance measurement, usually in meters.
double kilometers() const
Get the distance in kilometers.
@ Kilometers
The distance is being specified in kilometers.
File name manipulation and expansion.
@ Unknown
A type of error that cannot be classified as any of the other error types.
@ User
A type of error that could only have occurred due to a mistake on the user's part (e....
@ Programmer
This error is for when a programmer made an API call that was illegal.
Adds specific functionality to C++ strings.
This class is designed to encapsulate the concept of a Latitude.
double planetocentric(Angle::Units units=Angle::Radians) const
Get the latitude in the planetocentric (universal) coordinate system.
A lidar control ControlPoint.
QSharedPointer< LidarControlPoint > point(QString pointId) const
Gets a single LidarDataPoint by ID.
QVector< Isis::Camera * > p_cameraList
vector of image# to camera
int numberLidarPoints()
Returns number of Lidar data points.
bool ValidateSerialNumber(QString serialNumber) const
Does a check to ensure that the given serial number is contained within the network.
QList< ControlMeasure * > GetValidMeasuresInCube(QString serialNumber)
Get all the valid measures pertaining to a given cube serial number.
Format
Enumerates the file formats for serializing the LidarData class.
@ Test
Serializes to an ordered JSON .json file for comparing to truth data.
@ Json
Serializes to a JSON .json file.
void SetImages(SerialNumberList &list, Progress *progress=0)
Creates the ControlNet's image camera's based on the list of Serial Numbers.
LidarData()
Default constructor.
void read(FileName)
Unserialize LidarData.
QMap< QString, Isis::Camera * > p_cameraMap
camera
QList< QSharedPointer< LidarControlPoint > > points(bool sort=false) const
Gets the list of Lidar data points optionally sorted .
void write(FileName, Format)
Serializes LidarData.
int numberMeasures()
Returns total number of lidar measures.
int numberSimultaneousMeasures()
Returns number of simultaneous lidar measures.
QMap< QString, int > p_cameraRejectedMeasuresMap
#rejected measures
void insert(QSharedPointer< LidarControlPoint > point)
Adds a LidarControlPoint to the LidarData.
int GetNumberOfValidMeasuresInImage(const QString &serialNumber)
Return the number of measures in image specified by serialNumber.
QMap< QString, int > p_cameraValidMeasuresMap
#measures
QList< ControlMeasure * > GetMeasuresInCube(QString serialNumber)
Get all the measures pertaining to a given cube serial number.
QHash< QString, QSharedPointer< LidarControlPoint > > m_points
hash of LidarControlPoints
int numberAsynchronousMeasures()
Returns number of non-simultaneous lidar measures.
int GetNumberOfJigsawRejectedMeasuresInImage(const QString &serialNumber)
Return the number of jigsaw rejected measures in image specified by serialNumber.
This class is designed to encapsulate the concept of a Longitude.
double positiveEast(Angle::Units units=Angle::Radians) const
Get the longitude in the PositiveEast coordinate system.
Program progress reporter.
void SetMaximumSteps(const int steps)
This sets the maximum number of steps in the process.
void SetText(const QString &text)
Changes the value of the text string reported just before 0% processed.
void CheckStatus()
Checks and updates the status.
Serial Number list generator.
bool hasSerialNumber(QString sn)
Determines whether or not the requested serial number exists in the list.
QString serialNumber(const QString &filename)
Return a serial number given a filename.
int size() const
How many serial number / filename combos are in the list.
QString fileName(const QString &sn)
Return a filename given a serial number.
This class defines a body-fixed surface point.
Latitude GetLatitude() const
Return the body-fixed latitude for the surface point.
Longitude GetLongitude() const
Return the body-fixed longitude for the surface point.
Distance GetLocalRadius() const
Return the radius of the surface point.
Parse and return pieces of a time string.
This is free and unencumbered software released into the public domain.