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);