9 #include "HiEqualization.h"
15 #include "IException.h"
16 #include "LineManager.h"
17 #include "OverlapNormalization.h"
18 #include "OverlapStatistics.h"
20 #include "ProcessByLine.h"
29 HiEqualization::HiEqualization(QString fromListName) :
31 loadInputs(fromListName);
35 HiEqualization::~HiEqualization() {
39 void HiEqualization::calculateStatistics() {
41 const FileList &imageList = getInputs();
42 QString maxCubeStr =
toString((
int) imageList.size());
45 vector<Statistics *> statsList;
46 vector<Statistics *> leftStatsList;
47 vector<Statistics *> rightStatsList;
48 for (
int img = 0; img < imageList.size(); img++) {
49 Statistics *stats =
new Statistics();
50 Statistics *statsLeft =
new Statistics();
51 Statistics *statsRight =
new Statistics();
53 QString cubeStr =
toString((
int) img + 1);
56 p.Progress()->SetText(
"Calculating Statistics for Cube " +
57 cubeStr +
" of " + maxCubeStr);
58 CubeAttributeInput att;
59 QString inp = imageList[img].toString();
60 p.SetInputCube(inp, att);
61 HiCalculateFunctor func(stats, statsLeft, statsRight, 100.0);
62 p.ProcessCubeInPlace(func,
false);
64 statsList.push_back(stats);
65 leftStatsList.push_back(statsLeft);
66 rightStatsList.push_back(statsRight);
70 OverlapNormalization oNorm(statsList);
74 for (
int i = 0; i < imageList.size() - 1; i++) {
76 oNorm.AddOverlap(*rightStatsList[i], i, *leftStatsList[j], j,
77 rightStatsList[i]->ValidPixels());
87 for (
int img = 0; img < imageList.size(); img++) {
89 adjustment->addGain(oNorm.Gain(img));
90 adjustment->addOffset(oNorm.Offset(img));
91 adjustment->addAverage(oNorm.Average(img));
100 void HiEqualization::fillOutList(FileList &outList, QString toListName) {
101 if (toListName.isEmpty()) {
108 for (
unsigned int i = 0; i < movedIndices.size(); i++) {
109 outList.push_back(tempList[movedIndices[i]]);
116 const FileList &imageList = getInputs();
119 if (imageList.size() > 10) {
120 QString msg =
"The input file [" + fromListName +
121 "] cannot contain more than 10 file names";
126 const int cpmm2ccd[] = {0, 1, 2, 3, 12, 4, 10, 11, 5, 13, 6, 7, 8, 9};
130 for (
int i = 0; i < imageList.size(); i++) {
135 int cpmmNumber = from1Instrument[
"CpmmNumber"];
136 ccds.push_back(cpmm2ccd[cpmmNumber]);
140 movedIndices.push_back(i);
143 QString msg =
"The [" + imageList[i].toString() +
144 "] file is not a valid HiRise image";
150 QString msg =
"The [" + imageList[i].toString() +
151 "] file is not a valid HiRise image";
157 for (
int i = 0; i < imageList.size() - 1; i++) {
158 int id1 = getCCDType(ccds[i]);
159 int id2 = getCCDType(ccds[i + 1]);
163 string msg =
"The list of input images must be all RED, all IR, or ";
170 for (
int i = 1; i < imageList.size(); i++) {
171 QString temp = imageList[i].toString();
173 int movedIndex = movedIndices[i];
178 while (j >= 0 && ccd2 > ccd1) {
179 setInput(j + 1, imageList[j].
toString());
180 ccds[j + 1] = ccds[j];
181 movedIndices[j + 1] = movedIndices[j];
184 if (j >= 0) ccd2 = ccds[j];
187 setInput(j + 1, temp);
189 movedIndices[j + 1] = movedIndex;
193 if (ccds[0] == 10 || ccds[0] == 11) {
194 if (imageList.size() != 2) {
195 string msg =
"A list of IR images must have exactly two ";
200 else if (ccds[0] == 12 || ccds[0] == 13) {
201 if (imageList.size() != 2) {
202 string msg =
"A list of BG images must have exactly two ";
211 int HiEqualization::getCCDType(
int ccd) {
213 return (ccd >= 0 && ccd <= 9) ? 0 : (ccd == 10 || ccd == 11) ? 1 : 2;
217 void HiEqualization::HiCalculateFunctor::addStats(Buffer &in)
const {
218 Equalization::CalculateFunctor::addStats(in);
225 unsigned int intersect = (in.size() == 682 || in.size() == 683) ?
226 18 : (48 * in.size()) / 2048;
228 m_statsLeft->
AddData(&in[0], intersect);
229 m_statsRight->
AddData(&in[in.size() - intersect], intersect);