USGS

Isis 3.0 Object Programmers' Reference

Home

MarciCamera.cpp
Go to the documentation of this file.
1 
20 #include <iomanip>
21 
22 #include "MarciCamera.h"
23 #include "MarciDistortionMap.h"
24 
25 #include "CameraFocalPlaneMap.h"
26 #include "CameraSkyMap.h"
27 #include "IException.h"
28 #include "iTime.h"
29 #include "NaifStatus.h"
32 
33 using namespace std;
34 namespace Isis {
35 
46  MarciCamera::MarciCamera(Cube &cube) : PushFrameCamera(cube) {
48  Pvl &lab = *cube.label();
49  PvlGroup &inst = lab.findGroup("Instrument", Pvl::Traverse);
50  // make sure it is a marci image
51  if(inst["InstrumentId"][0] != "Marci") {
52  string msg = "The image does not appear to be a Marci Image";
54  }
55 
56  // Set up the camera characteristics
58 
59  QString pixelPitchKey = "INS" + toString(naifIkCode()) + "_PIXEL_SIZE";
60  SetPixelPitch(getDouble(pixelPitchKey));
61 
62  // Get necessary variables
63  p_exposureDur = inst["ExposureDuration"];
64  p_interframeDelay = inst["InterframeDelay"];
65  int sumMode = inst["SummingMode"];
66 
67  // Get the start and end time
68  double et;
69  QString stime = inst["SpacecraftClockCount"];
70  et = getClockTime(stime).Et();
71  p_etStart = et - ((p_exposureDur / 1000.0) / 2.0);
72  p_nframelets = (int) (ParentLines() / sumMode);
73 
74  // These numbers came from "MARCI_CTX_Cal_Report_v1.5.pdf" page 7 (Bandpasses & downlinked detector rows)
75  map<QString, int> filterToDetectorOffset;
76  filterToDetectorOffset.insert(pair<QString, int>("BLUE", 709));
77  filterToDetectorOffset.insert(pair<QString, int>("GREEN", 734));
78  filterToDetectorOffset.insert(pair<QString, int>("ORANGE", 760));
79  filterToDetectorOffset.insert(pair<QString, int>("RED", 786));
80  filterToDetectorOffset.insert(pair<QString, int>("NIR", 811));
81  filterToDetectorOffset.insert(pair<QString, int>("LONG_UV", 266));
82  filterToDetectorOffset.insert(pair<QString, int>("SHORT_UV", 293));
83 
84  map<QString, int> filterToFilterNumbers;
85  filterToFilterNumbers.insert(pair<QString, int>("BLUE", 0));
86  filterToFilterNumbers.insert(pair<QString, int>("GREEN", 1));
87  filterToFilterNumbers.insert(pair<QString, int>("ORANGE", 2));
88  filterToFilterNumbers.insert(pair<QString, int>("RED", 3));
89  filterToFilterNumbers.insert(pair<QString, int>("NIR", 4));
90  filterToFilterNumbers.insert(pair<QString, int>("LONG_UV", 5));
91  filterToFilterNumbers.insert(pair<QString, int>("SHORT_UV", 6));
92 
93  int frameletOffsetFactor = inst["ColorOffset"];
94 
95  if((int)inst["DataFlipped"] != 0) frameletOffsetFactor *= -1;
96  map<QString, int> filterToFrameletOffset;
97  filterToFrameletOffset.insert(pair<QString, int>("NIR", 0 * frameletOffsetFactor));
98  filterToFrameletOffset.insert(pair<QString, int>("RED", 1 * frameletOffsetFactor));
99  filterToFrameletOffset.insert(pair<QString, int>("ORANGE", 2 * frameletOffsetFactor));
100  filterToFrameletOffset.insert(pair<QString, int>("GREEN", 3 * frameletOffsetFactor));
101  filterToFrameletOffset.insert(pair<QString, int>("BLUE", 4 * frameletOffsetFactor));
102  filterToFrameletOffset.insert(pair<QString, int>("LONG_UV", 5 * frameletOffsetFactor));
103  filterToFrameletOffset.insert(pair<QString, int>("SHORT_UV", 6 * frameletOffsetFactor));
104 
105  // Get the keywords from labels
106  const PvlGroup &bandBin = lab.findGroup("BandBin", Pvl::Traverse);
107  const PvlKeyword &filtNames = bandBin["FilterName"];
108 
109  for(int i = 0; i < filtNames.size(); i++) {
110  if(filterToDetectorOffset.find(filtNames[i]) == filterToDetectorOffset.end()) {
111  QString msg = "Unrecognized filter name [" + filtNames[i] + "]";
113  }
114 
115  p_detectorStartLines.push_back(filterToDetectorOffset.find(filtNames[i])->second);
116  p_filterNumbers.push_back(filterToFilterNumbers.find(filtNames[i])->second);
117  p_frameletOffsets.push_back(filterToFrameletOffset.find(filtNames[i])->second);
118  }
119 
120  // Setup detector map
121  double frameletRate = p_interframeDelay;
123  new PushFrameCameraDetectorMap(this, p_etStart, frameletRate, 16);
124  dmap->SetDetectorSampleSumming(sumMode);
125  dmap->SetDetectorLineSumming(sumMode);
127 
128  int numFramelets = ParentLines() / (16 / sumMode);
129  bool flippedFramelets = (int)inst["DataFlipped"] != 0;
130  dmap->SetFrameletOrderReversed(flippedFramelets, numFramelets);
131 
132  // Setup focal plane map
133  new CameraFocalPlaneMap(this, -74400);
134 
135  if ((int) naifIkCode() == -74410) {
136  // The line detector origin is in the middle of the orange framelet
137  FocalPlaneMap()->SetDetectorOrigin(512.5, 760.0 + 8.5);
138  }
139  else if ((int) naifIkCode() == -74420) {
140  FocalPlaneMap()->SetDetectorOrigin(512.5, 288.5);
141  }
142  else {
143  string msg = "Unrecognized NaifIkCode [" + IString((int) naifIkCode()) + "]";
145  }
146 
147  // Setup distortion map
148  new MarciDistortionMap(this, naifIkCode());
149 
150  // Setup the ground and sky map
151  bool evenFramelets = (inst["Framelets"][0] == "Even");
152  new PushFrameCameraGroundMap(this, evenFramelets);
153  new CameraSkyMap(this);
154  LoadCache();
156 
157  if(sumMode == 1) {
158  SetGeometricTilingHint(16, 4);
159  }
160  else if(sumMode == 2) {
162  }
163  else if(sumMode == 4) {
165  }
166  else {
168  }
169  }
170 
171 
172 
175  }
176 
177 
178 
184  void MarciCamera::SetBand(const int vband) {
185  Camera::SetBand(vband);
186 
188  dmap->SetBandFirstDetectorLine(p_detectorStartLines[vband-1]);
189  dmap->SetFrameletOffset(p_frameletOffsets[vband-1]);
190 
192  distmap->SetFilter(p_filterNumbers[vband-1]);
193  }
194 
195 
196 
203  return false;
204  }
205 
206 
207 
215  return (-74000);
216  }
217 
218 
219 
227  return (-74900);
228  }
229 
230 
231 
239  return (1);
240  }
241 
242 }
243 
244 
255  return new Isis::MarciCamera(cube);
256 }