22 #include "HiCalConf.h"
23 #include "HiCalUtil.h"
25 #include "IException.h"
27 #include "SpecialPixel.h"
28 #include "NaifStatus.h"
34 bool HiCalConf::_naifLoaded =
false;
39 HiCalConf::HiCalConf() : DbAccess() {
49 HiCalConf::HiCalConf(Pvl &label) : DbAccess() {
60 HiCalConf::HiCalConf(Pvl &label,
const QString &conf) :
61 DbAccess(Pvl(filepath(conf)).findObject(
"Hical", PvlObject::Traverse)) {
71 void HiCalConf::setLabel(Pvl &label) {
88 QString HiCalConf::filepath(
const QString &fname)
const {
89 FileName efile(fname);
90 if (efile.isVersioned()) {
91 QString path(efile.originalPath());
92 if (!path.isEmpty()) path +=
"/";
94 efile = efile.highestVersion();
96 return (path + efile.name());
111 void HiCalConf::setConf(
const QString &conf) {
124 void HiCalConf::selectProfile(
const QString &profile) {
136 QString HiCalConf::getProfileName()
const {
153 QString HiCalConf::getMatrixSource(
const QString &name)
const {
154 return (getMatrixSource(name, getMatrixProfile()));
171 QString HiCalConf::getMatrixSource(
const QString &name,
172 const DbProfile &matconf)
const {
174 QString mfile = parser(matconf.value(name),
175 getList(matconf,
"OptionKeywords"),
179 return (filepath(mfile));
182 HiVector HiCalConf::getMatrix(
const QString &name,
183 int expected_size)
const {
184 return (getMatrix(name,getMatrixProfile(), expected_size));
188 QString HiCalConf::resolve(
const QString &composite,
189 const DbProfile &matconf)
const {
190 return (parser(composite,getList(matconf,
"OptionKeywords"), matconf));
218 HiVector HiCalConf::getMatrix(
const QString &name,
219 const DbProfile &profile,
220 int expected_size)
const {
222 QString mfile = getMatrixSource(name, profile);
229 if (expected_size != 0) {
230 if (cube.sampleCount() != expected_size) {
232 mess <<
"Specifed matrix (" << name
233 <<
") from file \"" << mfile
234 <<
"\" does not have expected samples (" << expected_size
235 <<
") but has " << cube.sampleCount();
242 Brick bandio(cube.sampleCount(), 1, 1, Real);
243 bandio.SetBasePosition(1,1,getMatrixBand(profile));
247 HiVector temp(cube.sampleCount(), bandio.DoubleBuffer());
268 HiVector HiCalConf::getScalar(
const QString &name,
269 const DbProfile &profile,
270 int expected_size)
const {
271 int nvals = profile.count(name);
274 if (expected_size != 0) {
275 if (nvals != expected_size) {
277 mess <<
"Specifed scalar (" << name
278 <<
") does not have expected size (" << expected_size
279 <<
") but has " << nvals;
285 for (
int i = 0 ; i < nvals ; i++) {
286 mtx[i] =
ToDouble(profile(name, i));
299 double HiCalConf::sunDistanceAU(Cube *cube) {
303 cam = cube->camera();
304 cam->SetImage(0.5, 0.5);
305 sunkm = cam->sunToBodyDist();
308 catch (IException &e) {
312 QString scStartTime = getKey(
"SpacecraftClockStartCount",
"Instrument");
315 scs2e_c (-74999,scStartTime.toLatin1().data(),&obsStartTime);
317 QString targetName = getKey(
"TargetName",
"Instrument");
318 if (targetName.toLower() ==
"sky" ||
319 targetName.toLower() ==
"cal" ||
320 targetName.toLower() ==
"phobos" ||
321 targetName.toLower() ==
"deimos") {
326 (void) spkpos_c(targetName.toLatin1().data(), obsStartTime,
"J2000",
"LT+S",
"sun",
328 sunkm = vnorm_c(sunv);
332 catch(IException &e) {
333 QString msg =
"Unable to determine the distance from the target to the sun";
339 return (sunkm/1.49597870691E8);
357 int HiCalConf::getMatrixBand()
const {
359 DbProfile parms = makeParameters(label);
360 return (getMatrixBand(parms));
376 int HiCalConf::getMatrixBand(
const DbProfile &p)
const {
392 HiCalConf::ValueList HiCalConf::getList(
const DbProfile &profile,
393 const QString &key)
const {
397 if ( profile.exists(key) ) {
398 int nvals = profile.count(key);
399 for (
int i = 0 ; i < nvals ; i++) {
400 slist.push_back(profile.value(key, i));
412 void HiCalConf::loadNaifTiming( ) {
417 leapseconds = leapseconds.highestVersion();
419 Isis::FileName sclk(
"$mro/kernels/sclk/MRO_SCLKSCET.?????.65536.tsc");
420 sclk = sclk.highestVersion();
423 pck = pck.highestVersion();
426 sat = sat.highestVersion();
429 QString lsk = leapseconds.expanded();
430 QString sClock = sclk.expanded();
431 QString pConstants = pck.expanded();
432 QString satConstants = sat.expanded();
433 furnsh_c(lsk.toLatin1().data());
434 furnsh_c(sClock.toLatin1().data());
435 furnsh_c(pConstants.toLatin1().data());
436 furnsh_c(satConstants.toLatin1().data());
448 void HiCalConf::init() {
462 void HiCalConf::init(Pvl &label) {
479 PvlKeyword &HiCalConf::getKey(
const QString &key,
480 const QString &group) {
481 if (!group.isEmpty()) {
486 return (_label.findKeyword(key));
508 DbProfile HiCalConf::getMatrixProfile(
const QString &profile)
const {
509 QString myprof = (!profile.isEmpty()) ? profile : _profName;
510 DbProfile matconf = getProfile(myprof);
511 if (!matconf.isValid()) {
513 mess <<
"Specifed matrix profile (" << matconf.Name()
514 <<
") does not exist or is invalid!";
519 matconf = DbProfile(getLabelProfile(matconf), matconf, matconf.Name());
522 matconf = DbProfile(matconf, makeParameters(matconf), matconf.Name());
525 ValueList profkeys = getList(matconf,
"OptionKeywords");
526 ValueList proforder = getList(matconf,
"ProfileOptions");
527 QString pName(matconf.Name());
528 for (
unsigned int i = 0 ; i < proforder.size() ; i++) {
529 QString profile = parser(proforder[i], profkeys, matconf);
530 if (profileExists(profile)) {
531 pName +=
"+[" + profile +
"]";
532 matconf = DbProfile(matconf,getProfile(profile), pName);
539 DbProfile HiCalConf::getLabelProfile(
const DbProfile &profile)
const {
540 DbProfile lblprof(
"Label");
541 if ( profile.exists(
"LabelGroups") ) {
542 int ngroups = profile.count(
"LabelGroups");
544 for (
int g = 0 ; g < ngroups ; g++ ) {
545 QString group = profile(
"LabelGroups", g);
547 lblprof = DbProfile(lblprof,DbProfile(grp));
553 int HiCalConf::getChannelIndex(
const int &ccd,
const int &channel)
const {
554 return(1 + (ccd*2) + channel);
557 DbProfile HiCalConf::makeParameters(Pvl &label)
const {
558 PvlGroup inst = label.findGroup(
"Instrument",
Pvl::Traverse);
559 DbProfile parms(
"Parameters");
561 int ccd =
CpmmToCcd((
int) inst[
"CpmmNumber"]);
562 int channel = inst[
"ChannelNumber"];
564 parms.add(
"CHANNEL",
ToString(channel));
565 parms.add(
"TDI", inst[
"Tdi"]);
566 parms.add(
"BIN", inst[
"Summing"]);
568 parms.add(
"CCDCHANNELINDEX",
ToString(getChannelIndex(ccd, channel)));
572 DbProfile HiCalConf::makeParameters(
const DbProfile &profile)
const {
573 DbProfile parms(
"Parameters");
575 int channel =
ToInteger(profile(
"ChannelNumber"));
577 parms.add(
"CHANNEL",
ToString(channel));
578 parms.add(
"TDI", profile(
"Tdi"));
579 parms.add(
"BIN", profile(
"Summing"));
581 parms.add(
"CCDCHANNELINDEX",
ToString(getChannelIndex(ccd, channel)));
585 QString HiCalConf::makePattern(
const QString &str)
const {
586 return (QString(
"{" + str +
"}"));
600 QString HiCalConf::parser(
const QString &s,
const ValueList &vlist,
601 const DbProfile &prof)
const {
604 ValueList::const_iterator ciVlist;
605 for ( ciVlist = vlist.begin() ; ciVlist != vlist.end() ; ++ciVlist ) {
606 QString str(*ciVlist);
607 if ( prof.exists(str) ) {
608 sout = sout.replace(makePattern(str), prof(str));