OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
read_prism.c
Go to the documentation of this file.
1 /*
2  * l1_aviris.c
3  *
4  * Created on: May 18, 2015
5  * Author: Rick Healy SAIC
6  * NASA-GSFC OBPG
7  */
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
11 #include "timeutils.h"
12 #include "prism.h"
13 #include "jplaeriallib.h"
14 #include <math.h>
15 #include <genutils.h>
16 #include <libnav.h>
17 
18 #define SKIP -9999
19 #define MAXLINESZ 4290
20 
21 static const int maxBands = 285;
22 static double *lat, *lon;
23 
24 prism4ocia_t* createPrivateData_pr(int numBands, int32_t nscan, int32_t npix) {
25 
26  prism4ocia_t* data = (prism4ocia_t*) calloc(1, sizeof (prism4ocia_t));
27  if (data == NULL) {
28  fprintf(stderr, "-E- %s line %d: unable to allocate private data for prism\n",
29  __FILE__, __LINE__);
30  exit(1);
31  }
32 
33  data->wave = (double *) malloc(numBands * sizeof (double));
34  data->fwhm = (double *) malloc(numBands * sizeof (double));
35  data->gain = (double *) malloc(numBands * sizeof (double));
36  if (data->wave == NULL || data->fwhm == NULL || data->gain == NULL) {
37  fprintf(stderr, "-E- %s line %d: unable to allocate scale/offset data for prism\n",
38  __FILE__, __LINE__);
39  exit(1);
40  }
41 
42  return data;
43 }
44 
45 void freePrivateData_pr(prism4ocia_t* data) {
46  free(data->gain);
47  free(data->sena);
48  free(data->senz);
49  free(data->sola);
50  free(data->solz);
51  free(data->Lt);
52  free(data->lon);
53  free(data->lat);
54  free(data->utc);
55  gsl_interp_accel_free(data->spl_acc);
56 
57 }
58 
59 void prism_proj4_convert(prism4ocia_t * data, int numPoints, double *x, double *y) {
60  int i;
61  PJ_COORD c, c_out;
62 
63  // set default z and t
64  c.xyzt.z = 0.0;
65  c.xyzt.t = HUGE_VAL;
66 
67  for (i = 0; i < numPoints; i++) {
68  c.xy.x = x[i];
69  c.xy.y = y[i];
70  c_out = proj_trans(data->pj, PJ_FWD, c);
71  x[i] = c_out.xy.x;
72  y[i] = c_out.xy.y;
73  }
74 }
75 
76 prism4ocia_t *open_prism(char *filename, prism4ocia_t **data) {
77 
78  FILE *ptr;
79  char *val0;
80  char *inbasename, *infile;
81  int i, pos;
82  float tmp;
83  int numBands;
84  char* result;
85  char *line;
86  int year, month, day, hour, minute, second;
87  //float knts2mps = 0.51444444444; // knots to meters per second
88  float ft2m = 0.3048; // feet to meters
89  prism4ocia_t *temp;
90 
91  char projStr[1024];
92  static char *dupline;
93  int cnt, linelength, itmp;
94  char *iptr;
95 
96  temp = *data;
97  inbasename = getinbasename(filename);
98  pos = strlen(inbasename);
99  if (pos <= 0) {
100  fprintf(stderr, "-E- %s line %d: Not a avalid prism file %s\n",
101  __FILE__, __LINE__, filename);
102  exit(-1);
103  }
104 
105  cdata_(); // initialize global FORTRAN common block data for l_sun call
106 
107 
108  //prism4ocia_t* data = file->private_data = createPrivateData_pr(maxBands,file->nscan,file->npix);
109  *data = (prism4ocia_t*) malloc(sizeof (prism4ocia_t));
110  if (*data == NULL) {
111  fprintf(stderr, "-E- %s line %d: unable to allocate private data for Prism\n",
112  __FILE__, __LINE__);
113  exit(1);
114  }
115  line = (char *) malloc(MAXLINESZ * sizeof (char));
116  (*data)->wave = (double *) malloc(maxBands * sizeof (double));
117  (*data)->fwhm = (double *) malloc(maxBands * sizeof (double));
118  (*data)->gain = (double *) malloc(maxBands * sizeof (double));
119  if ((*data)->wave == NULL || (*data)->fwhm == NULL) {
120  fprintf(stderr, "-E- %s line %d: unable to allocate scale/offset data for aviris\n",
121  __FILE__, __LINE__);
122  exit(1);
123  }
124 
125  temp = *data;
126 
127  sscanf(inbasename, "prm%4d%2d%2dt%2d%2d%2d", &year, &month, &day, &hour, &minute, &second);
128 
129  temp->month = month;
130  temp->day = day;
131  temp->hour = hour;
132  temp->min = minute;
133  temp->sec = second;
134 
135  ymdhms2ydmsec(year, month, day, hour, minute, second,
136  &temp->year, &temp->doy, &temp->msec);
137 
138 
139  temp->stime = ymds2unix(year, month, day, hour * 3600.0 + minute * 60.0 + second);
140 
141  printf("Date of prism flight: %s\n", unix2isodate(temp->stime, 'G'));
142 
143  if ((ptr = fopen(filename, "r")) == NULL) {
144  fprintf(stderr, "-E- %s line %d: unable to open %s\n",
145  __FILE__, __LINE__, filename);
146  exit(-1);
147  }
148 
149  int numLinesNeeded = 1;
150  int numSamplesNeeded = 1;
151  int bandsNeeded = 1;
152  int utmZoneNeeded = 1;
153  int eastingNeeded = 1;
154  int northingNeeded = 1;
155  int pixelSizeNeeded = 1;
156  int interleaveNeeded = 1;
157  int rotationAngNeeded = 1;
158  int EndTimeNeeded = 1;
159  int altNeeded = 1;
160  int waveLengthNeeded = 1;
161  int fwhmNeeded = 1;
162 
163  // loop metadata
164  while (numLinesNeeded ||
165  numSamplesNeeded ||
166  bandsNeeded ||
167  pixelSizeNeeded ||
168  utmZoneNeeded ||
169  eastingNeeded ||
170  northingNeeded ||
171  rotationAngNeeded ||
172  EndTimeNeeded ||
173  altNeeded ||
174  waveLengthNeeded ||
175  fwhmNeeded ||
176  interleaveNeeded) {
177 
178  result = fgets(line, MAXLINESZ, ptr);
179  if (result == NULL) {
180  fprintf(stderr, "-E- %s line %d: unable to read all of the required metadata from prism file\n",
181  __FILE__, __LINE__);
182  exit(1);
183  }
184  trimBlanks(line);
185 
186  if ((itmp = checkTagLine_i(line, "lines")) && itmp > 0) {
187  numLinesNeeded = 0;
188  temp->nscan = itmp; //strtol(val0,&iptr,10);
189  printf("lines=%d\n", temp->nscan);
190  }
191  if ((itmp = checkTagLine_i(line, "samples")) && itmp > 0) {
192  numSamplesNeeded = 0;
193  temp->npix = itmp; //strtol(val0,&iptr,10);
194  printf("samples=%d\n", temp->npix);
195  }
196  if ((val0 = checkTagLine(line, "Alt"))) {
197  altNeeded = 0;
198  temp->alt = atof(val0) * ft2m;
199  printf("Altitude=%lf\n", temp->alt);
200  }
201  if ((val0 = checkTagLine(line, "EndTime"))) {
202  EndTimeNeeded = 0;
203  sscanf(val0, "%2d%2d", &hour, &minute);
204  printf("End hour=%d minute=%d\n", hour, minute);
205  temp->etime = ymds2unix(year, month, day, hour * 3600.0 + minute * 60.0);
206  printf("End Time=%s\n", unix2isodate(temp->etime, 'G'));
207  }
208  if ((itmp = checkTagLine_i(line, "bands")) && itmp > 0) {
209  bandsNeeded = 0;
210  numBands = itmp;
211  temp->numBands = numBands;
212  if (numBands > maxBands) {
213  fprintf(stderr, "-E- %s line %d: number of bands (%d) from prism file > maxBands (%d)\n",
214  __FILE__, __LINE__, numBands, maxBands);
215  exit(1);
216  }
217  printf("numBands=%d\n", temp->numBands);
218  }
219  if ((val0 = checkTagLine(line, "interleave"))) {
220  interleaveNeeded = 0;
221  if (strstr(val0, "bip")) {
222  temp->interleave = BIP;
223  } else if (strstr(val0, "bil")) {
224  temp->interleave = BIL;
225  } else {
226  fprintf(stderr, "Interleave = %s is not supported\n", val0);
227  exit(1);
228  }
229  printf("Interleave=%d\n", temp->interleave);
230  }
231  if ((val0 = checkTagLine(line, "wavelength ="))) {
232  waveLengthNeeded = 0;
233  i = 0;
234  result = strtok(line, "wavelength = {");
236  tmp = atof(result);
237 
238  while (i < maxBands && result) {
239  temp->wave[i] = 1000.0 * tmp;
240  printf("i=%d wave=%f\n", i, temp->wave[i]);
241  result = strtok(NULL, ",");
242  if (result) {
244  tmp = atof(result);
245  i++;
246  }
247  }
248 
249 
250  }
251  if ((val0 = checkTagLine(line, "fwhm"))) {
252  fwhmNeeded = 0;
253  i = 0;
254  result = strtok(line, "fwhm = {");
256  tmp = atof(result);
257 
258  while (i < maxBands && result) {
259  temp->fwhm[i] = 1000.0 * tmp;
260  printf("i=%d fwhm=%f\n", i, temp->fwhm[i]);
261  result = strtok(NULL, ",");
262  if (result) {
264  tmp = atof(result);
265  i++;
266  }
267  }
268  }
269  if ((val0 = checkTagLine(line, "map info"))) {
270  cnt = 0;
271  linelength = strlen(line);
272  if (dupline) free(dupline);
273  if ((dupline = (char *) malloc(linelength * sizeof (char))) == NULL) {
274  fprintf(stderr,
275  "-E- %s line %d: Memory allocation failure.\n",
276  __FILE__, __LINE__);
277  exit(-1);
278  }
279  strcpy(dupline, line);
280  result = strtok(dupline, ",");
281  while (result) {
282  switch (cnt) {
283  case 3:
284  temp->easting = atof(result);
285  eastingNeeded = 0;
286  break;
287  case 4:
288  temp->northing = atof(result);
289  northingNeeded = 0;
290  break;
291  case 5:
292  temp->pixelSize = atof(result);
293  pixelSizeNeeded = 0;
294  break;
295  case 7:
296  temp->utmZone = strtol(result, &iptr, 10);
297  utmZoneNeeded = 0;
298  break;
299  default:
300  break;
301  }
302  printf(">>%d) %s\n", cnt, result);
303  cnt++;
304  result = strtok(NULL, ",");
305  }
306  if ((val0 = checknspTagLine(line, "rotation"))) {
307  rotationAngNeeded = 0;
308  temp->rotation = atof(val0);
309  } else {
310  printf("Rotation angle expected in line: %s\n", val0);
311  exit(-1);
312  }
313  printf("Rotation/easting/northing/pixsize/utmzone=%f/%lf/%lf/%lf/%d\n", temp->rotation, temp->easting, temp->northing, temp->pixelSize, temp->utmZone);
314  }
315  // if((val0=checkTagLine(line,"map info"))) {
316  // sscanf(val0,"%*[^,], %*f, %*f, %lf, %lf, %lf, %lf, %d, %*[^,], %*[^,], %*[^,], %s}",&temp->easting,&temp->northing,&temp->pixelSize,&temp->pixelSize,&temp->utmZone,val1);
317  // if((val0=checknspTagLine(line,"rotation"))) {
318  // rotationAngNeeded = 0;
319  // rotation = atof(val0);
320  // if (rotation > 45)
321  // temp->eastbyscan = -1;
322  // else if (rotation < -45)
323  // temp->eastbyscan = 1;
324  // else
325  // temp->eastbyscan = 0;
326  // } else {
327  // printf("Rotation angle expected in line: %s\n",val0);
328  // exit(-1);
329  // }
330  // printf("Rotation/easting/northing/pixsize/utmzone=%f/%lf/%lf/%lf/%d\n",rotation,temp->easting,temp->northing,temp->pixelSize,temp->utmZone);
331  // pixelSizeNeeded = 0;
332  // northingNeeded = 0;
333  // eastingNeeded = 0;
334  // utmZoneNeeded = 0;
335  //
336  // }
337 
338 
339  }
340 
341  fclose(ptr);
342 
343 
344  // Get the sensor and solar temp
345 
346  temp->sena = (float *) malloc(temp->npix * sizeof (float));
347  temp->senz = (float *) malloc(temp->npix * sizeof (float));
348  temp->solz = (float *) malloc(temp->npix * sizeof (float));
349  temp->sola = (float *) malloc(temp->npix * sizeof (float));
350  temp->utc = (float *) malloc(temp->npix * sizeof (float));
351  temp->lon = (double *) malloc(temp->npix * sizeof (double));
352  temp->lat = (double *) malloc(temp->npix * sizeof (double));
353  temp->Lt = (float *) malloc(temp->numBands * temp->npix * sizeof (float));
354  if (temp->sena == NULL || temp->senz == NULL || temp->sola == NULL || temp->solz == NULL || temp->Lt == NULL || temp->lon == NULL || temp->lat == NULL) {
355  fprintf(stderr, "-E- %s line %d: unable to allocate sensor and solar angle data for AVIRIS\n",
356  __FILE__, __LINE__);
357  exit(1);
358  }
359 
360  for (i = 0; i < numBands; i++) {
361  temp->gain[i] = 1.0;
362  }
363 
364  // free(infile);
365  infile = malloc((pos + strlen("_rdn_ort")) * sizeof (char));
366  strcpy(infile, inbasename);
367  strcat(infile, "_rdn_ort");
368  printf("Opening prism image file %s\n", infile);
369 
370  if ((temp->av_fp = fopen(infile, "rb")) == NULL) {
371  fprintf(stderr, "-E- %s line %d: unable to open %s\n",
372  __FILE__, __LINE__, infile);
373  exit(-1);
374 
375  }
376 
377  PJ *pj;
378  // init the proj4 projections
379  sprintf(projStr, "+proj=utm +zone=%d +ellps=WGS84 +datum=WGS84 +units=m +no_defs ",
380  temp->utmZone);
381  pj = proj_create_crs_to_crs(PJ_DEFAULT_CTX,
382  projStr,
383  "+proj=longlat +ellps=WGS84 +datum=WGS84",
384  NULL);
385  if(pj == NULL) {
386  printf("Error - PRISM first PROJ projection failed to init\n");
387  exit(1);
388  }
389  temp->pj = proj_normalize_for_visualization(PJ_DEFAULT_CTX, pj);
390  if(temp->pj == NULL) {
391  printf("Error - PRISM visualization PROJ projection failed to init\n");
392  exit(1);
393  }
394  proj_destroy(pj);
395 
396  lat = (double *) malloc(temp->npix * sizeof (double));
397  lon = (double *) malloc(temp->npix * sizeof (double));
398 
399  return (temp);
400 }
401 
402 int read_prism(prism4ocia_t *data, int recnum)
403 /*
404  * fill standard record with L1B line of data
405  */ {
406 
407  double pos[3];
408  float epos[3], sunpos[3];
409  int16_t year, doy, month, day;
410  double secondOfDay;
411  float longitude, latitude, sunDist;
412  int i;
413  int npix = data->npix, ip;
414 
415 
416  // set information about data
417  npix = data->npix;
418 
419  // *(l1rec->year) = data->year;
420  // *(l1rec->day) = data->doy;
421  // *(l1rec->msec) = data->msec + (data->emsec - data->msec)*recnum/(data->nscan-1);
422  data->scantime = data->stime + (data->etime - data->stime) * recnum / (data->nscan - 1);
423  unix2ymds(data->scantime, &year, &month, &day, &secondOfDay);
424  data->year = year;
425  data->month = month;
426  data->day = day;
427  data->hour = secondOfDay / 3600;
428  data->min = (secondOfDay - data->hour * 3600) / 60;
429  data->sec = secondOfDay - data->hour * 3600 - data->min * 60;
430  // get lat-lon
431  for (ip = 0; ip < npix; ip++) {
432  //rotate pixel to project onto map
433  lon[ip] = data->easting + ip * cos(deg2rad(data->rotation)) * data->pixelSize + recnum * sin(deg2rad(data->rotation)) * data->pixelSize; // starts in upper left corner
434  lat[ip] = data->northing + ip * sin(deg2rad(data->rotation)) * data->pixelSize - recnum * cos(deg2rad(data->rotation)) * data->pixelSize;
435  }
436 
438 
439  if (lat[npix / 2] > SKIP)
440  latitude = lat[npix / 2];
441  else {
442  fprintf(stderr, "-E- %s line %d: Don't have sensor latitude for geometry calculation\n",
443  __FILE__, __LINE__);
444  exit(1);
445  }
446 
447  if (lon[npix / 2] > SKIP)
448  longitude = lon[npix / 2];
449  else {
450  fprintf(stderr, "-E- %s line %d: Don't have sensor longitude for geometry calculation\n",
451  __FILE__, __LINE__);
452  exit(1);
453  }
454 
455  getPosVec(latitude, longitude, data->alt, pos); // get position vector of sensor
456  unix2yds(data->scantime, &year, &doy, &secondOfDay);
457 
458  int32_t iyear, idoy;
459  iyear = (int32_t) year;
460  idoy = (int32_t) doy;
461  l_sun_(&iyear, &idoy, &secondOfDay, sunpos, &sunDist); // get position vector for the sun
462 
463  for (i = 0; i < 3; i++) {
464  sunpos[i] *= 1.496e8; //convert to km for call to get_zenaz
465  epos[i] = pos[i];
466  }
467 
468  for (ip = 0; ip < npix; ip++) {
469 
470 
471  if (isnan(lat[ip])) lat[ip] = SKIP;
472  if (isnan(lon[ip])) lon[ip] = SKIP;
473  data->lat[ip] = lat[ip];
474  data->lon[ip] = lon[ip];
475  //printf("ip=%d scan=%d lat=%f lon=%f\n",ip,recnum,lat[ip],lon[ip]);
476 
477 
478  get_zenaz(epos, lon[ip], lat[ip], &data->senz[ip], &data->sena[ip]);
479  get_zenaz(sunpos, lon[ip], lat[ip], &data->solz[ip], &data->sola[ip]);
480 
481  //printf("RJH: %d %d senz=%f sena=%f solz=%f sola=%f\n",recnum, ip, l1rec->senz[ip],l1rec->sena[ip], l1rec->solz[ip],l1rec->sola[ip]);
482 
483 
484  }
485 
486  readBinScanLine_float(data->Lt, recnum, data->npix, data->gain, data->numBands, data->numBands, data->interleave, 0, data->av_fp);
487 
488  return (0);
489 }
490 
491 void prism4ocia_proj4_convert(prism4ocia_t *data, int32_t numPoints, double *x, double *y) {
492  int i;
493  PJ_COORD c, c_out;
494 
495  // set default z and t
496  c.xyzt.z = 0.0;
497  c.xyzt.t = HUGE_VAL;
498 
499  for (i = 0; i < numPoints; i++) {
500  c.xy.x = x[i];
501  c.xy.y = y[i];
502  c_out = proj_trans(data->pj, PJ_FWD, c);
503  x[i] = c_out.xy.x;
504  y[i] = c_out.xy.y;
505  }
506 }
507 
508 int close_prism(prism4ocia_t* data) {
509 
510  // undo what open allocated
511 
513  free(data);
514 
515  return 0;
516 }
517 
518 float getValidOrcaAngle(float *ang, int32_t npix, int32_t skip, float *fillangle) {
519  int32_t i;
520  float angle = *fillangle;
521 
522  for (i = 0; i < npix && ang[i] <= skip; i++)
523  angle = ang[i];
524 
525  *fillangle = angle;
526  return (angle);
527 
528 }
529 
void trimBlanks(char *str)
Definition: trimBlanks.c:10
int read_prism(prism4ocia_t *data, int32_t recnum)
prism4ocia_t * createPrivateData_pr(int numBands, int32_t nscan, int32_t npix)
Definition: read_prism.c:36
double deg2rad(double deg)
Definition: read_prism.c:550
prism4ocia_t * open_prism(char *filename, prism4ocia_t **data)
Definition: read_prism.c:74
void get_zenaz(float *pos, float lon, float lat, float *senz, float *sena)
Definition: get_zenaz.c:28
int32_t day
real(single), dimension(:,:), allocatable longitude
#define NULL
Definition: decode_rs.h:63
char * getinbasename(char *file)
Definition: jplaeriallib.c:41
#define BIL
Definition: read_prism.c:18
void prism4ocia_proj4_convert(prism4ocia_t *data, int32_t numPoints, double *x, double *y)
Definition: read_prism.c:496
real(single), dimension(:,:), allocatable latitude
void unix2ymds(double usec, int16_t *year, int16_t *mon, int16_t *day, double *secs)
Definition: unix2ymds.c:8
void getPosVec(float lat, float lon, float alt, double *pos)
Definition: jplaeriallib.c:561
char * checknspTagLine(char *line, char *tag)
Definition: jplaeriallib.c:534
float32 * pos
Definition: l1_czcs_hdf.c:35
float * lat
#define BIP
Definition: read_prism.c:17
int32 nscan
Definition: l1_czcs_hdf.c:19
#define SKIP
Definition: read_prism.c:18
data_t tmp
Definition: decode_rs.h:74
read recnum
void cdata_()
#define MAXLINESZ
Definition: read_prism.c:19
int close_prism(prism4ocia_t *data)
Definition: read_prism.c:509
void unix2yds(double usec, short *year, short *day, double *secs)
char filename[FILENAME_MAX]
Definition: atrem_corl1.h:122
no change in intended resolving MODur00064 Corrected handling of bad ephemeris attitude data
Definition: HISTORY.txt:356
float getValidOrcaAngle(float *ang, int32_t npix, int32_t skip, float *fillangle)
Definition: read_prism.c:520
int checkTagLine_i(char *linein, char *tag)
Definition: jplaeriallib.c:482
void ymdhms2ydmsec(int yy, int mm, int dd, int hh, int mn, int sc, int32_t *year, int32_t *day, int32_t *msec)
Definition: ydhms2ydmsec.c:3
char * checkTagLine(char *linein, char *tag)
Definition: jplaeriallib.c:433
char * unix2isodate(double dtime, char zone)
Definition: unix2isodate.c:10
float * lon
double ymds2unix(short year, short month, short day, double secs)
int readBinScanLine_float(float *Lt, int32_t recnum, int32_t npix, double *gain, int nbands, int numBands, int interleave, int swap, FILE *ptr)
Definition: jplaeriallib.c:371
no change in intended resolving MODur00064 Corrected handling of bad ephemeris attitude resolving resolving GSFcd00179 Corrected handling of fill values for[Sensor|Solar][Zenith|Azimuth] resolving MODxl01751 Changed to validate LUT version against a value retrieved from the resolving MODxl02056 Changed to calculate Solar Diffuser angles without adjustment for estimated post launch changes in the MODIS orientation relative to incidentally resolving defects MODxl01766 Also resolves MODxl01947 Changed to ignore fill values in SCI_ABNORM and SCI_STATE rather than treating them as resolving MODxl01780 Changed to use spacecraft ancillary data to recognise when the mirror encoder data is being set by side A or side B and to change calculations accordingly This removes the need for seperate LUTs for Side A and Side B data it makes the new LUTs incompatible with older versions of the and vice versa Also resolves MODxl01685 A more robust GRing algorithm is being which will create a non default GRing anytime there s even a single geolocated pixel in a granule Removed obsolete messages from seed as required for compatibility with version of the SDP toolkit Corrected test output file names to end in per delivery and then split off a new MYD_PR03 pcf file for Aqua Added AssociatedPlatformInstrumentSensor to the inventory metadata in MOD01 mcf and MOD03 mcf Created new versions named MYD01 mcf and MYD03 where AssociatedPlatformShortName is rather than Terra The program itself has been changed to read the Satellite Instrument validate it against the input L1A and LUT and to use it determine the correct files to retrieve the ephemeris and attitude data from Changed to produce a LocalGranuleID starting with MYD03 if run on Aqua data Added the Scan Type file attribute to the Geolocation copied from the L1A and attitude_angels to radians rather than degrees The accumulation of Cumulated gflags was moved from GEO_validate_earth_location c to GEO_locate_one_scan c
Definition: HISTORY.txt:464
int i
Definition: decode_rs.h:71
void prism_proj4_convert(prism4ocia_t *data, int numPoints, double *x, double *y)
Definition: read_prism.c:554
How many dimensions is the output array Default is Not sure if anything above will work correctly strcpy(l2prod->title, "no title yet")
#define maxBands
int sunpos(double tjd, double r[3], char **errstr)
int npix
Definition: get_cmp.c:27
void l_sun_(int *iyr, int *iday, double *sec, float *sunr, float *rs)
void freePrivateData_pr(prism4ocia_t *data)
Definition: read_prism.c:59