File indexing completed on 2024-05-19 14:58:11

0001 /*
0002     SPDX-FileCopyrightText: 2023 Joseph McGee <joseph.mcgee@sbcglobal.net>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include <stdio.h>
0008 #include <string.h>
0009 #include <QLoggingCategory>
0010 #include <QDialog>
0011 #include <QDir>
0012 #include <QFile>
0013 #include <QtNetwork/QNetworkAccessManager>
0014 #include <QtNetwork/QNetworkRequest>
0015 #include <QtNetwork/QNetworkReply>
0016 #include <QStandardPaths>
0017 #include <QUrl>
0018 #include <QTimer>
0019 #include <QIODevice>
0020 #include <QDirIterator>
0021 #include <QXmlStreamWriter>
0022 #include <QXmlStreamReader>
0023 #include "fileutilitycameradata.h"
0024 #include "imagingcameradata.h"
0025 #include "cameragainreadnoise.h"
0026 #include "exposurecalculatordialog.h"
0027 #include <ekos_capture_debug.h>
0028 #include <sstream>
0029 #include <kspaths.h>
0030 
0031 /*
0032  * Direct access to files on KDE/kstars git repository:
0033  */
0034 QString const OptimalExposure::FileUtilityCameraData::cameraDataRemoteRepositoryList
0035     = "https://api.github.com/repos/KDE/kstars/git/trees/master:kstars%2Fdata%2Fcameradata";
0036 
0037 QString const OptimalExposure::FileUtilityCameraData::cameraDataRemoteRepository
0038     = "https://raw.githubusercontent.com/KDE/kstars/master/kstars/data/cameradata/";
0039 
0040 QString const OptimalExposure::FileUtilityCameraData::cameraApplicationDataRepository
0041     = KSPaths::locate(QStandardPaths::AppDataLocation, QString("cameradata/"), QStandardPaths::LocateDirectory);
0042 
0043 QString const OptimalExposure::FileUtilityCameraData::cameraLocalDataRepository
0044     = QDir(KSPaths::writableLocation(QStandardPaths::AppLocalDataLocation)).filePath("kstars/cameradata/");
0045 
0046 QStringList OptimalExposure::FileUtilityCameraData::getAvailableCameraFilesList()
0047 {
0048     QStringList cameraDataFiles;
0049     QStringList dirs;
0050 
0051 
0052     dirs << KSPaths::locateAll(QStandardPaths::GenericDataLocation,
0053                                QString::fromLatin1("kstars/cameradata"),
0054                                QStandardPaths::LocateDirectory);
0055 
0056     Q_FOREACH (const QString &dir, dirs)
0057     {
0058         QDirIterator it(dir, QStringList() << QLatin1String("*.xml"));
0059 
0060         while (it.hasNext())
0061         {
0062             cameraDataFiles.append(it.next());
0063         }
0064     }
0065 
0066     return(cameraDataFiles);
0067 }
0068 
0069 
0070 QString OptimalExposure::FileUtilityCameraData::cameraIdToCameraDataFileName(QString cameraId)
0071 {
0072 
0073     // Replace spaces with "_" in the file name
0074     QString aCameraDataFile = cameraId.replace(" ", "_");
0075 
0076     if(!aCameraDataFile.endsWith(".xml"))
0077     {
0078         aCameraDataFile += ".xml";
0079     }
0080 
0081     return(aCameraDataFile);
0082 }
0083 
0084 QString OptimalExposure::FileUtilityCameraData::cameraDataFileNameToCameraId(QString cameraDataFileName)
0085 {
0086     QFileInfo cameraDataFileInfo(cameraDataFileName);
0087 
0088     // QString aCameraId = cameraDataFileName;
0089 
0090     QString aCameraId = cameraDataFileInfo.baseName();
0091 
0092     if(aCameraId.endsWith(".xml"))
0093         aCameraId.truncate(aCameraId.length() - 4);
0094 
0095     aCameraId = aCameraId.replace("_", " ");
0096     return(aCameraId);
0097 }
0098 
0099 
0100 void OptimalExposure::FileUtilityCameraData::downloadRepositoryCameraDataFileList(
0101     QDialog *aDialog)
0102 
0103 {
0104 
0105     qCInfo(KSTARS_EKOS_CAPTURE) << "cameraDataRemoteRepositoryList: " <<
0106                                 OptimalExposure::FileUtilityCameraData::cameraDataRemoteRepositoryList;
0107     qCInfo(KSTARS_EKOS_CAPTURE) << "cameraDataRemoteRepository: " <<
0108                                 OptimalExposure::FileUtilityCameraData::cameraDataRemoteRepository;
0109     // qCInfo(KSTARS_EKOS_CAPTURE) << "cameraApplicationDataRepository: " << OptimalExposure::FileUtilityCameraData::cameraApplicationDataRepository;
0110     qCInfo(KSTARS_EKOS_CAPTURE) << "cameraLocalDataRepository: " <<
0111                                 OptimalExposure::FileUtilityCameraData::cameraLocalDataRepository;
0112 
0113     // Using git tree to access camera file list, this approach requires parsing the tree
0114     // string collect the xml (camera data) file names.
0115 
0116     FileUtilityCameraDataDialog *activeDialog = static_cast<FileUtilityCameraDataDialog *> (aDialog);
0117     activeDialog->setANetworkAccessManager(new QNetworkAccessManager(activeDialog));
0118 
0119     QString aCameraDataRemoteFolderURL = OptimalExposure::FileUtilityCameraData::cameraDataRemoteRepositoryList;
0120     qCInfo(KSTARS_EKOS_CAPTURE) << "Attempting access of camera data file repository " << aCameraDataRemoteFolderURL;
0121 
0122     QNetworkRequest activeRequest = QNetworkRequest(QUrl(aCameraDataRemoteFolderURL));
0123     activeDialog->setRequest(&activeRequest);
0124     activeDialog->setReply(activeDialog->getANetworkAccessManager()->get(activeRequest));
0125 
0126     QNetworkReply *activeReply = activeDialog->getReply();
0127     QTimer::singleShot(60000, activeReply, [activeReply]   //Time-out is 60 seconds
0128     {
0129         activeReply->abort();
0130         activeReply->deleteLater();
0131         qCCritical(KSTARS_EKOS_CAPTURE) << "CameraDataFile Download Timed out.";
0132     });
0133 
0134     QVector<QString> *availableCameraDataFiles = new QVector<QString>();
0135 
0136     activeDialog->connect(activeReply, &QNetworkReply::finished,
0137                           activeDialog,
0138                           [availableCameraDataFiles, activeReply, activeDialog]
0139     {
0140         // qCInfo(KSTARS_EKOS_CAPTURE) << "The Camera Data File List download is finished";
0141         activeReply->deleteLater();
0142         if (activeReply->error() != QNetworkReply::NoError)
0143         {
0144             qCCritical(KSTARS_EKOS_CAPTURE) << "An error occurred in the Camera Data File List download";
0145             return;
0146         }
0147 
0148         // Parse out the filenames from the tree
0149         std::string responseDataStr = activeReply->readAll().toStdString();
0150 
0151         // qCInfo(KSTARS_EKOS_CAPTURE) << "Camera Data File Github Tree:\n" << QString::fromStdString(responseDataStr);
0152 
0153         std::string startdelimiter = "[";
0154         std::string stopdelimiter = "]";
0155         std::string treeStr = responseDataStr.substr(responseDataStr.find(startdelimiter) + 1, responseDataStr.find(stopdelimiter) - responseDataStr.find(startdelimiter));
0156 
0157         std::vector <std::string> tokens;
0158         std::stringstream responseDataStream(treeStr);
0159 
0160         std::string intermediate;
0161 
0162         while(getline(responseDataStream, intermediate, ','))
0163         {
0164             tokens.push_back(intermediate);
0165         }
0166 
0167         // Find the camera file name
0168         for(int i = 0; i < tokens.size(); i++)
0169         {
0170             if(tokens[i].find("path") != std::string::npos)
0171             {
0172 
0173                 std::string aCameraDataFileStr = tokens[i].substr(9,  tokens[i].length() - 14);
0174                 // std::cout << aCameraDataFileStr << '\n';
0175 
0176                 QString aCameraDataFile = QString::fromStdString(aCameraDataFileStr);
0177 
0178                 availableCameraDataFiles->append(aCameraDataFile);
0179 
0180             }
0181         }
0182         activeDialog->setAvailableCameraDataFiles(*availableCameraDataFiles);
0183         activeDialog->refreshCameraList();
0184     });
0185 
0186     activeDialog->connect(activeReply, &QNetworkReply::downloadProgress,
0187                           activeDialog,
0188                           [availableCameraDataFiles, activeReply, activeDialog]
0189     {
0190         qCInfo(KSTARS_EKOS_CAPTURE) << "The Camera Data File List download is in progress";
0191     });
0192     activeDialog->connect(activeReply, &QNetworkReply::errorOccurred,
0193                           activeDialog,
0194                           [availableCameraDataFiles, activeReply, activeDialog]
0195     {
0196         qCCritical(KSTARS_EKOS_CAPTURE) << "The Camera Data File List download had an error";
0197     });
0198     activeDialog->connect(activeReply, &QNetworkReply::destroyed,
0199                           activeDialog,
0200                           [availableCameraDataFiles, activeReply, activeDialog]
0201     {
0202         qCInfo(KSTARS_EKOS_CAPTURE) << "The Camera Data File List connection was destroyed";
0203     });
0204 
0205     qCInfo(KSTARS_EKOS_CAPTURE) << "The Camera Data File List length is " << availableCameraDataFiles->length();
0206 
0207 
0208 }
0209 
0210 void OptimalExposure::FileUtilityCameraData::downloadCameraDataFile(
0211     QString cameraId,
0212     QDialog *aDialog)
0213 {
0214 
0215     FileUtilityCameraDataDialog *activeDialog = static_cast<FileUtilityCameraDataDialog *> (aDialog);
0216 
0217     activeDialog->setANetworkAccessManager(new QNetworkAccessManager(activeDialog));
0218 
0219     QDir filePath = OptimalExposure::FileUtilityCameraData::cameraLocalDataRepository;
0220     filePath.mkpath(".");
0221 
0222     QString cameraDataFileName = cameraIdToCameraDataFileName(cameraId);
0223 
0224     // File in remote repository
0225     QString aCameraDataDownloadURL = OptimalExposure::FileUtilityCameraData::cameraDataRemoteRepository
0226                                      + cameraDataFileName;
0227 
0228     // File for local storage
0229     QString aCameraDataLocalFileName = OptimalExposure::FileUtilityCameraData::cameraLocalDataRepository
0230                                        + cameraDataFileName;
0231 
0232     //QString aCameraDataLocalFileName = KSPaths::locate(QStandardPaths::AppLocalDataLocation,
0233     //                                   QString("cameradata/%1").arg(cameraDataFileName));
0234 
0235 
0236 
0237     qCInfo(KSTARS_EKOS_CAPTURE) << "Attempting Download Camera Data from "
0238                                 << aCameraDataDownloadURL << "\n\tto " << aCameraDataLocalFileName;
0239 
0240     QNetworkRequest activeRequest = QNetworkRequest(QUrl(aCameraDataDownloadURL));
0241     activeDialog->setRequest(&activeRequest);
0242 
0243     activeDialog->setReply(activeDialog->getANetworkAccessManager()->get(activeRequest));
0244     QNetworkReply *activeReply = activeDialog->getReply();
0245     QTimer::singleShot(60000, activeReply, [activeReply]   //Time-out is 60 seconds
0246     {
0247         activeReply->abort();
0248         activeReply->deleteLater();
0249         qCCritical(KSTARS_EKOS_CAPTURE) << Q_FUNC_INFO << "CameraDataFile Download Timed out.";
0250     });
0251     activeDialog->connect(activeReply, &QNetworkReply::finished,
0252                           activeDialog,
0253                           [aCameraDataLocalFileName, activeReply, activeDialog]
0254     {
0255         activeReply->deleteLater();
0256         if (activeReply->error() != QNetworkReply::NoError)
0257         {
0258             qCCritical(KSTARS_EKOS_CAPTURE)
0259                     << "An error occurred in the Camera Data File download of "
0260                     << aCameraDataLocalFileName;
0261             return;
0262         }
0263         QFile aCameraDataFile(aCameraDataLocalFileName);
0264         if(aCameraDataFile.open(QIODevice::ReadWrite | QIODevice::Truncate))
0265         {
0266             QByteArray responseData = activeReply->readAll();
0267             if (aCameraDataFile.write(responseData))
0268             {
0269                 aCameraDataFile.close();
0270                 qCInfo(KSTARS_EKOS_CAPTURE) << "The Camera Data File download of "
0271                                             << aCameraDataLocalFileName << " is finished";
0272                 activeDialog->decrementDownloadFileCounter();
0273             }
0274             else
0275             {
0276                 qCCritical(KSTARS_EKOS_CAPTURE) << "The Camera Data File download of "
0277                                                 << aCameraDataLocalFileName << " was not completed";
0278             }
0279         }
0280     });
0281     activeDialog->connect(activeReply, &QNetworkReply::downloadProgress,
0282                           activeDialog,
0283                           [aCameraDataLocalFileName, activeReply, activeDialog]
0284     {
0285         qCInfo(KSTARS_EKOS_CAPTURE) << "The Camera Data File download of "
0286                                     << aCameraDataLocalFileName << " is in progress";
0287     });
0288     activeDialog->connect(activeReply, &QNetworkReply::errorOccurred,
0289                           activeDialog,
0290                           [aCameraDataLocalFileName, activeReply, activeDialog]
0291     {
0292         qCInfo(KSTARS_EKOS_CAPTURE) << "The Camera Data File download of "
0293                                     << aCameraDataLocalFileName << " had an error";
0294     });
0295     activeDialog->connect(activeReply, &QNetworkReply::destroyed,
0296                           activeDialog,
0297                           [aCameraDataLocalFileName, activeReply, activeDialog]
0298     {
0299         qCInfo(KSTARS_EKOS_CAPTURE) << "The Camera Data File connection for " << aCameraDataLocalFileName << " was destroyed";
0300     });
0301 
0302 }
0303 
0304 
0305 int OptimalExposure::FileUtilityCameraData::readCameraDataFile(QString aCameraDataFile,
0306         OptimalExposure::ImagingCameraData *anImagingCameraData)
0307 {
0308     //    QString aCameraDataFile = OptimalExposure::FileUtilityCameraData::cameraApplicationDataRepository +
0309     //                              cameraIdToCameraDataFileName(cameraId);
0310 
0311     // qCInfo(KSTARS_EKOS_CAPTURE) << "Opening... " + aCameraDataFile;
0312 
0313     QFile file(aCameraDataFile);
0314     if(file.open(QIODevice::ReadOnly | QIODevice::Text))
0315     {
0316         // qCInfo(KSTARS_EKOS_CAPTURE) << "Reading... " + aCameraDataFile;
0317         QXmlStreamReader xmlReader(&file);
0318 
0319         if (xmlReader.readNextStartElement())
0320         {
0321             // qCInfo(KSTARS_EKOS_CAPTURE) << "xmlReader start element name: " << xmlReader.name();
0322             if (xmlReader.name() == "ExposureCalculatorCameraData")
0323             {
0324                 // qCInfo(KSTARS_EKOS_CAPTURE) << "Found aCamera Element...";
0325 
0326                 QVector<OptimalExposure::CameraGainReadMode> *aCameraGainReadModeVector
0327                     = new QVector<OptimalExposure::CameraGainReadMode>();
0328 
0329                 while(xmlReader.readNextStartElement())
0330                 {
0331                     // qCInfo(KSTARS_EKOS_CAPTURE) << "xmlReader start element name: " << xmlReader.name();
0332                     if (xmlReader.name() == "CameraDataClassVersion")
0333                     {
0334                         int aDataClassVersion = xmlReader.readElementText().toInt();
0335                         anImagingCameraData->setDataClassVersion(aDataClassVersion);
0336                     }
0337 
0338                     if (xmlReader.name() == "CameraId")
0339                     {
0340                         // qCInfo(KSTARS_EKOS_CAPTURE) << "Found aCameraId Element...";
0341                         QString aCameraIdString = xmlReader.readElementText();
0342                         // qCInfo(KSTARS_EKOS_CAPTURE) << "Read element text..." + aCameraIdString;
0343                         anImagingCameraData->setCameraId(aCameraIdString);
0344                     }
0345 
0346                     if (xmlReader.name() == "SensorType")
0347                     {
0348                         // qCInfo(KSTARS_EKOS_CAPTURE) << "Found SensorType Element...";
0349                         QString aSensorType = xmlReader.readElementText();
0350                         // qCInfo(KSTARS_EKOS_CAPTURE) << "Read element text..." + aSensorType;
0351                         if(aSensorType == "COLOR")
0352                             anImagingCameraData->setSensorType(OptimalExposure::SENSORTYPE_COLOR);
0353 
0354                         if(aSensorType == "MONOCHROME")
0355                             anImagingCameraData->setSensorType(OptimalExposure::SENSORTYPE_MONOCHROME);
0356                     }
0357 
0358                     if (xmlReader.name() == "GainSelectionType")
0359                     {
0360                         // qCInfo(KSTARS_EKOS_CAPTURE) << "Found GainSelectionType Element...";
0361                         QString aGainSelectionType = xmlReader.readElementText();
0362                         // qCInfo(KSTARS_EKOS_CAPTURE) << "Read element text..." + aGainSelectionType;
0363                         if(aGainSelectionType == "NORMAL")
0364                             anImagingCameraData->setGainSelectionType(OptimalExposure::GAIN_SELECTION_TYPE_NORMAL);
0365                         if(aGainSelectionType == "ISO_DISCRETE")
0366                             anImagingCameraData->setGainSelectionType(OptimalExposure::GAIN_SELECTION_TYPE_ISO_DISCRETE);
0367                         if(aGainSelectionType == "FIXED")
0368                             anImagingCameraData->setGainSelectionType(OptimalExposure::GAIN_SELECTION_TYPE_FIXED);
0369                     }
0370 
0371 
0372                     // GainSelection collection  // For GAIN_SELECTION_TYPE_NORMAL the collection represents min and max,
0373                     // for GAIN_SELECTION_TYPE_ISO_DISCRETE, the collection is the discrete list of of gain/iso values.
0374                     // Note that the data available for GainReadNoiseValue may not match a camera discrete gain/iso values,
0375                     // so this collection resolves that.
0376 
0377                     if (xmlReader.name() == "CameraGainSelections")
0378                     {
0379                         QVector<int> *aGainSelectionVector = new QVector<int>();
0380 
0381                         int aGainSelection = 0;
0382                         while(xmlReader.readNext() && !(xmlReader.name() == "CameraGainSelections" && xmlReader.isEndElement()))
0383                         {
0384                             // qCInfo(KSTARS_EKOS_CAPTURE) << "xmlReader.name() = " <<  xmlReader.name();
0385                             if (xmlReader.name() == "GainSelection")
0386                             {
0387                                 // qCInfo(KSTARS_EKOS_CAPTURE) << "xmlReader.name() = " <<  xmlReader.name();
0388                                 QString aGainSelectionString = xmlReader.readElementText();
0389                                 aGainSelection = aGainSelectionString.toInt();
0390                                 // qCInfo(KSTARS_EKOS_CAPTURE) << "a Found GainSelection text: " << aGainSelection;
0391 
0392                                 // qCInfo(KSTARS_EKOS_CAPTURE) << "Adding GainSelection to Vector " << QString::number(aGainSelection);
0393 
0394                                 aGainSelectionVector->push_back(aGainSelection);
0395                             }
0396                         }
0397                         anImagingCameraData->setGainSelectionRange(*aGainSelectionVector);
0398                     }
0399 
0400                     if (xmlReader.name() == "CameraGainReadMode")
0401                     {
0402                         OptimalExposure::CameraGainReadMode *aCameraGainReadMode = new OptimalExposure::CameraGainReadMode();
0403 
0404                         while(xmlReader.readNext() && !(xmlReader.name() == "CameraGainReadMode" && xmlReader.isEndElement()))
0405                         {
0406                             // qCInfo(KSTARS_EKOS_CAPTURE) << "xmlReader.name() = " <<  xmlReader.name();
0407                             if (xmlReader.name() == "GainReadModeNumber")
0408                             {
0409                                 QString aGainReadModeNumberString = xmlReader.readElementText();
0410                                 aCameraGainReadMode->setCameraGainReadModeNumber(aGainReadModeNumberString.toInt());
0411                             }
0412                             if (xmlReader.name() == "GainReadModeName")
0413                             {
0414                                 aCameraGainReadMode->setCameraGainReadModeName(xmlReader.readElementText());
0415                             }
0416 
0417                             // CameraGainReadNoise collection
0418                             if (xmlReader.name() == "CameraGainReadNoise")
0419                             {
0420                                 // qCInfo(KSTARS_EKOS_CAPTURE) << "Found CameraGainReadNoise Element...";
0421                                 // QString aCameraGainReadNoise = xmlReader.readElementText();
0422                                 // // qCInfo(KSTARS_EKOS_CAPTURE) << "Read element ..." + aCameraGainReadNoise;
0423 
0424                                 QVector<OptimalExposure::CameraGainReadNoise> *aCameraGainReadNoiseVector
0425                                     = new QVector<OptimalExposure::CameraGainReadNoise>();
0426 
0427 
0428                                 // Iterate for Gain Read-Noise data
0429                                 int aGain = 0;
0430                                 double aReadNoise = 0.0;
0431                                 while(xmlReader.readNext() && !(xmlReader.name() == "CameraGainReadNoise" && xmlReader.isEndElement()) )
0432                                 {
0433                                     // qCInfo(KSTARS_EKOS_CAPTURE) << "xmlReader.name() = " <<  xmlReader.name();
0434 
0435                                     if (xmlReader.isEndElement())
0436                                         // qCInfo(KSTARS_EKOS_CAPTURE) << "At end of  = " <<  xmlReader.name();
0437 
0438 
0439                                         if (xmlReader.name() == "GainReadNoiseValue")
0440                                         {
0441                                             // qCInfo(KSTARS_EKOS_CAPTURE) << "Found GainReadNoiseValue Element...";
0442                                         }
0443 
0444                                     if (xmlReader.name() == "Gain")
0445                                     {
0446                                         // qCInfo(KSTARS_EKOS_CAPTURE) << "Found Gain Element...";
0447                                         QString aGainString = xmlReader.readElementText();
0448                                         aGain = aGainString.toInt();
0449                                         // qCInfo(KSTARS_EKOS_CAPTURE) << "a Found Gain text: " << aGain;
0450                                     }
0451 
0452                                     if (xmlReader.name() == "ReadNoise")
0453                                     {
0454                                         // qCInfo(KSTARS_EKOS_CAPTURE) << "Found ReadNoise Element...";
0455                                         QString aReadNoiseString = xmlReader.readElementText();
0456                                         aReadNoise = aReadNoiseString.toDouble();
0457                                         // qCInfo(KSTARS_EKOS_CAPTURE) << "a Found ReadNoise text: " << aReadNoise;
0458 
0459                                         // Add this to a vector
0460                                         // qCInfo(KSTARS_EKOS_CAPTURE) << "Adding Gain Read-Noise to Vector " << QString::number(aGain) << " " << QString::number(aReadNoise) ;
0461                                         aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(aGain, aReadNoise)));
0462                                     }
0463                                 }
0464                                 aCameraGainReadMode->setCameraGainReadNoiseVector(*aCameraGainReadNoiseVector);
0465                                 aCameraGainReadModeVector->push_back(*aCameraGainReadMode);
0466                             }
0467                             anImagingCameraData->setCameraGainReadModeVector(*aCameraGainReadModeVector);
0468                         }
0469                         // qCInfo(KSTARS_EKOS_CAPTURE) << "Finished reading mode ";
0470                     }
0471 
0472                 }
0473                 // qCInfo(KSTARS_EKOS_CAPTURE) << "Read xml data for " + anImagingCameraData->getCameraId();
0474 
0475             }
0476             else
0477             {
0478                 qCCritical(KSTARS_EKOS_CAPTURE) << "Read Failed";
0479                 xmlReader.raiseError(QObject::tr("Incorrect file"));
0480             }
0481         }
0482         else
0483         {
0484             qCCritical(KSTARS_EKOS_CAPTURE) << "Read Initial Element Failed,";
0485         }
0486     }
0487     else
0488     {
0489         qCCritical(KSTARS_EKOS_CAPTURE)
0490                 << "Cannot open file for reading " << file.errorString();
0491     }
0492 
0493     file.close();
0494     return 0;
0495 }
0496 
0497 int OptimalExposure::FileUtilityCameraData::writeCameraDataFile(OptimalExposure::ImagingCameraData *anImagingCameraData)
0498 {
0499 
0500     if(QDir().mkpath(cameraLocalDataRepository))
0501     {
0502         // Replace spaces with "_" in the file name
0503         QString aCameraDataFile = cameraLocalDataRepository + cameraIdToCameraDataFileName(anImagingCameraData->getCameraId());
0504 
0505         QFile file(aCameraDataFile);
0506         if(file.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text))
0507         {
0508 
0509             QXmlStreamWriter xmlWriter(&file);
0510             xmlWriter.setAutoFormatting(true);
0511             xmlWriter.writeStartDocument();
0512 
0513             xmlWriter.writeStartElement("ExposureCalculatorCameraData");
0514 
0515             xmlWriter.writeTextElement("CameraDataClassVersion", QString::number(anImagingCameraData->getDataClassVersion()));
0516 
0517             xmlWriter.writeTextElement("CameraId", anImagingCameraData->getCameraId() );
0518 
0519             switch(anImagingCameraData->getSensorType())
0520             {
0521                 case OptimalExposure::SENSORTYPE_MONOCHROME:
0522                     xmlWriter.writeTextElement("SensorType", QString("MONOCHROME"));
0523                     break;
0524                 case OptimalExposure::SENSORTYPE_COLOR:
0525                     xmlWriter.writeTextElement("SensorType", QString("COLOR"));
0526                     break;
0527             }
0528 
0529             switch(anImagingCameraData->getGainSelectionType())
0530             {
0531                 case OptimalExposure::GAIN_SELECTION_TYPE_NORMAL:
0532                     xmlWriter.writeTextElement("GainSelectionType", QString("NORMAL"));
0533                     break;
0534                 case OptimalExposure::GAIN_SELECTION_TYPE_ISO_DISCRETE:
0535                     xmlWriter.writeTextElement("GainSelectionType", QString("ISO_DISCRETE"));
0536                     break;
0537                 case OptimalExposure::GAIN_SELECTION_TYPE_FIXED:
0538                     xmlWriter.writeTextElement("GainSelectionType", QString("FIXED"));
0539                     break;
0540             }
0541 
0542             xmlWriter.writeStartElement("CameraGainSelections");
0543             QVector<int> aGainSelectionRange = anImagingCameraData->getGainSelectionRange();
0544             for(int gs = 0; gs < aGainSelectionRange.count(); gs++)
0545             {
0546                 // xmlWriter.writeStartElement("GainSelection");
0547                 xmlWriter.writeTextElement("GainSelection", QString::number(anImagingCameraData->getGainSelectionRange()[gs]));
0548                 // xmlWriter.writeEndElement();
0549             }
0550             xmlWriter.writeEndElement();
0551 
0552             // Iterate through values of anImagingCameraData->CameraGainReadModeVector
0553 
0554             xmlWriter.writeStartElement("CameraGainReadMode");
0555             QVector<OptimalExposure::CameraGainReadMode> aCameraGainReadModeVector =
0556                 anImagingCameraData->getCameraGainReadModeVector();
0557             for(QVector<OptimalExposure::CameraGainReadMode>::iterator readMode = aCameraGainReadModeVector.begin();
0558                     readMode != aCameraGainReadModeVector.end(); ++readMode)
0559             {
0560                 xmlWriter.writeTextElement("GainReadModeNumber", QString::number(readMode->getCameraGainReadModeNumber()));
0561                 xmlWriter.writeTextElement("GainReadModeName", readMode->getCameraGainReadModeName());
0562                 //            xmlWriter.writeStartElement("GainReadModeNumber");
0563                 //            xmlWriter.writeEndElement();
0564                 //            xmlWriter.writeStartElement("GainReadModeName");
0565                 //            xmlWriter.writeEndElement();
0566                 // Iterate through values of readMode->CameraGainReadNoiseVector
0567                 xmlWriter.writeStartElement("CameraGainReadNoise");
0568                 QVector<OptimalExposure::CameraGainReadNoise> aCameraGainReadNoiseVector =
0569                     readMode->getCameraGainReadNoiseVector();
0570 
0571                 for(QVector<OptimalExposure::CameraGainReadNoise>::iterator readNoisePair = aCameraGainReadNoiseVector.begin();
0572                         readNoisePair != aCameraGainReadNoiseVector.end(); ++readNoisePair)
0573                 {
0574                     xmlWriter.writeStartElement("GainReadNoiseValue");
0575                     xmlWriter.writeTextElement("Gain", QString::number(readNoisePair->getGain()));
0576                     xmlWriter.writeTextElement("ReadNoise", QString::number(readNoisePair->getReadNoise()));
0577                     xmlWriter.writeEndElement();
0578                 }
0579                 xmlWriter.writeEndElement();
0580 
0581             }
0582             xmlWriter.writeEndElement();
0583             xmlWriter.writeEndElement();
0584             xmlWriter.writeEndDocument();
0585             file.close();
0586 
0587         }
0588         else
0589         {
0590             qCCritical(KSTARS_EKOS_CAPTURE)
0591                     << "Cannot open camera data file for writing " << file.errorString();
0592         }
0593     }
0594     return 0;
0595 
0596 
0597 }
0598 
0599 
0600 // Make example camera data files
0601 //void OptimalExposure::FileUtilityCameraData::buildCameraDataFile()
0602 //{
0603 //    /*
0604 //     * camera naming should try match the Camera device name (cameraId) present in KStars.
0605 //     * A cameraId in KStars appears to consist of a device label (or driver id) and the camera model.
0606 //     *
0607 //     * For example:
0608 //     *   a "ZWO ASI-071 MC Pro"
0609 //     *
0610 //     *   The usb id is "ZWO ASI071MC Pro", but KStars uses a driver prefix ("ZWO CCD") in the cameraId.
0611 //     *   cameraId = "ZWO CCD ASI071MC Pro";
0612 //     *
0613 //     *   The file utility code will replace spaces with underscore on writes, and vice-versa on reads.
0614 //     *   So the xml file would be "ZWO_CCD_ASI071MC_Pro.xml"
0615 //     *
0616 //     *   But for many of these examples the kstars cameraId was not available (I do not own all these cameras).
0617 //     *   So guesses were made for the cameraId of most of these cameras.
0618 //     *
0619 //     *
0620 //     *
0621 //     * Manufacturers:
0622 //        cat indidrivers.xml | grep -i driver | grep -i ccd
0623 //            <driver name="CCD Simulator">indi_simulator_ccd</driver>
0624 //            <driver name="V4L2 CCD">indi_v4l2_ccd</driver>
0625 //            <driver name="Apogee CCD">indi_apogee_ccd</driver>
0626 //            <driver name="ZWO CCD">indi_asi_ccd</driver>
0627 //            <driver name="ZWO Camera">indi_asi_single_ccd</driver>
0628 //            <driver name="Atik">indi_atik_ccd</driver>
0629 //            <driver name="Cam90 CCD">indi_cam90_ccd</driver>
0630 //            <driver name="DSI">indi_dsi_ccd</driver>
0631 //            <driver name="FireFly MV">indi_ffmv_ccd</driver>
0632 //            <driver name="Starfish CCD">indi_fishcamp_ccd</driver>
0633 //            <driver name="FLI Kepler">indi_kepler_ccd</driver>
0634 //            <driver name="FLI CCD">indi_fli_ccd</driver>
0635 //            <driver name="Canon DSLR">indi_canon_ccd</driver>
0636 //            <driver name="Nikon DSLR">indi_nikon_ccd</driver>
0637 //            <driver name="Pentax DSLR">indi_pentax_ccd</driver>
0638 //            <driver name="Sony DSLR">indi_sony_ccd</driver>
0639 //            <driver name="Fuji DSLR">indi_fuji_ccd</driver>
0640 //            <driver name="GPhoto CCD">indi_gphoto_ccd</driver>
0641 //            <driver name="iNova PLX">indi_inovaplx_ccd</driver>
0642 //            <driver name="MI CCD">indi_mi_ccd_usb</driver>
0643 //            <driver name="MI CCD">indi_mi_ccd_eth</driver>
0644 //            <driver name="Nightscape CCD">indi_nightscape_ccd</driver>
0645 //            <driver name="Orion SSG3">indi_orion_ssg3_ccd</driver>
0646 //            <driver name="PlayerOne CCD">indi_playerone_ccd</driver>
0647 //            <driver name="QHY CCD">indi_qhy_ccd</driver>
0648 //            <driver name="QSI CCD">indi_qsi_ccd</driver>
0649 //            <driver name="SBIG CCD">indi_sbig_ccd</driver>
0650 //            <driver name="SBIG CCD">indi_sbig_ccd</driver>
0651 //            <driver name="SVBONY CCD">indi_svbony_ccd</driver>
0652 //            <driver name="SX CCD">indi_sx_ccd</driver>
0653 //            <driver name="Toupcam">indi_toupcam_ccd</driver>
0654 //            <driver name="Altair">indi_altair_ccd</driver>
0655 //            <driver name="Bressercam">indi_bressercam_ccd</driver>
0656 //            <driver name="Mallincam">indi_mallincam_ccd</driver>
0657 //            <driver name="Nncam">indi_nncam_ccd</driver>
0658 //            <driver name="Ogmacam">indi_ogmacam_ccd</driver>
0659 //            <driver name="OmegonPro">indi_omegonprocam_ccd</driver>
0660 //            <driver name="StartshootG">indi_starshootg_ccd</driver>
0661 //            <driver name="Tscam">indi_tscam_ccd</driver>
0662 //            <driver name="Nncam">indi_nncam_ccd</driver>
0663 //            <driver name="INDI Webcam">indi_webcam_ccd</driver>
0664 
0665 //        grep -iR "device label" | grep -i " CCD"
0666 //        indidrivers.xml:        <device label="DMK CCD" manufacturer="DMK">
0667 //        indidrivers.xml:        <device label="V4L2 CCD" manufacturer="Web Cameras">
0668 //        indidrivers.xml:        <device label="Apogee CCD" manufacturer="Andor">
0669 //        indidrivers.xml:        <device label="ZWO CCD" mdpd="true" manufacturer="ZWO">
0670 //        indidrivers.xml:        <device label="Atik CCD" mdpd="true" manufacturer="Atik">
0671 //        indidrivers.xml:        <device label="Cam90 CCD" mdpd="true">
0672 //        indidrivers.xml:        <device label="Starfish CCD">
0673 //        indidrivers.xml:        <device label="FLI CCD" manufacturer="Finger Lakes Instruments">
0674 //        indidrivers.xml:        <device label="GPhoto CCD" manufacturer="DSLRs">
0675 //        indidrivers.xml:        <device label="MI CCD (USB)" manufacturer="Moravian Instruments">
0676 //        indidrivers.xml:        <device label="MI CCD (ETH)" manufacturer="Moravian Instruments">
0677 //        indidrivers.xml:        <device label="Nightscape 8300 CCD" mdpd="true" manufacturer="Celestron">
0678 //        indidrivers.xml:        <device label="PlayerOne CCD" mdpd="true" manufacturer="PlayerOne">
0679 //        indidrivers.xml:        <device label="QHY CCD" mdpd="true" manufacturer="QHY">
0680 //        indidrivers.xml:        <device label="QSI CCD" manufacturer="QSI">
0681 //        indidrivers.xml:        <device label="SBIG CCD" manufacturer="Diffraction Limited">
0682 //        indidrivers.xml:        <device label="SVBONY CCD" mdpd="true" manufacturer="SVBONY">
0683 //        indidrivers.xml:        <device label="SX CCD" mdpd="true" manufacturer="Starlight XPress">
0684 
0685 //     */
0686 
0687 //    // Define and re-use for each camera instance
0688 //    QString cameraId;
0689 //    int readModeNumber = 0;
0690 //    QString readModeName;
0691 //    QVector<OptimalExposure::CameraGainReadNoise> *aCameraGainReadNoiseVector;
0692 //    QVector<OptimalExposure::CameraGainReadMode> *aCameraGainReadModeVector;
0693 
0694 //    QVector<int> *gainSelection;
0695 //    OptimalExposure::ImagingCameraData *anImagingCameraData;
0696 
0697 //    // This QHY camera has selectable read modes, with distinct read-noise data.
0698 //    // The indi driver may provide a "Read Mode" selectoin on the indi panel.
0699 //    // The xml data files are revised to handle multiple read-modes for a camera
0700 //    // in a single file.
0701 
0702 //    // #0 Photographic, #1 High Gain, #2 Extended Full Well and #3 Extended Full Well 2CMSIT.
0703 
0704 //    // Research: Is the same read-noise is used in both Mono and Color versions?
0705 
0706 //    cameraId = "QHY CCD 268M";
0707 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
0708 
0709 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
0710 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 7.25)));
0711 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(5, 7.1)));
0712 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(10, 6.78)));
0713 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(15, 6.74)));
0714 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(20, 6.74)));
0715 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(25, 2.8)));
0716 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(30, 2.63)));
0717 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(35, 2.7)));
0718 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(40, 2.57)));
0719 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(45, 2.55)));
0720 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 2.52)));
0721 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(55, 2.35)));
0722 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(60, 2.07)));
0723 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(65, 2.05)));
0724 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(70, 2.04)));
0725 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(75, 2.06)));
0726 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(80, 2.03)));
0727 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(85, 2.01)));
0728 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(90, 2)));
0729 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(95, 1.99)));
0730 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 2)));
0731 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(105, 1.97)));
0732 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(110, 1.96)));
0733 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(115, 1.95)));
0734 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(120, 1.94)));
0735 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(125, 1.93)));
0736 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(130, 1.92)));
0737 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(135, 1.89)));
0738 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(140, 1.9)));
0739 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(145, 1.89)));
0740 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 1.85)));
0741 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(155, 1.82)));
0742 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(160, 1.81)));
0743 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(165, 1.8)));
0744 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(170, 1.79)));
0745 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(175, 1.75)));
0746 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(180, 1.74)));
0747 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(185, 1.7)));
0748 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(190, 1.68)));
0749 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(195, 1.67)));
0750 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 1.62)));
0751 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(205, 1.59)));
0752 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(210, 1.56)));
0753 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(215, 1.53)));
0754 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(220, 1.48)));
0755 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(225, 1.44)));
0756 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(230, 1.41)));
0757 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(235, 1.36)));
0758 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(240, 1.32)));
0759 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(245, 1.26)));
0760 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 1.17)));
0761 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(255, 1.12)));
0762 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(260, 1.03)));
0763 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(265, 0.92)));
0764 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(270, 0.79)));
0765 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(275, 0.62)));
0766 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(280, 0.6)));
0767 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(285, 0.7)));
0768 
0769 //    readModeNumber = 0;
0770 //    readModeName = "Photographic";
0771 
0772 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
0773 //                                           *aCameraGainReadNoiseVector)));
0774 
0775 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
0776 
0777 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(5, 3.6)));
0778 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(10, 3.58)));
0779 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(15, 3.64)));
0780 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(20, 3.63)));
0781 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(25, 3.63)));
0782 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(30, 3.58)));
0783 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(35, 3.49)));
0784 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(40, 3.39)));
0785 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(45, 3.43)));
0786 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 3.53)));
0787 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(55, 3.43)));
0788 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(60, 1.69)));
0789 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(65, 1.69)));
0790 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(70, 1.67)));
0791 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(75, 1.67)));
0792 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(80, 1.63)));
0793 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(85, 1.6)));
0794 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(90, 1.57)));
0795 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(95, 1.53)));
0796 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 1.25)));
0797 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(105, 1.22)));
0798 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(110, 1.22)));
0799 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(115, 1.21)));
0800 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(120, 1.2)));
0801 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(125, 1.2)));
0802 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(130, 1.19)));
0803 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(135, 1.18)));
0804 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(140, 1.17)));
0805 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(145, 1.15)));
0806 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 1.14)));
0807 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(155, 1.14)));
0808 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(160, 1.13)));
0809 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(165, 1.12)));
0810 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(170, 1.11)));
0811 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(175, 1.09)));
0812 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(180, 1.09)));
0813 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(185, 1.08)));
0814 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(190, 1.06)));
0815 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(195, 1.06)));
0816 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 1.03)));
0817 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(205, 1.01)));
0818 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(210, 0.98)));
0819 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(215, 0.99)));
0820 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(220, 0.96)));
0821 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(225, 0.97)));
0822 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(230, 0.92)));
0823 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(235, 0.93)));
0824 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(240, 0.87)));
0825 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(245, 0.87)));
0826 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 0.8)));
0827 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(255, 0.79)));
0828 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(260, 0.8)));
0829 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(265, 0.7)));
0830 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(270, 0.71)));
0831 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(275, 0.7)));
0832 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(280, 0.69)));
0833 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(285, 0.69)));
0834 
0835 //    readModeNumber = 1;
0836 //    readModeName = "High Gain";
0837 
0838 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
0839 //                                           *aCameraGainReadNoiseVector)));
0840 
0841 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
0842 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 7.56)));
0843 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(5, 7.48)));
0844 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(10, 7.41)));
0845 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(15, 7.34)));
0846 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(20, 7.22)));
0847 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(25, 7.15)));
0848 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(30, 7.01)));
0849 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(35, 6.83)));
0850 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(40, 6.69)));
0851 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(45, 6.6)));
0852 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 6.64)));
0853 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(55, 6.72)));
0854 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(60, 6.86)));
0855 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(65, 6.93)));
0856 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(70, 6.73)));
0857 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(75, 6.44)));
0858 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(80, 6.55)));
0859 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(85, 6.06)));
0860 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(90, 6.16)));
0861 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(95, 5.75)));
0862 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 5.36)));
0863 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(105, 5.34)));
0864 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(110, 5.34)));
0865 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(115, 5.35)));
0866 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(120, 5.34)));
0867 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(125, 5.3)));
0868 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(130, 5.22)));
0869 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(135, 5.18)));
0870 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(140, 5.09)));
0871 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(145, 5.04)));
0872 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 4.96)));
0873 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(155, 4.9)));
0874 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(160, 4.85)));
0875 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(165, 4.77)));
0876 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(170, 4.71)));
0877 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(175, 4.62)));
0878 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(180, 4.57)));
0879 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(185, 4.46)));
0880 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(190, 4.4)));
0881 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(195, 4.32)));
0882 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 4.2)));
0883 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(205, 4.1)));
0884 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(210, 4.02)));
0885 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(215, 3.95)));
0886 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(220, 3.79)));
0887 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(225, 3.71)));
0888 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(230, 3.58)));
0889 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(235, 3.53)));
0890 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(240, 3.41)));
0891 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(245, 3.26)));
0892 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 3.14)));
0893 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(255, 3.04)));
0894 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(260, 2.87)));
0895 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(265, 2.8)));
0896 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(270, 2.62)));
0897 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(275, 2.5)));
0898 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(280, 2.34)));
0899 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(285, 2.18)));
0900 
0901 //    readModeNumber = 2;
0902 //    readModeName = "Extended Full Well";
0903 
0904 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
0905 //                                           *aCameraGainReadNoiseVector)));
0906 
0907 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
0908 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 5.89)));
0909 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(5, 5.82)));
0910 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(10, 5.82)));
0911 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(15, 5.73)));
0912 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(20, 5.66)));
0913 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(25, 5.58)));
0914 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(30, 5.44)));
0915 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(35, 5.39)));
0916 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(40, 5.26)));
0917 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(45, 5.17)));
0918 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 5.17)));
0919 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(55, 5.25)));
0920 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(60, 5.34)));
0921 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(65, 5.43)));
0922 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(70, 5.33)));
0923 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(75, 5.08)));
0924 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(80, 5.05)));
0925 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(85, 4.81)));
0926 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(90, 4.85)));
0927 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(95, 4.55)));
0928 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 4.26)));
0929 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(105, 4.25)));
0930 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(110, 4.23)));
0931 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(115, 4.26)));
0932 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(120, 4.26)));
0933 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(125, 4.23)));
0934 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(130, 4.18)));
0935 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(135, 4.15)));
0936 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(140, 4.08)));
0937 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(145, 4.09)));
0938 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 4.05)));
0939 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(155, 4.01)));
0940 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(160, 3.98)));
0941 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(165, 3.96)));
0942 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(170, 3.91)));
0943 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(175, 3.87)));
0944 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(180, 3.83)));
0945 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(185, 3.8)));
0946 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(190, 3.76)));
0947 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(195, 3.68)));
0948 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 3.64)));
0949 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(205, 3.57)));
0950 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(210, 3.51)));
0951 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(215, 3.44)));
0952 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(220, 3.39)));
0953 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(225, 3.33)));
0954 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(230, 3.25)));
0955 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(235, 3.2)));
0956 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(240, 3.13)));
0957 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(245, 3.03)));
0958 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 2.99)));
0959 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(255, 2.87)));
0960 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(260, 2.77)));
0961 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(265, 2.72)));
0962 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(270, 2.58)));
0963 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(275, 2.5)));
0964 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(280, 2.37)));
0965 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(285, 2.22)));
0966 
0967 //    readModeNumber = 3;
0968 //    readModeName = "Extended Full Well 2CMSIT";
0969 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
0970 //                                           *aCameraGainReadNoiseVector)));
0971 
0972 //    gainSelection = new QVector<int>( { 0, 285 } );
0973 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_MONOCHROME,
0974 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
0975 //    anImagingCameraData->setDataClassVersion(1);
0976 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
0977 
0978 //    cameraId = "ZWO CCD ASI071MC Pro";
0979 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
0980 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 3.28)));
0981 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 2.78)));
0982 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 2.58)));
0983 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 2.39)));
0984 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 2.29)));
0985 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 2.27)));
0986 
0987 //    readModeNumber = 0;
0988 //    readModeName = "Standard";
0989 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
0990 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
0991 //                                           *aCameraGainReadNoiseVector)));
0992 
0993 //    gainSelection = new QVector<int>( { 0, 250 } );
0994 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_COLOR,
0995 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
0996 
0997 //    anImagingCameraData->setDataClassVersion(1);
0998 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
0999 
1000 
1001 
1002 
1003 //    // usb id is "ZWO ASI178MC"
1004 //    cameraId = "ZWO CCD ASI178MC";
1005 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1006 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 2.23)));
1007 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 1.92)));
1008 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 1.74)));
1009 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 1.58)));
1010 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 1.45)));
1011 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 1.39)));
1012 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(300, 1.38)));
1013 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(400, 1.35)));
1014 
1015 //    readModeNumber = 0;
1016 //    readModeName = "Standard";
1017 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1018 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1019 //                                           *aCameraGainReadNoiseVector)));
1020 
1021 
1022 //    gainSelection = new QVector<int>( { 0, 400 } );
1023 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_COLOR,
1024 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1025 
1026 //    anImagingCameraData->setDataClassVersion(1);
1027 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1028 
1029 
1030 //    cameraId = "ZWO CCD ASI6200MM";
1031 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1032 
1033 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 3.6)));
1034 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 3.5)));
1035 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(99, 3.38)));
1036 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 1.55)));  // pronounced step
1037 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 1.5)));
1038 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 1.45)));
1039 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 1.42)));
1040 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(300, 1.40)));
1041 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(350, 1.41)));
1042 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(400, 1.32)));
1043 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(450, 1.39)));
1044 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(470, 1.25)));
1045 
1046 //    readModeNumber = 0;
1047 //    readModeName = "Standard";
1048 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1049 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1050 //                                           *aCameraGainReadNoiseVector)));
1051 
1052 //    gainSelection = new QVector<int>( { 0, 470 } );
1053 
1054 //    // qCInfo(KSTARS_EKOS_CAPTURE) << "aCameraGainReadNoiseVector size: " << aCameraGainReadNoiseVector->size();
1055 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_MONOCHROME,
1056 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1057 //    anImagingCameraData->setDataClassVersion(1);
1058 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1059 
1060 //    cameraId = "ZWO CCD ASI1600MM";
1061 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1062 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 3.62)));
1063 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 2.5)));
1064 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 1.85)));
1065 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 1.72)));
1066 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 1.40)));
1067 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 1.32)));
1068 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(300, 1.30)));
1069 
1070 //    readModeNumber = 0;
1071 //    readModeName = "Standard";
1072 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1073 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1074 //                                           *aCameraGainReadNoiseVector)));
1075 
1076 
1077 //    gainSelection = new QVector<int>( { 0, 300 } );
1078 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_MONOCHROME,
1079 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1080 //    anImagingCameraData->setDataClassVersion(1);
1081 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1082 
1083 
1084 //    cameraId = "ZWO CCD ASI224MC";
1085 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1086 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 3.09)));
1087 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(20, 2.71)));
1088 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(59, 2.26)));
1089 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(60, 1.6)));    // pronounced step
1090 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(70, 1.54)));
1091 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 1.34)));
1092 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 1.14)));
1093 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 0.93)));
1094 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(300, 0.86)));
1095 
1096 //    readModeNumber = 0;
1097 //    readModeName = "Standard";
1098 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1099 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1100 //                                           *aCameraGainReadNoiseVector)));
1101 
1102 
1103 //    gainSelection = new QVector<int>( { 0, 300 } );
1104 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_COLOR,
1105 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1106 //    anImagingCameraData->setDataClassVersion(1);
1107 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1108 
1109 //    cameraId = "ZWO CCD ASI120MC";  // formerly "ZWOASI-120MC" but now assuming a standard naming convention from ZWO
1110 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1111 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 6.35)));
1112 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(10, 6.41)));
1113 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(15, 6.5)));
1114 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(16, 4.63))); // pronounced step
1115 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(20, 4.67))); // a rise after the step down
1116 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(31, 4.7)));  // another step
1117 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(32, 3.87)));
1118 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(47, 3.95))); // rise after the step down
1119 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(48, 3.7)));
1120 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(63, 3.68))); // another step
1121 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(64, 3.54)));
1122 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(75, 3.66))); // rise after a step down
1123 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(87, 3.62)));
1124 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 3.62)));
1125 
1126 //    readModeNumber = 0;
1127 //    readModeName = "Standard";
1128 
1129 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1130 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1131 //                                           *aCameraGainReadNoiseVector)));
1132 
1133 
1134 //    gainSelection = new QVector<int>( { 0, 100 } );
1135 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_COLOR,
1136 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1137 //    anImagingCameraData->setDataClassVersion(1);
1138 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1139 
1140 //    cameraId = "ZWO CCD ASI183MC Pro";  // (The same read-noise is used in both Mono and Color)
1141 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1142 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 3.00)));
1143 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 2.6)));
1144 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 2.22)));
1145 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 2.02)));
1146 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 1.84)));
1147 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 1.75)));
1148 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(270, 1.68)));
1149 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(300, 1.58)));
1150 
1151 //    readModeNumber = 0;
1152 //    readModeName = "Standard";
1153 
1154 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1155 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1156 //                                           *aCameraGainReadNoiseVector)));
1157 
1158 
1159 //    gainSelection = new QVector<int>( { 0, 300 } );
1160 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_COLOR,
1161 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1162 //    anImagingCameraData->setDataClassVersion(1);
1163 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1164 
1165 //    cameraId = "ZWO CCD ASI183MM Pro";  // The same read-noise is used in both Mono and Color
1166 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1167 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 3.00)));
1168 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 2.6)));
1169 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 2.22)));
1170 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 2.02)));
1171 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 1.84)));
1172 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 1.75)));
1173 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(270, 1.68)));
1174 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(300, 1.58)));
1175 
1176 //    readModeNumber = 0;
1177 //    readModeName = "Standard";
1178 
1179 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1180 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1181 //                                           *aCameraGainReadNoiseVector)));
1182 
1183 
1184 //    gainSelection = new QVector<int>( { 0, 300 } );
1185 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_MONOCHROME,
1186 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1187 //    anImagingCameraData->setDataClassVersion(1);
1188 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1189 
1190 
1191 
1192 //    cameraId = "ZWO CCD ASI2600MM Pro"; // formerly "ZWOASI-2600MM" but now assuming a standard naming convention from ZWO
1193 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1194 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 3.28)));
1195 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 3.06)));
1196 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(99, 2.88)));
1197 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 1.46)));
1198 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 1.42)));
1199 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 1.42)));
1200 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 1.35)));
1201 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(300, 1.35)));
1202 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(350, 1.25)));
1203 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(400, 1.17)));
1204 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(450, 1.11)));
1205 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(460, 1.03)));
1206 
1207 //    readModeNumber = 0;
1208 //    readModeName = "Standard";
1209 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1210 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1211 //                                           *aCameraGainReadNoiseVector)));
1212 
1213 
1214 //    gainSelection = new QVector<int>( { 0, 460 } );
1215 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_MONOCHROME,
1216 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1217 //    anImagingCameraData->setDataClassVersion(1);
1218 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1219 
1220 
1221 
1222 //    cameraId = "ZWO CCD ASI290MM Mini"; //
1223 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1224 
1225 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 3.23)));
1226 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 2.66)));
1227 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(59, 2.62)));
1228 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(60, 1.66)));
1229 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 1.45)));
1230 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(150, 1.29)));
1231 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 1.13)));
1232 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(250, 1.11)));
1233 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(300, 1.01)));
1234 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(350, 0.96)));
1235 
1236 //    readModeNumber = 0;
1237 //    readModeName = "Standard";
1238 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1239 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1240 //                                           *aCameraGainReadNoiseVector)));
1241 
1242 
1243 //    gainSelection = new QVector<int>( { 0, 350 } );
1244 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_MONOCHROME,
1245 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1246 //    anImagingCameraData->setDataClassVersion(1);
1247 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1248 
1249 
1250 
1251 
1252 
1253 
1254 
1255 
1256 //    cameraId = "QHY CCD 533M";  // Assuming the QHY cameraId appear similar to ZWO
1257 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1258 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 3.34)));
1259 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(5, 3.3)));
1260 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(10, 3.32)));
1261 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(15, 3.4)));
1262 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(20, 3.3)));
1263 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(25, 3.22)));
1264 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(30, 3.19)));
1265 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(35, 3.09)));
1266 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(40, 3.18)));
1267 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(45, 3.12)));
1268 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(50, 3.05)));
1269 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(55, 2.93)));
1270 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(60, 1.66))); // pronounced step
1271 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(65, 1.6)));
1272 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(70, 1.56)));
1273 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(75, 1.54)));
1274 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(80, 1.51)));
1275 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(85, 1.45)));
1276 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(90, 1.4)));
1277 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(95, 1.34)));
1278 
1279 //    readModeNumber = 0;
1280 //    readModeName = "Standard";
1281 
1282 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1283 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1284 //                                           *aCameraGainReadNoiseVector)));
1285 
1286 
1287 //    gainSelection = new QVector<int>( { 0, 95 } );
1288 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_MONOCHROME,
1289 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1290 //    anImagingCameraData->setDataClassVersion(1);
1291 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1292 
1293 
1294 
1295 //    cameraId = "MI CCD C3"; // Not sure how Moravian cameras appear on USB or KStars, need research.
1296 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1297 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(0, 3.51)));
1298 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(2749, 3.15)));
1299 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(2750, 1.46)));
1300 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(4030, 1.39)));
1301 
1302 //    readModeNumber = 0;
1303 //    readModeName = "Standard";
1304 
1305 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1306 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1307 //                                           *aCameraGainReadNoiseVector)));
1308 
1309 //    gainSelection = new QVector<int>( { 0, 4030 } );
1310 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_MONOCHROME,
1311 //            OptimalExposure::GAIN_SELECTION_TYPE_NORMAL, *gainSelection, *aCameraGainReadModeVector);
1312 //    anImagingCameraData->setDataClassVersion(1);
1313 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1314 
1315 
1316 //    // DSLR Read-noise for ISO values data found at:   https://www.photonstophotos.net/Charts/RN_e.htm
1317 
1318 //    // For a Nikon D5000 usb id reads "Nikon Corp. D5000", Kstars shows "Nikon DSLR DSC D5000 (PTP mode)"
1319 //    cameraId = "Nikon DSLR DSC D5000 (PTP mode)";
1320 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1321 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 7.727)));  // log2 value 2.95
1322 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(126, 7.674)));  // log2 value 2.94
1323 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(159, 7.727)));  // log2 value 2.95
1324 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 6.320)));  // log2 value 2.36)
1325 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(251, 5.134)));  // log2 value 2.36)
1326 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(318, 5.169)));  // log2 value 2.37
1327 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(400, 4.532)));  // log2 value 2.18
1328 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(503, 4.79)));  // log2 value 2.26
1329 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(636, 5.169)));  // log2 value 2.37
1330 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(800, 4.925)));  // log2 value 2.3
1331 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(1006, 4.891)));  // log2 value 2.29
1332 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(1273, 4.724)));  // log2 value 2.24
1333 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(1600, 4.5)));  // log2 value 2.17
1334 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(2011, 4.028)));  // log2 value 2.01
1335 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(2546, 3.34)));  // log2 value 1.74
1336 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(3200, 2.969)));  // log2 value 1.57
1337 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(4022, 2.828)));  // log2 value 1.5
1338 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(5091, 2.789)));  // log2 value 1.48
1339 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(6400, 2.732)));  // log2 value 1.45
1340 
1341 //    readModeNumber = 0;
1342 //    readModeName = "Standard";
1343 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1344 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1345 //                                           *aCameraGainReadNoiseVector)));
1346 
1347 
1348 //    //  Unfortunately this data from www.photonstophotos.net does not align precisely with the discrete values for the ISO in the camera.
1349 //    //  So, the proof of concept code, which needs a list of iso values will use an array from the file.
1350 //    //  The following array would likely come from Ekos with getActiveChip()->getISOList() ?
1351 
1352 //    gainSelection = new QVector<int>( { 100, 125, 160, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400 } );
1353 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_COLOR,
1354 //            OptimalExposure::GAIN_SELECTION_TYPE_ISO_DISCRETE, *gainSelection, *aCameraGainReadModeVector);
1355 //    anImagingCameraData->setDataClassVersion(1);
1356 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1357 
1358 
1359 //    // Driver id is "Canon DSLR"
1360 //    cameraId = "Canon DSLR EOS Ra";  // Not sure how Canon cameras appear on USB, or KStars need research.
1361 
1362 //    aCameraGainReadNoiseVector = new QVector<OptimalExposure::CameraGainReadNoise>();
1363 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(100, 9.063))); // log2 value 3.18
1364 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(126, 10.2)));
1365 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(159, 5.58)));
1366 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(200, 4.96)));
1367 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(251, 5.46)));
1368 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(318, 3.14)));
1369 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(400, 3.18)));
1370 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(503, 3.34)));
1371 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(636, 2.41)));
1372 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(800, 2.41)));
1373 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(1006, 2.48)));
1374 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(1273, 1.92)));
1375 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(1600, 1.91)));
1376 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(2011, 1.91)));
1377 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(2546, 1.65)));
1378 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(3200, 1.67)));
1379 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(4022, 1.68)));
1380 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(5091, 1.4)));
1381 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(6400, 1.38)));
1382 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(8045, 1.36)));
1383 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(10183, 1.38)));
1384 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(12800, 1.38)));
1385 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(16090, 1.38)));
1386 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(20366, 1.34)));
1387 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(25600, 1.33)));
1388 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(32180, 1.35)));
1389 //    aCameraGainReadNoiseVector->push_back(*(new OptimalExposure::CameraGainReadNoise(40731, 1.34)));
1390 
1391 
1392 //    readModeNumber = 0;
1393 //    readModeName = "Standard";
1394 
1395 //    aCameraGainReadModeVector = new QVector<OptimalExposure::CameraGainReadMode>();
1396 //    aCameraGainReadModeVector->push_back(*(new OptimalExposure::CameraGainReadMode(readModeNumber, readModeName,
1397 //                                           *aCameraGainReadNoiseVector)));
1398 
1399 //    gainSelection = new QVector<int>( { 100, 125, 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 8000, 10200, 12800, 16000, 20400, 25600, 32000, 40000  } );
1400 
1401 //    anImagingCameraData = new OptimalExposure::ImagingCameraData(cameraId, OptimalExposure::SENSORTYPE_COLOR,
1402 //            OptimalExposure::GAIN_SELECTION_TYPE_ISO_DISCRETE, *gainSelection, *aCameraGainReadModeVector);
1403 //    anImagingCameraData->setDataClassVersion(1);
1404 //    OptimalExposure::FileUtilityCameraData::writeCameraDataFile(anImagingCameraData);
1405 
1406 
1407 
1408 //}
1409