4 #include <boost/numeric/ublas/symmetric.hpp>
5 #include <boost/numeric/ublas/io.hpp>
10 #include <QStringList>
20 #include "ControlNetFile.h"
21 #include "ControlNetFile.h"
22 #include "ControlNetFileV0002.pb.h"
32 using boost::numeric::ublas::symmetric_matrix;
33 using boost::numeric::ublas::upper;
43 ControlPoint::ControlPoint() : invalid(false) {
59 referenceMeasure = NULL;
73 referenceMeasure = NULL;
81 QListIterator<QString> i(*other.cubeSerials);
83 QString sn = i.next();
89 if (other.referenceMeasure == otherCm)
124 const Distance &polarRad) : invalid(false) {
127 referenceMeasure = NULL;
132 id = fileEntry.id().c_str();
138 dateTime = fileEntry.datetime().c_str();
143 switch (fileEntry.type()) {
144 case ControlPointFileEntryV0002_PointType_obsolete_Tie:
145 case ControlPointFileEntryV0002_PointType_Free:
148 case ControlPointFileEntryV0002_PointType_Constrained:
151 case ControlPointFileEntryV0002_PointType_obsolete_Ground:
152 case ControlPointFileEntryV0002_PointType_Fixed:
156 QString msg =
"Point type is invalid.";
160 ignore = fileEntry.ignore();
164 if (fileEntry.has_apriorisurfpointsource()) {
165 switch (fileEntry.apriorisurfpointsource()) {
166 case ControlPointFileEntryV0002_AprioriSource_None:
170 case ControlPointFileEntryV0002_AprioriSource_User:
174 case ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures:
178 case ControlPointFileEntryV0002_AprioriSource_Reference:
182 case ControlPointFileEntryV0002_AprioriSource_Basemap:
186 case ControlPointFileEntryV0002_AprioriSource_BundleSolution:
190 case ControlPointFileEntryV0002_AprioriSource_Ellipsoid:
191 case ControlPointFileEntryV0002_AprioriSource_DEM:
196 if (fileEntry.has_apriorisurfpointsourcefile()) {
200 if (fileEntry.has_aprioriradiussource()) {
201 switch (fileEntry.aprioriradiussource()) {
202 case ControlPointFileEntryV0002_AprioriSource_None:
205 case ControlPointFileEntryV0002_AprioriSource_User:
208 case ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures:
211 case ControlPointFileEntryV0002_AprioriSource_Ellipsoid:
214 case ControlPointFileEntryV0002_AprioriSource_DEM:
217 case ControlPointFileEntryV0002_AprioriSource_BundleSolution:
221 case ControlPointFileEntryV0002_AprioriSource_Reference:
222 case ControlPointFileEntryV0002_AprioriSource_Basemap:
227 if (fileEntry.has_aprioriradiussourcefile()) {
233 if (fileEntry.has_apriorix() && fileEntry.has_aprioriy() &&
234 fileEntry.has_aprioriz()) {
240 if (fileEntry.aprioricovar_size() > 0) {
241 symmetric_matrix<double, upper> covar;
244 covar(0, 0) = fileEntry.aprioricovar(0);
245 covar(0, 1) = fileEntry.aprioricovar(1);
246 covar(0, 2) = fileEntry.aprioricovar(2);
247 covar(1, 1) = fileEntry.aprioricovar(3);
248 covar(1, 2) = fileEntry.aprioricovar(4);
249 covar(2, 2) = fileEntry.aprioricovar(5);
254 if (fileEntry.latitudeconstrained())
256 if (fileEntry.longitudeconstrained())
258 if (fileEntry.radiusconstrained())
262 if (fileEntry.latitudeconstrained())
264 if (fileEntry.radiusconstrained())
272 if (fileEntry.has_adjustedx() &&
273 fileEntry.has_adjustedy() &&
274 fileEntry.has_adjustedz()) {
280 if (fileEntry.adjustedcovar_size() > 0) {
281 symmetric_matrix<double, upper> covar;
284 covar(0, 0) = fileEntry.adjustedcovar(0);
285 covar(0, 1) = fileEntry.adjustedcovar(1);
286 covar(0, 2) = fileEntry.adjustedcovar(2);
287 covar(1, 1) = fileEntry.adjustedcovar(3);
288 covar(1, 2) = fileEntry.adjustedcovar(4);
289 covar(2, 2) = fileEntry.adjustedcovar(5);
303 for (
int m = 0 ; m < fileEntry.measures_size() ; m++) {
308 if (fileEntry.has_referenceindex()) {
309 SetRefMeasure((*measures)[cubeSerials->at(fileEntry.referenceindex())]);
325 referenceMeasure = NULL;
346 if (measures != NULL) {
348 for (
int i = 0; i < keys.size(); i++) {
349 delete(*measures)[keys[i]];
350 (*measures)[keys[i]] = NULL;
362 referenceMeasure = NULL;
435 QString msg =
"The SerialNumber is not unique. A measure with "
437 "exists for ControlPoint [" +
GetId() +
"]";
442 if (!measures->size()) {
443 ASSERT(referenceMeasure == NULL);
444 referenceMeasure = measure;
446 else if (referenceMeasure->IsIgnored() && !measure->IsIgnored() &&
451 referenceMeasure = measure;
456 measures->insert(newSerial, measure);
457 cubeSerials->append(newSerial);
475 if (!measures->contains(serialNumber)) {
476 QString msg =
"No measure with serial number [" + serialNumber +
477 "] is owned by this point";
494 return ControlMeasure::MeasureLocked;
497 measures->remove(serialNumber);
498 cubeSerials->removeAt(cubeSerials->indexOf(serialNumber));
501 if (cubeSerials->size()) {
502 if (referenceMeasure == cm) {
503 referenceMeasure = (*measures)[cubeSerials->at(0)];
508 referenceMeasure = NULL;
515 if (!IsIgnored() && !cm->IsIgnored())
524 return ControlMeasure::Success;
547 if (index < 0 || index >= cubeSerials->size()) {
548 QString msg =
"index [" + QString(index) +
"] out of bounds";
552 return Delete(cubeSerials->at(index));
585 return (*measures)[serialNumber];
597 return measures->value(serialNumber);
602 if (index < 0 || index >= cubeSerials->size()) {
603 QString msg =
"Index [" +
toString(index) +
"] out of range";
612 if (index < 0 || index >= cubeSerials->size()) {
613 QString msg =
"Index [" +
toString(index) +
"] out of range";
627 if (referenceMeasure == NULL) {
628 QString msg =
"Control point [" +
GetId() +
"] has no reference measure!";
632 return referenceMeasure;
640 if (referenceMeasure == NULL) {
641 QString msg =
"Control point [" +
GetId() +
"] has no reference measure!";
645 return referenceMeasure;
751 if (index < 0 || index >= cubeSerials->size()) {
752 QString msg =
"Index [";
753 msg +=
toString(index) +
"] out of range";
771 if (!cubeSerials->contains(sn)) {
772 QString msg =
"Point [" +
id +
"] has no measure with serial number [" +
802 referenceMeasure = measure;
820 if (oldStatus !=
ignore) {
824 if (!cm->IsIgnored()) {
870 QString msg =
"Invalid Point Enumeration, [" + QString(
type) +
"], for "
871 "Control Point [" +
GetId() +
"]";
891 RadiusSource::Source source) {
909 QString sourceFile) {
939 if (aprioriSP.GetLatSigma().
isValid())
941 if (aprioriSP.GetLonSigma().
isValid())
943 if (aprioriSP.GetLocalRadiusSigma().
isValid())
959 SurfacePointSource::Source source) {
976 QString sourceFile) {
1027 QString msg =
"ControlPoint [" +
GetId() +
"] is a fixed point ";
1028 msg +=
"and requires an apriori x/y/z";
1039 int goodMeasures = 0;
1042 for (
int j = 0; j < cubeSerials->size(); j++) {
1051 if (m->IsIgnored()) {
1055 Camera *cam = m->Camera();
1057 QString msg =
"The Camera must be set prior to calculating apriori";
1060 if (cam->
SetImage(m->GetSample(), m->GetLine())) {
1067 r2B += pB[0]*pB[0] + pB[1]*pB[1] + pB[2]*pB[2];
1101 || NumberOfConstrainedCoordinates() == 3
1102 || IsLatitudeConstrained()
1103 || IsLongitudeConstrained()
1104 || IsRadiusConstrained()) {
1113 if (goodMeasures == 0) {
1114 QString msg =
"ControlPoint [" +
GetId() +
"] has no measures which "
1115 "project to lat/lon/radius (x/y/z)";
1121 if (
GetType() ==
Free || NumberOfConstrainedCoordinates() == 0) {
1122 double avgX = xB / goodMeasures;
1123 double avgY = yB / goodMeasures;
1124 double avgZ = zB / goodMeasures;
1125 double avgR2 = r2B / goodMeasures;
1126 double scale = sqrt(avgR2/(avgX*avgX+avgY*avgY+avgZ*avgZ));
1181 for (
int j = 0; j < keys.size(); j++) {
1191 Camera *cam = m->Camera();
1209 if (!fpmap->
SetFocalPlane(m->GetFocalPlaneComputedX(), m->GetFocalPlaneComputedY())) {
1210 QString msg =
"Sanity check #1 for ControlPoint [" +
GetId() +
1236 double sample = m->GetSample();
1237 double computedY = m->GetFocalPlaneComputedY();
1238 double computedX = m->GetFocalPlaneComputedX();
1243 adjLine = m->GetLine() - 1.;
1245 adjLine = m->GetLine() + 1.;
1251 cam->
SetImage(sample, m->GetLine());
1260 deltaLine = -computedY/scalingY;
1262 deltaLine = computedY/scalingY;
1273 cuLine = m->GetLine() + deltaLine;
1281 if (!fpmap->
SetFocalPlane(m->GetFocalPlaneMeasuredX(), m->GetFocalPlaneMeasuredY())) {
1282 QString msg =
"Sanity check #2 for ControlPoint [" +
GetId() +
1291 muSamp = m->GetSample();
1292 muLine = m->GetLine();
1298 double sampResidual = muSamp - cuSamp;
1299 double lineResidual = muLine - cuLine;
1333 for (
int j = 0; j < keys.size(); j++) {
1343 Camera *cam = m->Camera();
1354 cam->
SetImage(m->GetSample(), m->GetLine());
1356 cam->
GroundMap()->
GetXY(GetAdjustedSurfacePoint(), &cudx, &cudy);
1369 QString ControlPoint::GetChooserName()
const {
1379 QString ControlPoint::GetDateTime()
const {
1389 bool ControlPoint::IsEditLocked()
const {
1394 bool ControlPoint::IsRejected()
const {
1399 SurfacePoint ControlPoint::GetAdjustedSurfacePoint()
const {
1426 bool ControlPoint::IsIgnored()
const {
1431 bool ControlPoint::IsValid()
const {
1436 bool ControlPoint::IsInvalid()
const {
1451 switch (pointType) {
1456 str =
"Constrained";
1475 QString pointTypeString) {
1480 QString errMsg =
"There is no PointType that has a string representation"
1482 errMsg += pointTypeString;
1485 if (pointTypeString ==
"Fixed")
1487 else if (pointTypeString ==
"Constrained")
1489 else if (pointTypeString ==
"Free")
1528 case RadiusSource::None:
1531 case RadiusSource::User:
1534 case RadiusSource::AverageOfMeasures:
1535 str =
"AverageOfMeasures";
1537 case RadiusSource::Ellipsoid:
1540 case RadiusSource::DEM:
1543 case RadiusSource::BundleSolution:
1544 str =
"BundleSolution";
1562 str = str.toLower();
1563 RadiusSource::Source source = RadiusSource::None;
1566 source = RadiusSource::User;
1567 else if (str ==
"averageofmeasures")
1568 source = RadiusSource::AverageOfMeasures;
1569 else if (str ==
"ellipsoid")
1570 source = RadiusSource::Ellipsoid;
1571 else if (str ==
"dem")
1572 source = RadiusSource::DEM;
1573 else if (str ==
"bundlesolution")
1574 source = RadiusSource::BundleSolution;
1599 SurfacePointSource::Source source) {
1604 case SurfacePointSource::None:
1607 case SurfacePointSource::User:
1610 case SurfacePointSource::AverageOfMeasures:
1611 str =
"AverageOfMeasures";
1613 case SurfacePointSource::Reference:
1616 case SurfacePointSource::Basemap:
1619 case SurfacePointSource::BundleSolution:
1620 str =
"BundleSolution";
1635 ControlPoint::SurfacePointSource::Source
1639 str = str.toLower();
1640 SurfacePointSource::Source source = SurfacePointSource::None;
1643 source = SurfacePointSource::User;
1644 else if (str ==
"averageofmeasures")
1645 source = SurfacePointSource::AverageOfMeasures;
1646 else if (str ==
"reference")
1647 source = SurfacePointSource::Reference;
1648 else if (str ==
"basemap")
1649 source = SurfacePointSource::Basemap;
1650 else if (str ==
"bundlesolution")
1651 source = SurfacePointSource::BundleSolution;
1667 bool ControlPoint::IsFixed()
const {
1672 SurfacePoint ControlPoint::GetAprioriSurfacePoint()
const {
1677 ControlPoint::RadiusSource::Source ControlPoint::GetAprioriRadiusSource()
1682 bool ControlPoint::HasAprioriCoordinates() {
1691 bool ControlPoint::IsConstrained() {
1695 bool ControlPoint::IsLatitudeConstrained() {
1699 bool ControlPoint::IsLongitudeConstrained() {
1703 bool ControlPoint::IsRadiusConstrained() {
1707 int ControlPoint::NumberOfConstrainedCoordinates() {
1711 QString ControlPoint::GetAprioriRadiusSourceFile()
const {
1715 ControlPoint::SurfacePointSource::Source
1716 ControlPoint::GetAprioriSurfacePointSource()
const {
1721 QString ControlPoint::GetAprioriSurfacePointSourceFile()
const {
1726 int ControlPoint::GetNumMeasures()
const {
1727 return measures->size();
1738 for (
int cm = 0; cm < keys.size(); cm++) {
1739 if (!(*measures)[keys[cm]]->IsIgnored())
1754 for (
int cm = 0; cm < keys.size(); cm++) {
1755 if ((*measures)[keys[cm]]->IsEditLocked())
1769 return cubeSerials->contains(serialNumber);
1786 if (referenceMeasure == NULL) {
1787 QString msg =
"There is no reference measure set in the ControlPoint [" +
1819 int index = cubeSerials->indexOf(sn);
1821 if (
throws && index == -1) {
1822 QString msg =
"ControlMeasure [" + sn +
"] does not exist in point [" +
1840 if (!referenceMeasure) {
1841 QString msg =
"There is no reference measure for point [" +
id +
"]."
1842 " This also means of course that the point is empty!";
1868 if (!cm->IsIgnored())
1869 stats.
AddData((cm->*statFunc)());
1879 if (!cm->IsIgnored())
1894 bool excludeIgnored)
const {
1896 for (
int i = 0; i < cubeSerials->size(); i++) {
1898 if (!excludeIgnored || !measure->IsIgnored())
1899 orderedMeasures.append(measures->value((*cubeSerials)[i]));
1901 return orderedMeasures;
1909 return *cubeSerials;
1971 return !(*
this == other);
1984 return other.GetNumMeasures() == GetNumMeasures() &&
1997 other.measures == measures &&
2003 other.cubeSerials == cubeSerials &&
2004 other.referenceMeasure == referenceMeasure;
2026 if (
this != &other) {
2028 for (
int i = cubeSerials->size() - 1; i >= 0; i--) {
2029 (*measures)[cubeSerials->at(i)]->SetEditLock(
false);
2030 Delete(cubeSerials->at(i));
2035 QHashIterator< QString, ControlMeasure * > i(*other.measures);
2036 while (i.hasNext()) {
2039 *newMeasure = *i.value();
2041 if (other.referenceMeasure == i.value())
2068 void ControlPoint::PointModified() {
2109 int nmeasures = measures->size();
2110 if( nmeasures <= 0 )
2115 for(
int i = 0; i < nmeasures; i++) {
2120 if( !m->IsIgnored() || m->IsRejected() )
2123 stats.
AddData(m->GetSampleResidual());
2137 int nmeasures = measures->size();
2138 if( nmeasures <= 0 )
2143 for(
int i = 0; i < nmeasures; i++) {
2148 if( !m->IsIgnored() || m->IsRejected() )
2151 stats.
AddData(m->GetLineResidual());
2165 int nmeasures = measures->size();
2166 if( nmeasures <= 0 )
2171 for(
int i = 0; i < nmeasures; i++) {
2176 if( m->IsIgnored() || m->IsRejected() )
2179 stats.
AddData(m->GetSampleResidual());
2180 stats.
AddData(m->GetLineResidual());
2191 int nmeasures = measures->size();
2192 if( nmeasures <= 0 )
2195 for(
int i = 0; i < nmeasures; i++) {
2210 fileEntry.set_id(
GetId().toLatin1().data());
2213 fileEntry.set_type(ControlPointFileEntryV0002::Free);
2216 fileEntry.set_type(ControlPointFileEntryV0002::Constrained);
2219 fileEntry.set_type(ControlPointFileEntryV0002::Fixed);
2223 if (!GetChooserName().isEmpty()) {
2224 fileEntry.set_choosername(GetChooserName().toLatin1().data());
2226 if (!GetDateTime().isEmpty()) {
2227 fileEntry.set_datetime(GetDateTime().toLatin1().data());
2230 fileEntry.set_editlock(
true);
2232 fileEntry.set_ignore(
true);
2234 fileEntry.set_jigsawrejected(
true);
2240 switch (GetAprioriSurfacePointSource()) {
2241 case ControlPoint::SurfacePointSource::None:
2243 case ControlPoint::SurfacePointSource::User:
2244 fileEntry.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_User);
2246 case ControlPoint::SurfacePointSource::AverageOfMeasures:
2247 fileEntry.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures);
2249 case ControlPoint::SurfacePointSource::Reference:
2250 fileEntry.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_Reference);
2252 case ControlPoint::SurfacePointSource::Basemap:
2253 fileEntry.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_Basemap);
2255 case ControlPoint::SurfacePointSource::BundleSolution:
2256 fileEntry.set_apriorisurfpointsource(ControlPointFileEntryV0002_AprioriSource_BundleSolution);
2261 if (!GetAprioriSurfacePointSourceFile().isEmpty()) {
2262 fileEntry.set_apriorisurfpointsourcefile(GetAprioriSurfacePointSourceFile().toLatin1().data());
2265 switch (GetAprioriRadiusSource()) {
2266 case ControlPoint::RadiusSource::None:
2268 case ControlPoint::RadiusSource::User:
2269 fileEntry.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_User);
2271 case ControlPoint::RadiusSource::AverageOfMeasures:
2272 fileEntry.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_AverageOfMeasures);
2274 case ControlPoint::RadiusSource::Ellipsoid:
2275 fileEntry.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_Ellipsoid);
2277 case ControlPoint::RadiusSource::DEM:
2278 fileEntry.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_DEM);
2280 case ControlPoint::RadiusSource::BundleSolution:
2281 fileEntry.set_aprioriradiussource(ControlPointFileEntryV0002_AprioriSource_BundleSolution);
2287 if (!GetAprioriRadiusSourceFile().isEmpty()) {
2288 fileEntry.set_aprioriradiussourcefile(GetAprioriRadiusSourceFile().toLatin1().data());
2291 if (GetAprioriSurfacePoint().Valid()) {
2292 SurfacePoint apriori = GetAprioriSurfacePoint();
2293 fileEntry.set_apriorix(apriori.GetX().meters());
2294 fileEntry.set_aprioriy(apriori.GetY().meters());
2295 fileEntry.set_aprioriz(apriori.GetZ().meters());
2297 symmetric_matrix< double, upper > covar = apriori.GetRectangularMatrix();
2298 if (covar(0, 0) != 0. || covar(0, 1) != 0. ||
2299 covar(0, 2) != 0. || covar(1, 1) != 0. ||
2300 covar(1, 2) != 0. || covar(2, 2) != 0.) {
2301 fileEntry.add_aprioricovar(covar(0, 0));
2302 fileEntry.add_aprioricovar(covar(0, 1));
2303 fileEntry.add_aprioricovar(covar(0, 2));
2304 fileEntry.add_aprioricovar(covar(1, 1));
2305 fileEntry.add_aprioricovar(covar(1, 2));
2306 fileEntry.add_aprioricovar(covar(2, 2));
2310 fileEntry.set_latitudeconstrained(
true);
2313 fileEntry.set_longitudeconstrained(
true);
2316 fileEntry.set_radiusconstrained(
true);
2320 if (GetAdjustedSurfacePoint().Valid()) {
2321 SurfacePoint adjusted = GetAdjustedSurfacePoint();
2322 fileEntry.set_adjustedx(adjusted.GetX().meters());
2323 fileEntry.set_adjustedy(adjusted.GetY().meters());
2324 fileEntry.set_adjustedz(adjusted.GetZ().meters());
2326 symmetric_matrix< double, upper > covar = adjusted.GetRectangularMatrix();
2327 if (covar(0, 0) != 0. || covar(0, 1) != 0. ||
2328 covar(0, 2) != 0. || covar(1, 1) != 0. ||
2329 covar(1, 2) != 0. || covar(2, 2) != 0.) {
2330 fileEntry.add_adjustedcovar(covar(0, 0));
2331 fileEntry.add_adjustedcovar(covar(0, 1));
2332 fileEntry.add_adjustedcovar(covar(0, 2));
2333 fileEntry.add_adjustedcovar(covar(1, 1));
2334 fileEntry.add_adjustedcovar(covar(1, 2));
2335 fileEntry.add_adjustedcovar(covar(2, 2));
2340 for (
int i = 0; i < cubeSerials->size(); i++) {
2341 *fileEntry.add_measures() =
2342 (*measures)[cubeSerials->at(i)]->ToProtocolBuffer();
This class defines a body-fixed surface point.
double GetSampleResidualRms() const
Get rms of sample residuals.
bool isValid() const
Test if this displacement has been initialized or not.
Status SetAprioriSurfacePointSource(SurfacePointSource::Source source)
This updates the source of the surface point.
PointType GetType() const
virtual CameraType GetCameraType() const =0
Returns the type of camera that was created.
void UpdatePointReference(ControlPoint *point, QString oldId)
Updates the key reference (poind Id) from the old one to what the point id was changet to...
void ZeroNumberOfRejectedMeasures()
Initialize the number of rejected measures to 0.
The distance is being specified in kilometers.
bool editLock
This stores the edit lock state.
void SetNumberOfRejectedMeasures(int numRejected)
Set (update) the number of rejected measures for the control point.
std::vector< Distance > GetTargetRadii()
Get the target radii.
void Add(ControlMeasure *measure)
Add a measurement to the control point, taking ownership of the measure in the process.
SurfacePoint aprioriSurfacePoint
The apriori surface point.
A Constrained point is a Control Point whose lat/lon/radius is somewhat established and should not be...
A Fixed point is a Control Point whose lat/lon is well established and should not be changed...
Status ComputeApriori()
This method computes the apriori lat/lon for a point.
QString id
This is the control point ID.
CameraDistortionMap * DistortionMap()
Returns a pointer to the CameraDistortionMap object.
Statistics GetStatistic(double(ControlMeasure::*statFunc)() const) const
This function will call a given method on every control measure that this point has.
Status SetAprioriRadiusSourceFile(QString sourceFile)
This updates the filename of the DEM that the apriori radius came from.
virtual bool SetFocalPlane(const double dx, const double dy)
Compute detector position (sample,line) from focal plane coordinates.
Status SetIgnored(bool newIgnoreStatus)
Set whether to ignore or use control point.
virtual bool GetXY(const SurfacePoint &spoint, double *cudx, double *cudy)
Compute undistorted focal plane coordinate from ground position using current Spice from SetImage cal...
void ClearJigsawRejected()
Set jigsaw rejected flag for all measures to false and set the jigsaw rejected flag for the point its...
ControlPoint * parentPoint
Pointer to parent ControlPoint, may be null.
bool jigsawRejected
This stores the jigsaw rejected state.
double Rms() const
Computes and returns the rms.
QString GetPointTypeString() const
Obtain a string representation of the PointType.
PointType
These are the valid 'types' of point.
Status ComputeResiduals_Millimeters()
This method computes the residuals for a point.
int GetNumValidMeasures() const
const ControlMeasure * operator[](QString serialNumber) const
Same as GetMeasure (provided for convenience)
ControlNet * parentNetwork
List of Control Measures.
double UndistortedFocalPlaneY() const
Return undistorted focal plane y.
QString dateTime
This is the last modified date and time.
double GetNumericalValue() const
Get the value associated with this log data.
Status SetChooserName(QString name)
Set the point's chooser name.
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
This error is for when a programmer made an API call that was illegal.
static QString Name()
Returns the name of the application.
Status SetEditLock(bool editLock)
Set the EditLock state.
ControlPoint()
Construct a control point.
The distance is being specified in meters.
void SetRectangularMatrix(const boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > &covar)
Set rectangular covariance matrix.
const ControlMeasure * GetRefMeasure() const
Get the reference control measure.
Status SetRejected(bool rejected)
Set "jigsaw" rejected flag for a measure.
Distance measurement, usually in meters.
void measureDeleted(ControlMeasure *measure)
Updates the ControlCubeGraphNode for this measure's serial number to reflect the deletion.
QString GetReferenceSN() const
void measureAdded(ControlMeasure *measure)
Updates the ControlCubeGraphNode for the measure's serial number to reflect the addition.
Status SetAdjustedSurfacePoint(SurfacePoint newSurfacePoint)
Set or update the surface point relating to this control point.
void SetRadii(const Distance &majorRadius, const Distance &minorRadius, const Distance &polarRadius)
Reset the radii of the surface body of the surface point.
A Free point is a Control Point that identifies common measurements between two or more cubes...
double DetectorLine() const
Return detector line.
static QString SurfacePointSourceToString(SurfacePointSource::Source source)
Obtain a string representation of a given SurfacePointSource.
bool HasSerialNumber(QString serialNumber) const
Return true if given serial number exists in point.
SurfacePoint adjustedSurfacePoint
This is the calculated, or aposterori, surface point.
static QString RadiusSourceToString(RadiusSource::Source source)
Obtain a string representation of a given RadiusSource.
bool SetImage(const double sample, const double line)
Sets the sample/line values of the image to get the lat/lon values.
This class is used to accumulate statistics on double arrays.
Status SetAprioriSurfacePointSourceFile(QString sourceFile)
This updates the filename of where the apriori surface point came from.
double DetectorSample() const
Return detector sample.
QString GetRadiusSourceString() const
Obtain a string representation of the RadiusSource.
Status SetResidual(double sampResidual, double lineResidual)
Set the BundleAdjust Residual of the coordinate.
QString GetId() const
Return the Id of the control point.
Convert between distorted focal plane and detector coordinates.
static RadiusSource::Source StringToRadiusSource(QString str)
Obtain a RadiusSource::Source from a string.
CameraGroundMap * GroundMap()
Returns a pointer to the CameraGroundMap object.
virtual bool SetUndistortedFocalPlane(double ux, double uy)
Compute distorted focal plane x/y.
Status SetDateTime(QString newDateTime)
Set the point's last modified time.
static QString DateTime(time_t *curtime=0)
Returns the date and time as a QString.
#define _FILEINFO_
Macro for the filename and line number.
Status SetRefMeasure(ControlMeasure *cm)
Set the point's reference measure.
bool isValid() const
Test if this distance has been initialized or not.
A type of error that could only have occurred due to a mistake on the user's part (e...
Status SetAprioriSurfacePoint(SurfacePoint aprioriSP)
This updates the apriori surface point.
SurfacePoint GetBestSurfacePoint() const
Returns the adjusted surface point if it exists, otherwise returns the a priori surface point...
This is returned when an operation cannot be performed due to a problem such as the point is ignored ...
bool referenceExplicitlySet
This indicates if a program has explicitely set the reference in this point or the implicit reference...
int IndexOf(ControlMeasure *, bool throws=true) const
SurfacePoint GetSurfacePoint() const
Returns the surface point (most efficient accessor).
const ControlPoint & operator=(const ControlPoint &pPoint)
bool IsReferenceExplicit() const
bool ignore
True if we should preserve but ignore the entire control point and its measures.
bool IsEditLocked() const
Return value for p_editLock or implicit lock on reference measure.
bool isValid() const
This indicates whether we have a legitimate angle stored or are in an unset, or invalid, state.
bool invalid
If we forced a build that we would normally have thrown an exception for then this is set to true...
CameraFocalPlaneMap * FocalPlaneMap()
Returns a pointer to the CameraFocalPlaneMap object.
~ControlPoint()
This destroys the current instance and cleans up any and all allocated memory.
Status SetRejected(bool rejected)
Set the jigsawRejected state.
Status SetType(PointType newType)
Updates the control point's type.
PointType type
What this control point is tying together.
Status SetId(QString id)
Sets the Id of the control point.
void Coordinate(double p[3]) const
Returns the x,y,z of the surface intersection in BodyFixed km.
static SurfacePointSource::Source StringToSurfacePointSource(QString str)
Obtain a SurfacePoint::Source from a string.
void ValidateMeasure(QString serialNumber) const
Throws an exception if none of the point's measures have the given serial number. ...
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
Status
This is a return status for many of the mutating (setter) method calls.
SurfacePointSource::Source aprioriSurfacePointSource
Where the apriori surface point originated from.
void Load(PvlObject &p)
Loads the PvlObject into a ControlPoint.
void SetExplicitReference(ControlMeasure *measure)
Explicitly defines a new reference measure by pointer.
int numberOfRejectedMeasures
This parameter is used and maintained by BundleAdjust for the jigsaw application. ...
QString chooserName
This is the user name of the person who last modified this control point.
double GetResidualRms() const
Get rms of residuals.
double FocalPlaneY() const
Return distorted focal plane y.
Status SetFocalPlaneMeasured(double x, double y)
Set the focal plane x/y for the measured line/sample.
bool operator==(const ControlPoint &pPoint) const
Compare two Control Points for equality.
QString aprioriRadiusSourceFile
The name of the file that derives the apriori surface point's radius.
QString aprioriSurfacePointSourceFile
FileName where the apriori surface point originated from.
int GetNumberOfRejectedMeasures() const
Get the number of rejected measures on the control point.
QList< ControlMeasure * > getMeasures(bool excludeIgnored=false) const
Displacement is a signed length, usually in meters.
bool operator!=(const ControlPoint &pPoint) const
Compare two Control Points for inequality.
QString GetCubeSerialNumber() const
Return the serial number of the cube containing the coordinate.
Status ResetApriori()
Reset all the Apriori info to defaults.
int GetNumLockedMeasures() const
Returns the number of locked control measures.
int Delete(ControlMeasure *measure)
Remove a measurement from the control point, deleting reference measure is allowed.
void AddMeasure(ControlMeasure *measure)
Do the actual work of adding a measure to this point, without changing any extra data.
QString GetSurfacePointSourceString() const
Obtain a string representation of the SurfacePointSource.
double FocalPlaneX() const
Return distorted focal plane x.
void AddData(const double *data, const unsigned int count)
Add an array of doubles to the accumulators and counters.
Contains Pvl Groups and Pvl Objects.
const ControlMeasure * GetMeasure(QString serialNumber) const
Get a control measure based on its cube's serial number.
QList< QString > getCubeSerialNumbers() const
double UndistortedFocalPlaneX() const
Return undistorted focal plane x.
static QString PointTypeToString(PointType type)
Obtain a string representation of a given PointType.
int IndexOfRefMeasure() const
std::bitset< 6 > constraintStatus
This stores the constraint status of the a priori SurfacePoint.
Status SetAprioriRadiusSource(RadiusSource::Source source)
This updates the source of the radius of the apriori surface point.
Status ComputeResiduals()
This method computes the BundleAdjust residuals for a point.
Status SetFocalPlaneComputed(double x, double y)
Set the computed focal plane x/y for the apriori lat/lon.
void measureUnIgnored(ControlMeasure *measure)
Updates the connections for the ControlCubeGraphNode associated with the measure's serial number to r...
double GetLineResidualRms() const
Get rms of line residuals.
This is returned when the operation successfully took effect.
This is the status of constrained coordinates in the SurfacePoint.
static PointType StringToPointType(QString pointTypeString)
Obtain a PointType given a string representation of it.
void SetRectangular(const Displacement &x, const Displacement &y, const Displacement &z, const Distance &xSigma=Distance(), const Distance &ySigma=Distance(), const Distance &zSigma=Distance())
Set surface point in rectangular body-fixed coordinates wtih optional sigmas.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
This is returned when the operation requires Edit Lock to be false but it is currently true...
RadiusSource::Source aprioriRadiusSource
Where the apriori surface point's radius originated from, most commonly used by jigsaw.