#include #include #include #include #include #include #include "nrutil.c" #include "UVStruct.c" #include "UVFile.c" #include "UVCommon.c" #include "SERC.c" void main(void) { int i, j; int n_col, n_file, n_row, record, ok; int hh, mm, ss, dd, yy; int day, year; double fraction, integer; float **data, *Stime, *temp, *sig, *sig2, *sig_unc, *wl; float avg_temp, avg_dark, dark, avg; char st[128], ch[2]; char sch_file[20], in_file[20], out_file[20], wl_file[20]; char start_time[10], stop_time[10]; struct tm date; struct scan_header SERC; struct SERC_data S; FILE *fp_sch, *fp_in, *fp_out, *fp_data; Stime = vector(1, 20); data = matrix(1, 20, 1, 20); temp = vector(1, 20); sig = vector(1, 20); sig2 = vector(1, 20); sig_unc = vector(1, 20); wl = vector(1, 20); printf("Lamp Schedule File: "); // schedule of scans scanf("%s", &sch_file); printf("Wavelength File: "); // wavelength file scanf("%s", &wl_file); fp_in = fopen(wl_file, "r"); do{ fscanf(fp_in, "%s", &st); } while(strcmp(st, "Number_of_rows") != 0); fscanf(fp_in, "%d", &n_row); do{ fscanf(fp_in, "%s", &st); } while(strcmp(st, "Data:") != 0); for(i = 1; i <= n_row; i++){ fscanf(fp_in, "%s%f", &st, wl + i); printf("%d\t%f\n", i, wl[i]); } fclose(fp_in); fp_sch = fopen(sch_file, "r"); fp_data = fopen("96FR.SER", "w"); // compilation of header data fprintf(fp_data, "Header:\n"); fprintf(fp_data, "Number_of_columns\t25\n"); fprintf(fp_data, "Labels:\n"); fprintf(fp_data, "File\tInstrument\tSource\tLocation\tEnvironment\t"); fprintf(fp_data, "Year\tDay\tDate\tOperation\tMeasurement_type\t"); fprintf(fp_data, "Measurement_purpose\tLamp_power_supply\tLamp_housing\t"); fprintf(fp_data, "Number_of_scans\tNumber_of_columns\t"); fprintf(fp_data, "Number_of_rows\tStart_time\tStop_time\tDark_signal\t"); fprintf(fp_data, "Filter_temperature\tIntegration_time\t"); fprintf(fp_data, "Comments\tData_file\tWavelength_file\tAnalysis_file\n"); fprintf(fp_data, "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"); fprintf(fp_data, "[UTC]\t[UTC]\t[V]\t[C]\t[s]\n"); fprintf(fp_data, "Data:\n"); fscanf(fp_sch, "%s %s %d", &st, &st, &n_col); // read schedule file header do{ fscanf(fp_sch, "%s", &st); } while(strcmp(st, "Data:") != 0); while(fscanf(fp_sch, "%s", &in_file) != EOF){ // read schedule file info. strcpy(SERC.data_file, in_file); fscanf(fp_sch, "%d", &i); fscanf(fp_sch, "%s", SERC.inst); fscanf(fp_sch, "%s", SERC.source); fscanf(fp_sch, "%s", SERC.locat); fscanf(fp_sch, "%s", SERC.envir); fscanf(fp_sch, "%s", SERC.operat); fscanf(fp_sch, "%s", SERC.meas_type); fscanf(fp_sch, "%s", SERC.meas_purp); fscanf(fp_sch, "%s", start_time); fscanf(fp_sch, "%s", stop_time); fscanf(fp_sch, "%s", SERC.lamp_ps); fscanf(fp_sch, "%s", SERC.lamp_hs); fscanf(fp_sch, "%s", SERC.comments); printf("%s\t%s\n", SERC.inst, start_time); fp_in = fopen(in_file, "r"); printf("%s\t", in_file); strcpy(S.inst, "UI"); n_row = 1; record = 0; while(read_SERC_line(fp_in, &S) != 0){ // read SERC line if(strcmp(start_time, S.time) == 0) record = 1; if(record == 1){ sscanf(S.time, "%2d%2d%2d", &hh, &mm, &ss); Stime[n_row] = hh + (float)mm/60.0 + (float)ss/3600.0; for(i = 1; i <= 20; i++){ data[n_row][i] = S.data[i]; } temp[n_row] = S.temp; n_row++; } if(strcmp(stop_time, S.time) == 0) break; } n_row--; fclose(fp_in); for(i = 1; i <= 20; i++){ sig[i] = 0; sig2[i] = 0; sig_unc[i] = 0; } avg_dark = 0; avg_temp = 0; for(j = 1; j <= n_row; j++){ // reduce data dark = (data[j][10] + data[j][20])/2.0; for(i = 1; i <= 9; i++){ sig[i] += (data[j][i] - dark); sig2[i] += (data[j][i] - dark)*(data[j][i] - dark); } for(i = 11; i <= 19; i++){ sig[i] += (data[j][i] - dark); sig2[i] += (data[j][i] - dark)*(data[j][i] - dark); } avg_dark += dark; avg_temp += temp[j]; } for(i = 1; i <= 19; i++){ if(i != 10){ avg = sig[i]/(float)n_row; sig_unc[i] = sqrt((sig2[i] - 2*sig[i]*avg + n_row*avg*avg)/(float)(n_row*(n_row-1))); sig_unc[i] /= avg; sig[i] = avg; } } avg_dark /= (float)n_row; avg_temp /= (float)n_row; sscanf(start_time, "%2d%2d%2d", &hh, &mm, &ss); // convert times SERC.start_time = hh + (float)mm/60.0 + (float)ss/3600.0; sscanf(stop_time, "%2d%2d%2d", &hh, &mm, &ss); SERC.stop_time = hh + (float)mm/60.0 + (float)ss/3600.0; sscanf(S.date, "%2d%2d%2d", &dd, &mm, &yy); SERC.year = 1900 + yy; date.tm_sec = 0; date.tm_min = 0; date.tm_hour = 0; date.tm_mday = dd; date.tm_mon = mm - 1; date.tm_year = yy; mktime(&date); SERC.day = date.tm_yday + 1; day_to_date(SERC.year, SERC.day, SERC.date); n_file = 1; do{ // check if file exists if(n_file < 10){ sprintf(out_file, "96%03dFR%1d.SER", SERC.day, n_file); } else{ sprintf(out_file, "96%03dFR%c.SER", SERC.day, n_file + 55); } ok = file_exist(out_file); n_file++; } while(ok == 1); fp_out = fopen(out_file, "w"); // store header info. printf("%s\n", out_file); fprintf(fp_data, "%s\t", out_file); fprintf(fp_out, "Header:\n"); fprintf(fp_out, "Instrument\t%s\n", SERC.inst); fprintf(fp_data, "%s\t", SERC.inst); fprintf(fp_out, "Source\t%s\n", SERC.source); fprintf(fp_data, "%s\t", SERC.source); fprintf(fp_out, "Location\t%s\n", SERC.locat); fprintf(fp_data, "%s\t", SERC.locat); fprintf(fp_out, "Environment\t%s\n", SERC.envir); fprintf(fp_data, "%s\t", SERC.envir); fprintf(fp_out, "Year\t%d\n", SERC.year); fprintf(fp_data, "%d\t", SERC.year); fprintf(fp_out, "Day\t%d\n", SERC.day); fprintf(fp_data, "%d\t", SERC.day); fprintf(fp_out, "Date\t%s\n", SERC.date); fprintf(fp_data, "%s\t", SERC.date); fprintf(fp_out, "Operation\t%s\n", SERC.operat); fprintf(fp_data, "%s\t", SERC.operat); fprintf(fp_out, "Measurement_type\t%s\n", SERC.meas_type); fprintf(fp_data, "%s\t", SERC.meas_type); fprintf(fp_out, "Measurement_purpose\t%s\n", SERC.meas_purp); fprintf(fp_data, "%s\t", SERC.meas_purp); fprintf(fp_out, "Lamp_power_supply\t%s\n", SERC.lamp_ps); fprintf(fp_data, "%s\t", SERC.lamp_ps); fprintf(fp_out, "Lamp_housing\t%s\n", SERC.lamp_hs); fprintf(fp_data, "%s\t", SERC.lamp_hs); fprintf(fp_out, "Number_of_scans\t%d\n", n_row); fprintf(fp_data, "%d\t", n_row); fprintf(fp_out, "Number_of_columns\t3\n"); fprintf(fp_data, "3\t"); fprintf(fp_out, "Number_of_rows\t18\n"); fprintf(fp_data, "18\t"); fprintf(fp_out, "Start_time\t%.5f\t[UTC]\n", SERC.start_time); fprintf(fp_data, "%.5f\t", SERC.start_time); fprintf(fp_out, "Stop_time\t%.5f\t[UTC]\n", SERC.stop_time); fprintf(fp_data, "%.5f\t", SERC.stop_time); fprintf(fp_out, "Dark_signal\t%.5f\t[V]\n", avg_dark); fprintf(fp_data, "%.5f\t", avg_dark); fprintf(fp_out, "Filter_temperature\t%.2f\t[C]\n", avg_temp); fprintf(fp_data, "%.2f\t", avg_temp); fprintf(fp_out, "Integration_time\t60\t[s]\n"); fprintf(fp_data, "60\t"); fprintf(fp_out, "Comments\t%s\n", SERC.comments); fprintf(fp_data, "%s\t", SERC.comments); fprintf(fp_out, "Data_file\t%s\n", SERC.data_file); fprintf(fp_data, "%s\t", SERC.data_file); fprintf(fp_out, "Wavelength_file\t%s\n", wl_file); fprintf(fp_data, "%s\t", wl_file); fprintf(fp_out, "Analysis_program\tFmt_96SERC_Lp.c\n"); fprintf(fp_data, "Fmt_96SERC_Lp.c\n"); fprintf(fp_out, "Labels:\n"); fprintf(fp_out, "Wavelength\tSignal\tdS/S\n"); fprintf(fp_out, "[nm]\t[V]\n"); fprintf(fp_out, "Data:\n"); for(i = 1; i <= 9; i++){ fprintf(fp_out, "%.2f\t%.5f\t%.5f\n", wl[i], sig[i], sig_unc[i]); } for(i = 11; i <= 19; i++){ fprintf(fp_out, "%.2f\t%.5f\t%.5f\n", wl[i-1], sig[i], sig_unc[i]); } fclose(fp_out); } fclose(fp_sch); fclose(fp_data); }