Changeset 27597 for trunk/psModules
- Timestamp:
- Apr 5, 2010, 10:34:47 AM (16 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/detrend/pmDark.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/detrend/pmDark.c
r24869 r27597 38 38 if (!item) { 39 39 pmChip *chip = cell->parent; // Parent chip 40 psAssert(chip, "cell is missing chip \n");40 psAssert(chip, "cell is missing chip \n"); 41 41 42 42 item = psMetadataLookup(chip->concepts, name); 43 43 if (!item) { 44 44 pmFPA *fpa = chip->parent; // Parent FPA 45 psAssert(fpa, "chip is missing fpa \n");45 psAssert(fpa, "chip is missing fpa \n"); 46 46 47 47 item = psMetadataLookup(fpa->concepts, name); … … 68 68 69 69 psArray *words = psStringSplitArray(rule, " ", false); 70 70 71 71 // we should have a rule of the form (concept) OP (concept) OP (concept) ... 72 72 // for now, the only allowed OP is * (eventually, we can steal code from opihi for a better … … 74 74 75 75 if (words->n % 2 == 0) { 76 psError(PM_ERR_CONFIG, true, "syntax error in DARK.ORDINATE %s rule %s\n", name, rule);77 psFree(words);78 return false;76 psError(PM_ERR_CONFIG, true, "syntax error in DARK.ORDINATE %s rule %s\n", name, rule); 77 psFree(words); 78 return false; 79 79 } 80 80 81 81 for (int i = 1; i < words->n; i+=2) { 82 if (strcmp((char *)words->data[i], "*")) {83 psError(PM_ERR_CONFIG, true, "syntax error in DARK.ORDINATE %s rule %s\n", name, rule);84 psFree(words);85 return false;86 }87 } 88 82 if (strcmp((char *)words->data[i], "*")) { 83 psError(PM_ERR_CONFIG, true, "syntax error in DARK.ORDINATE %s rule %s\n", name, rule); 84 psFree(words); 85 return false; 86 } 87 } 88 89 89 if (!ordinateParseConcept(value, readout, words->data[0])) { 90 psError(PM_ERR_CONFIG, false, "syntax error in DARK.ORDINATE %s rule %s\n", name, rule);91 psFree(words);92 return false;90 psError(PM_ERR_CONFIG, false, "syntax error in DARK.ORDINATE %s rule %s\n", name, rule); 91 psFree(words); 92 return false; 93 93 } 94 94 95 95 double value2 = 0.0; 96 96 for (int i = 2; i < words->n; i+=2) { 97 if (!ordinateParseConcept(&value2, readout, words->data[i])) {98 psError(PM_ERR_CONFIG, false, "syntax error in DARK.ORDINATE %s rule %s\n", name, rule);99 psFree(words);100 return false;101 }102 *value *= value2;97 if (!ordinateParseConcept(&value2, readout, words->data[i])) { 98 psError(PM_ERR_CONFIG, false, "syntax error in DARK.ORDINATE %s rule %s\n", name, rule); 99 psFree(words); 100 return false; 101 } 102 *value *= value2; 103 103 } 104 104 psFree(words); … … 123 123 124 124 if (rule) { 125 if (!ordinateParseRule(value, readout, name, rule)) {126 psError(PM_ERR_CONFIG, false, "trouble parsing rule %s for DARK.ORDINATE %s", rule, name);127 return false;128 }125 if (!ordinateParseRule(value, readout, name, rule)) { 126 psError(PM_ERR_CONFIG, false, "trouble parsing rule %s for DARK.ORDINATE %s", rule, name); 127 return false; 128 } 129 129 } else { 130 if (!ordinateParseConcept(value, readout, name)) {131 psError(PM_ERR_CONFIG, false, "trouble parsing rule %s for DARK.ORDINATE %s", rule, name);132 return false;133 }130 if (!ordinateParseConcept(value, readout, name)) { 131 psError(PM_ERR_CONFIG, false, "trouble parsing rule %s for DARK.ORDINATE %s", rule, name); 132 return false; 133 } 134 134 } 135 135 … … 188 188 double normValue; // Normalisation value 189 189 if (!ordinateLookup(&normValue, &inRange, normConcept, NULL, false, NAN, NAN, readout)) { 190 psError(PM_ERR_CONFIG, false, "problem finding concept %s for DARK.NORM", normConcept);191 return false;192 }193 if (!isfinite(normValue)) {190 psError(PM_ERR_CONFIG, false, "problem finding concept %s for DARK.NORM", normConcept); 191 return false; 192 } 193 if (!isfinite(normValue)) { 194 194 psWarning("Unable to find acceptable value of %s for readout %d", normConcept, i); 195 195 roMask->data.PS_TYPE_VECTOR_MASK_DATA[i] = 0xff; … … 231 231 double value = NAN; // Value of ordinate 232 232 if (!ordinateLookup(&value, &inRange, ord->name, ord->rule, ord->scale, ord->min, ord->max, readout)) { 233 psError(PM_ERR_CONFIG, false, "problem finding rule for DARK.ORDINATE %s", ord->name);234 return false;235 }236 if (!isfinite(value)) {237 psWarning("Unable to find acceptable value of DARK.ORDINATE %s for readout %d", ord->name, i);233 psError(PM_ERR_CONFIG, false, "problem finding rule for DARK.ORDINATE %s", ord->name); 234 return false; 235 } 236 if (!isfinite(value)) { 237 psWarning("Unable to find acceptable value of DARK.ORDINATE %s for readout %d", ord->name, i); 238 238 roMask->data.PS_TYPE_VECTOR_MASK_DATA[j] = 0xff; 239 239 val->data.F32[i] = NAN; … … 242 242 } 243 243 if (!inRange) { 244 psWarning("Value of DARK.ORDINATE %s for readout %d is out of range", ord->name, i);244 psWarning("Value of DARK.ORDINATE %s for readout %d is out of range", ord->name, i); 245 245 roMask->data.PS_TYPE_VECTOR_MASK_DATA[j] = 0xff; 246 246 val->data.F32[i] = NAN; … … 349 349 PS_ASSERT_INT_NONNEGATIVE(iter, false); 350 350 PS_ASSERT_FLOAT_LARGER_THAN(rej, 0.0, false); 351 352 pthread_t id = pthread_self();353 char name[64];354 sprintf (name, "%x", (unsigned int) id);355 psTimerStart (name);356 351 357 352 bool mdok = false; … … 433 428 } 434 429 435 pmDarkVisualPixelFit(pixels, mask);436 pmDarkVisualPixelModel(poly, values);430 pmDarkVisualPixelFit(pixels, mask); 431 pmDarkVisualPixelModel(poly, values); 437 432 438 433 for (int k = 0; k < poly->coeff->n; k++) { … … 537 532 return false; 538 533 } 539 if (!isfinite(value)) {534 if (!isfinite(value)) { 540 535 psError(PS_ERR_UNKNOWN, true, "Value for DARK.ORDINATE %s is NAN", ord->name); 541 536 psFree(values); 542 537 return false; 543 }538 } 544 539 values->data.F32[i] = value; 545 540 } … … 792 787 psMetadataAddStr(row, PS_LIST_TAIL, PM_DARK_FITS_NAME, 0, "DARK.ORDINATE name", ord->name); 793 788 794 // XXX write a dummy value if ord->rule == NULL? (eg, NONE)795 if (ord->rule) {796 psMetadataAddStr(row, PS_LIST_TAIL, PM_DARK_FITS_RULE, 0, "DARK.ORDINATE rule", ord->rule);797 } else {798 psMetadataAddStr(row, PS_LIST_TAIL, PM_DARK_FITS_RULE, 0, "DARK.ORDINATE rule", "NONE");799 }789 // XXX write a dummy value if ord->rule == NULL? (eg, NONE) 790 if (ord->rule) { 791 psMetadataAddStr(row, PS_LIST_TAIL, PM_DARK_FITS_RULE, 0, "DARK.ORDINATE rule", ord->rule); 792 } else { 793 psMetadataAddStr(row, PS_LIST_TAIL, PM_DARK_FITS_RULE, 0, "DARK.ORDINATE rule", "NONE"); 794 } 800 795 801 796 psMetadataAddS32(row, PS_LIST_TAIL, PM_DARK_FITS_ORDER, 0, "Polynomial order", ord->order); … … 975 970 ord->max = psMetadataLookupF32(NULL, row, PM_DARK_FITS_MAX); 976 971 977 // load the ordinate rule; it is not an error if this field is missing or NULL978 // a NULL rule means 'use the name as the single concept'972 // load the ordinate rule; it is not an error if this field is missing or NULL 973 // a NULL rule means 'use the name as the single concept' 979 974 const char *rule = psMetadataLookupStr(&mdok, row, PM_DARK_FITS_RULE); 980 if (!rule || !strcasecmp(rule, "NONE")) {981 ord->rule = NULL;982 } else {983 ord->rule = psStringCopy(rule);984 }975 if (!rule || !strcasecmp(rule, "NONE")) { 976 ord->rule = NULL; 977 } else { 978 ord->rule = psStringCopy(rule); 979 } 985 980 ordinates->data[i] = ord; 986 981 } … … 1009 1004 // this init function only gets the ordinates for the first readout... 1010 1005 bool pmDarkVisualInit(psArray *values) { 1011 1006 1012 1007 if (!pmVisualIsVisual()) return true; 1013 1008 … … 1018 1013 int nOrders = 0; 1019 1014 for (int i = 0; i < values->n; i++) { 1020 psVector *vect = values->data[i];1021 if (!nOrders) {1022 nOrders = vect->n;1023 } else {1024 psAssert (nOrders == vect->n, "mismatch in order vector lengths");1025 }1015 psVector *vect = values->data[i]; 1016 if (!nOrders) { 1017 nOrders = vect->n; 1018 } else { 1019 psAssert (nOrders == vect->n, "mismatch in order vector lengths"); 1020 } 1026 1021 } 1027 1022 xVectors = psArrayAlloc(nOrders); 1028 1023 for (int i = 0; i < nOrders; i++) { 1029 xVectors->data[i] = psVectorAlloc(values->n, PS_TYPE_F32);1024 xVectors->data[i] = psVectorAlloc(values->n, PS_TYPE_F32); 1030 1025 } 1031 1026 1032 1027 for (int i = 0; i < values->n; i++) { 1033 psVector *vect = values->data[i];1034 for (int j = 0; j < vect->n; j++) {1035 psVector *xVec = xVectors->data[j];1036 xVec->data.F32[i] = vect->data.F32[j];1037 }1028 psVector *vect = values->data[i]; 1029 for (int j = 0; j < vect->n; j++) { 1030 psVector *xVec = xVectors->data[j]; 1031 xVec->data.F32[i] = vect->data.F32[j]; 1032 } 1038 1033 } 1039 1034 … … 1041 1036 1042 1037 kapa = psAlloc(nKapa*sizeof(int)); 1043 1038 1044 1039 for (int i = 0; i < nKapa; i++) { 1045 kapa[i] = -1;1046 pmVisualInitWindow(&kapa[i], "ppmerge");1040 kapa[i] = -1; 1041 pmVisualInitWindow(&kapa[i], "ppmerge"); 1047 1042 } 1048 1043 return true; … … 1063 1058 1064 1059 for (int i = 0; i < xVectors->n; i++) { 1065 psVector *x = xVectors->data[i];1066 1067 // generate vectors of the unmasked values1068 int nSub = 0;1069 for (int j = 0; j < pixels->n; j++) {1070 if (mask && mask->data.PS_TYPE_VECTOR_MASK_DATA[j]) continue;1071 xSub->data.F32[nSub] = x->data.F32[j];1072 ySub->data.F32[nSub] = pixels->data.F32[j];1073 nSub ++;1074 }1075 xSub->n = ySub->n = nSub;1076 1077 // plot the unmasked values1078 pmVisualScaleGraphdata (&graphdata, xSub, ySub, false);1079 KapaSetGraphData(kapa[i], &graphdata);1080 KapaSetLimits(kapa[i], &graphdata);1081 KapaClearPlots (kapa[i]);1082 1083 KapaSetFont (kapa[i], "courier", 14);1084 KapaBox (kapa[i], &graphdata);1085 KapaSendLabel (kapa[i], "ordinate", KAPA_LABEL_XM);1086 KapaSendLabel (kapa[i], "pixel values", KAPA_LABEL_YM);1087 1088 graphdata.color = KapaColorByName("black");1089 graphdata.style = 2;1090 graphdata.ptype = 2;1091 KapaPrepPlot (kapa[i], xSub->n, &graphdata);1092 KapaPlotVector(kapa[i], xSub->n, xSub->data.F32, "x");1093 KapaPlotVector(kapa[i], xSub->n, ySub->data.F32, "y");1060 psVector *x = xVectors->data[i]; 1061 1062 // generate vectors of the unmasked values 1063 int nSub = 0; 1064 for (int j = 0; j < pixels->n; j++) { 1065 if (mask && mask->data.PS_TYPE_VECTOR_MASK_DATA[j]) continue; 1066 xSub->data.F32[nSub] = x->data.F32[j]; 1067 ySub->data.F32[nSub] = pixels->data.F32[j]; 1068 nSub ++; 1069 } 1070 xSub->n = ySub->n = nSub; 1071 1072 // plot the unmasked values 1073 pmVisualScaleGraphdata (&graphdata, xSub, ySub, false); 1074 KapaSetGraphData(kapa[i], &graphdata); 1075 KapaSetLimits(kapa[i], &graphdata); 1076 KapaClearPlots (kapa[i]); 1077 1078 KapaSetFont (kapa[i], "courier", 14); 1079 KapaBox (kapa[i], &graphdata); 1080 KapaSendLabel (kapa[i], "ordinate", KAPA_LABEL_XM); 1081 KapaSendLabel (kapa[i], "pixel values", KAPA_LABEL_YM); 1082 1083 graphdata.color = KapaColorByName("black"); 1084 graphdata.style = 2; 1085 graphdata.ptype = 2; 1086 KapaPrepPlot (kapa[i], xSub->n, &graphdata); 1087 KapaPlotVector(kapa[i], xSub->n, xSub->data.F32, "x"); 1088 KapaPlotVector(kapa[i], xSub->n, ySub->data.F32, "y"); 1094 1089 } 1095 1090 pmVisualAskUser (&plotFlag); … … 1110 1105 1111 1106 for (int i = 0; i < values->n; i++) { 1112 psVector *coord = values->data[i];1113 yFit->data.F32[i] = psPolynomialMDEval (poly, coord);1107 psVector *coord = values->data[i]; 1108 yFit->data.F32[i] = psPolynomialMDEval (poly, coord); 1114 1109 } 1115 1110 1116 1111 for (int i = 0; i < xVectors->n; i++) { 1117 psVector *xFit = xVectors->data[i];1118 1119 KapaGetGraphData(kapa[i], &graphdata);1120 graphdata.color = KapaColorByName("red");1121 graphdata.style = 2;1122 graphdata.ptype = 7;1123 KapaPrepPlot (kapa[i], xFit->n, &graphdata);1124 KapaPlotVector(kapa[i], xFit->n, xFit->data.F32, "x");1125 KapaPlotVector(kapa[i], xFit->n, yFit->data.F32, "y");1112 psVector *xFit = xVectors->data[i]; 1113 1114 KapaGetGraphData(kapa[i], &graphdata); 1115 graphdata.color = KapaColorByName("red"); 1116 graphdata.style = 2; 1117 graphdata.ptype = 7; 1118 KapaPrepPlot (kapa[i], xFit->n, &graphdata); 1119 KapaPlotVector(kapa[i], xFit->n, xFit->data.F32, "x"); 1120 KapaPlotVector(kapa[i], xFit->n, yFit->data.F32, "y"); 1126 1121 } 1127 1122 pmVisualAskUser (&plotFlag); … … 1132 1127 1133 1128 for (int i = 0; i < nKapa; i++) { 1134 KapaClose(kapa[i]);1129 KapaClose(kapa[i]); 1135 1130 } 1136 1131 psFree (kapa);
Note:
See TracChangeset
for help on using the changeset viewer.
