//2016.11.30 VMテーブルにCAL結果を反映 //RAM0_*_ENERGY_VMOMENT.xlsx // // MIAのE2PROMテーブル用コードの作成 // // ch_N_100_corrected_1.txt // ch_R1p0_100_corrected_1.txt // miach1.txt // // MHV_lmt IFT_lmt 1B + 1B(Lower and upper limits)x 6 = 12B // SVS_lmt // SVG_lmt // MCPI_lmt // ASCT_lmt // // g-factor eff /g, 2B x (16x2 + 8x2 + 16) = 128B // M1 SW: [16ch](40, 41, …, 55 for 1sweeps) x 2(Sp OFF/ON) // ALL: [8ch](0-3, 4-7, …, 28-31 for 4 sweeps) x 2(Sp OFF/ON) // M2 [16ch] (0-1, 2-3, …, 30-31 for 2 sweeps) // M3 M1 Sp OFFと同一 // // theta M1-3 2B x (16x2 + 8x2 + 16) 128B // phi M1-3 2B x (16x2 + 8x2 + 16) 128B(RAMではセクター方向に展開する) // // Velocity 832B // T1 2B x [128en] x 2 // T2 2B x [64en] // T3-5 2B x [32en] x 3 832 // // V-ch-factor 1B x (16x2 + 8x2 + 16) = 64B // (= 0.8 + 0.4 x 1B/0xff) #include #include #include #include //gf x eff. の最小値を設定する。 #define MIN_GF_SW16 1.5e-7 #define MIN_GF_AL08 4.0e-6 #define MIN_GF_AL16 1.0e-4 #define MAX_ENEGY_TABLE 30000. //(eV) #define d_Lcl_MIA_TBL_RD0 0x7fff typedef unsigned short USHORT; typedef unsigned char UCHAR; typedef struct { float eff[64]; float en[64]; float ph[64]; float gf[64]; float al[64]; } Charac; void proc_param0(float*, float*, float*, float*, float*); void proc_param1(float*, float*, float*, float*, float*); void cal_angle(float*, float*, float*, float*); void tentative_make_vtable(float*); void make_vtable(float*); void outputf(USHORT*, short*, short*, USHORT*, UCHAR*); main(int argc, char *argv[]) { int i, j, k; char fn_mia[] = "./mia/miach1.txt"; char fn_plN[] = "./mia/ch_N_100_corrected_1.txt"; char fn_plR[] = "./mia/ch_R1p0_100_corrected_1.txt"; char line[1000]; int i_ch; float f_ch; float f[6]; FILE *fp_in0, *fp_in1, *fp_in2; Charac nm, rd; UCHAR uc[128]; short s_tmp[64]; float f_gf[64]; USHORT us_gf[64]; float f_th[64]; float f_th2[64]; short s_th[64]; float f_pe[64]; float f_pe2[64]; short s_pe[64]; float f_pe3[64]; float f_en[64]; float f_vc[64]; float f_vc1[64]; UCHAR uc_vc[64]; float f_tmp[64]; float f_vl[416]; USHORT us_vl[416]; // // MCP eff. 一意に1をセット // 値が導出した際はこの部分を改変する // //########## SET MCP efficiency ######################### for (i = 0; i < 64; ++i) nm.eff[i] = rd.eff[i] = 1.0; //####################################################### printf("START \n"); printf("Open %s \n", fn_mia); printf("Open %s \n", fn_plN); printf("Open %s \n", fn_plR); if(NULL == (fp_in0=fopen(fn_mia,"r"))) { printf("cannot open %s \n",fn_mia); exit(2); } if(NULL == (fp_in1=fopen(fn_plN,"r"))) { printf("cannot open %s \n",fn_plN); exit(2); } if(NULL == (fp_in2=fopen(fn_plR,"r"))) { printf("cannot open %s \n",fn_plR); exit(2); } while(1) { if (NULL == fgets(line, 500, fp_in0)) break; if(line[0] == 'c') continue; sscanf(line, "%d %f %f %f %f %f %f\n", &i_ch, &f[0], &f[1], &f[2], &f[3], &f[4], &f[5]); nm.en[i_ch] = f[0]; nm.ph[i_ch] = f[1]; nm.gf[i_ch] = f[2]; rd.en[i_ch] = f[3]; rd.ph[i_ch] = f[4]; rd.gf[i_ch] = f[5]; //printf("%s", line); //printf("%d %f %f %e %f %f %e\n", // i_ch, f[0], f[1], f[2], f[3], f[4], f[5]); } while(1) { if (NULL == fgets(line, 500, fp_in1)) break; if(line[0] == 'c') continue; sscanf(line, "%f %f %f %f %f\n", &f_ch, &f[0], &f[1], &f[2], &f[3]); nm.al[(int)f_ch] = f[1]; //printf("%s", line); //printf("%d %f %f %f %f\n", // (int)f_ch, f[0], f[1], f[2], f[3]); } while(1) { if (NULL == fgets(line, 500, fp_in2)) break; if(line[0] == 'c') continue; sscanf(line, "%f %f %f %f %f\n", &f_ch, &f[0], &f[1], &f[2], &f[3]); rd.al[(int)f_ch] = f[1]; } fclose(fp_in0); fclose(fp_in1); fclose(fp_in2); //for (i = 0; i < 64; ++i) { // printf("CH[%02d] %f %f %e %f %f %f %e %f %f\n", i, // nm.en[i], nm.ph[i], nm.gf[i], nm.al[i], // rd.en[i], rd.ph[i], rd.gf[i], rd.al[i], // nm.eff[i]); //} // ####################################################### //M1-3のCH構成に即してgf*effを作成 // g-factor eff x gf, 2B x (16x2 + 8x2 + 16) = 128B // // ####################################################### proc_param0(nm.eff, nm.gf, rd.eff, rd.gf, f_gf); //OUTPUT: gf*eff //for (i = 0; i < 64; ++i) printf("[%02d] %e\n", i,f_gf[i]); //逆数に変換 for (i = 0; i < 64; ++i) f_gf[i] = 1/f_gf[i]; //CHECK for (i = 0; i < 32; ++i) if (f_gf[i] > 1/MIN_GF_SW16) fprintf(stderr, "f_gf[%d] < MIN_GF_SW16\n", i); for (i = 32; i < 48; ++i) if (f_gf[i] > 1/MIN_GF_AL08) fprintf(stderr, "f_gf[%d] < MIN_GF_AL08\n", i); for (i = 48; i < 64; ++i) if (f_gf[i] > 1/MIN_GF_AL16) fprintf(stderr, "f_gf[%d] < MIN_GF_AL16\n", i); //規格化 for (i = 0; i < 32; ++i) us_gf[i] = f_gf[i]*MIN_GF_SW16*0xffff; for (i = 32; i < 48; ++i) us_gf[i] = f_gf[i]*MIN_GF_AL08*0xffff; for (i = 48; i < 64; ++i) us_gf[i] = f_gf[i]*MIN_GF_AL16*0xffff; //for (i = 0; i < 32; ++i) printf("[%02d] %f %04x %f\n", i, f_gf[i], us_gf[i], us_gf[i]/MIN_GF_SW16/0xffff); //for (i = 32; i < 48; ++i) printf("[%02d] %f %04x %f\n", i, f_gf[i], us_gf[i], us_gf[i]/MIN_GF_AL08/0xffff); //for (i = 48; i < 64; ++i) printf("[%02d] %f %04x %f\n", i, f_gf[i], us_gf[i], us_gf[i]/MIN_GF_AL16/0xffff); // ####################################################### // // theta M1-3 2B x (16x2 + 8x2 + 16) 128B // // ####################################################### //AntiCH: 符号を逆転 (CH方向→粒子の運動方向) //SW-CH: +pi (CH方向→粒子の運動方向 + 仰角にする(<+-90)) //SW-16CH (Sp OFF/ON) proc_param1(nm.al, nm.gf, rd.al, rd.gf, f_th); for (i = 0; i < 32; ++i) f_th[i] = f_th[i] + 180.; for (i = 32; i < 64; ++i) f_th[i] = -f_th[i]; //for (i = 0; i < 64; ++i) printf("[%02d] %f\n", i,f_th[i]); //CHECK for (i = 0; i < 64; ++i) if (fabs(f_th[i]) >= 90.) fprintf(stderr, "|f_th[%d]| > 90 deg.\n", i); // ####################################################### // // phi M1-3 2B x (16x2 + 8x2 + 16) 128B // // ####################################################### //AntiCH: 中心方向に -alpha //SW-CH: 中心方向に +alpha //SW-16CH (Sp OFF/ON) proc_param1(nm.ph, nm.gf, rd.ph, rd.gf, f_pe); for (i = 0; i < 32; ++i) f_pe[i] = f_pe[i]; for (i = 32; i < 64; ++i) f_pe[i] = -f_pe[i]; //for (i = 0; i < 64; ++i) printf("[%02d] %f\n", i,f_pe[i]); //CHECK for (i = 0; i < 64; ++i) if (fabs(f_pe[i]) >= 10.) fprintf(stderr, "|f_pe[%d]| > 90 deg.\n", i); //座標変換 cal_angle( f_th, f_pe, //input f_th2, f_pe2); //output //開始点 + pe2 (SW: 135 + dphi/2; ALL: -90 + dphi/2 for (i = 0; i < 32; ++i) f_pe3[i] = f_pe2[i] + 137.8125; for (i = 32; i < 48; ++i) f_pe3[i] = f_pe2[i] - 78.75; for (i = 48; i < 64; ++i) f_pe3[i] = f_pe2[i] - 84.375; for (i = 0; i < 64; ++i) { if (f_pe2[i] > 180.) f_pe3[i] -= 180.; if (f_pe2[i] < -180.) f_pe3[i] += 180.; } //ThETA&PHI規格化 for (i = 0; i < 64; ++i) s_th[i] = f_th2[i]/180.*d_Lcl_MIA_TBL_RD0; for (i = 0; i < 64; ++i) s_pe[i] = f_pe3[i]/180.*d_Lcl_MIA_TBL_RD0; memcpy(uc, s_th, 128); memcpy(s_tmp, uc, 128); for (i = 0; i < 64; ++i) printf("THETA[%02d] %f %f %02x%02x %f\n", i, f_th[i], f_th2[i],uc[2*i+1], uc[2*i], s_tmp[i]*180./d_Lcl_MIA_TBL_RD0); memcpy(uc, s_pe, 128); memcpy(s_tmp, uc, 128); for (i = 0; i < 64; ++i) printf("[%02d] %f %f %f %02x%02x %f\n", i, f_pe[i], f_pe2[i], f_pe3[i], uc[2*i+1], uc[2*i], s_tmp[i]*180./d_Lcl_MIA_TBL_RD0); // ####################################################### // // V-ch-factor 1B x (16x2 + 8x2 + 16) = 64B // (= 0.8 + 0.4 x 1B/0xff) // // ####################################################### //AntiCH: 中心方向に -alpha //SW-CH: 中心方向に +alpha //SW-16CH (Sp OFF/ON) proc_param1(nm.en, nm.gf, rd.en, rd.gf, f_en); //Energy -> velocity -> normalized for (i = 0; i < 64; ++i) f_vc[i] = sqrt(f_en[i]); for (i = 0; i < 16; ++i) f_vc1[i] = (f_vc[i] - f_vc[ 0])/f_vc[ 0]; for (i = 16; i < 32; ++i) f_vc1[i] = (f_vc[i] - f_vc[16])/f_vc[16]; for (i = 32; i < 40; ++i) f_vc1[i] = (f_vc[i] - f_vc[32])/f_vc[32]; for (i = 40; i < 48; ++i) f_vc1[i] = (f_vc[i] - f_vc[40])/f_vc[40]; for (i = 48; i < 64; ++i) f_vc1[i] = (f_vc[i] - f_vc[48])/f_vc[48]; //CHECK for (i = 0; i < 64; ++i) if (fabs(f_vc1[i]) >= 0.20) fprintf(stderr, "|f_en[%d] - base| > 20%\n", i); //規格化 for (i = 0; i < 64; ++i) uc_vc[i] = f_vc1[i]*0x27f + 0x7f; // for (i = 0; i < 16; ++i) f_tmp[i] = f_vc[ 0]*(0x200 + uc_vc[i])/0x27f; for (i = 16; i < 32; ++i) f_tmp[i] = f_vc[16]*(0x200 + uc_vc[i])/0x27f; for (i = 32; i < 40; ++i) f_tmp[i] = f_vc[32]*(0x200 + uc_vc[i])/0x27f; for (i = 40; i < 48; ++i) f_tmp[i] = f_vc[40]*(0x200 + uc_vc[i])/0x27f; for (i = 48; i < 64; ++i) f_tmp[i] = f_vc[48]*(0x200 + uc_vc[i])/0x27f; for (i = 0; i < 64; ++i) printf("[%02d] %f %f %f %02x %f\n", i, f_en[i], f_vc[i], f_vc1[i], uc_vc[i], f_tmp[i]); // ####################################################### // Velocity 832B // T1 2B x [128en] x 2 // T2 2B x [64en] // T3-5 2B x [32en] x 3 832 // ####################################################### //tentative_make_vtable(f_vl); //Vテーブルが未提出なので一時的に作成する make_vtable(f_vl); //CHECK for (i = 0; i < 416; ++i) if (fabs(f_vl[i]) >= sqrt(MAX_ENEGY_TABLE)) fprintf(stderr, "|f_vl[%d] > 30keV\n", i); for (i = 0; i < 416; ++i) us_vl[i] = f_vl[i]*0xffff/sqrt(MAX_ENEGY_TABLE); printf("T0\n"); for (i = 0; i < 128; ++i) printf("[%02d] %f %04x %f\n", i, f_vl[i], us_vl[i], pow(us_vl[i]*sqrt(MAX_ENEGY_TABLE)/0xffff, 2)); printf("T1\n"); for (i = 128; i < 256; ++i) printf("[%02d] %f %04x %f\n", i, f_vl[i], us_vl[i], pow(us_vl[i]*sqrt(MAX_ENEGY_TABLE)/0xffff, 2)); printf("T2\n"); for (i = 256; i < 320; ++i) printf("[%02d] %f %04x %f\n", i, f_vl[i], us_vl[i], pow(us_vl[i]*sqrt(MAX_ENEGY_TABLE)/0xffff, 2)); printf("T3\n"); for (i = 320; i < 352; ++i) printf("[%02d] %f %04x %f\n", i, f_vl[i], us_vl[i], pow(us_vl[i]*sqrt(MAX_ENEGY_TABLE)/0xffff, 2)); printf("T4\n"); for (i = 352; i < 384; ++i) printf("[%02d] %f %04x %f\n", i, f_vl[i], us_vl[i], pow(us_vl[i]*sqrt(MAX_ENEGY_TABLE)/0xffff, 2)); printf("T5\n"); for (i = 384; i < 416; ++i) printf("[%02d] %f %04x %f\n", i, f_vl[i], us_vl[i], pow(us_vl[i]*sqrt(MAX_ENEGY_TABLE)/0xffff, 2)); outputf(us_gf, s_th, s_pe, us_vl, uc_vc); } void outputf(USHORT us_gf[], short s_th[], short s_pe[], USHORT us_vl[], UCHAR uc_vc[]) { FILE *fp; int i, j; unsigned char uc[832]; if(NULL == (fp=fopen("app_romTable_MIA_body.txt", "w"))) { printf("cannot open mis.dat\n"); exit(2); } //OUTPUT fprintf(fp, "//G-factor (2B x 64 = 128B)"); memcpy(uc, us_gf, 128); for (i = 0; i < 64; ++i) { if (i%8 == 0) fprintf(fp, "\n"); fprintf(fp, "0x%02x, 0x%02x, ", uc[2*i+1], uc[2*i]); } fprintf(fp, "\n//THETA (2B x 64 = 128B)"); memcpy(uc, s_th, 128); for (i = 0; i < 64; ++i) { if (i%8 == 0) fprintf(fp, "\n"); fprintf(fp, "0x%02x, 0x%02x, ", uc[2*i+1], uc[2*i]); } memcpy(uc, s_pe, 128); fprintf(fp, "\n//PHI (2B x 64 = 128B)"); for (i = 0; i < 64; ++i) { if (i%8 == 0) fprintf(fp, "\n"); fprintf(fp, "0x%02x, 0x%02x, ", uc[2*i+1], uc[2*i]); } fprintf(fp, "\n//Velocity (2B x 416 = 832B)"); memcpy(uc, us_vl, 832); fprintf(fp, "\n//T0"); for (i = 0; i < 128; ++i) { if (i%8 == 0) fprintf(fp, "\n"); fprintf(fp, "0x%02x, 0x%02x, ", uc[2*i+1], uc[2*i]); } fprintf(fp, "\n//T1"); for (i = 128; i < 256; ++i) { if (i%8 == 0) fprintf(fp, "\n"); fprintf(fp, "0x%02x, 0x%02x, ", uc[2*i+1], uc[2*i]); } fprintf(fp, "\n//T2"); for (i = 256; i < 320; ++i) { if (i%8 == 0) fprintf(fp, "\n"); fprintf(fp, "0x%02x, 0x%02x, ", uc[2*i+1], uc[2*i]); } fprintf(fp, "\n//T3"); for (i = 320; i < 352; ++i) { if (i%8 == 0) fprintf(fp, "\n"); fprintf(fp, "0x%02x, 0x%02x, ", uc[2*i+1], uc[2*i]); } fprintf(fp, "\n//T4"); for (i = 352; i < 384; ++i) { if (i%8 == 0) fprintf(fp, "\n"); fprintf(fp, "0x%02x, 0x%02x, ", uc[2*i+1], uc[2*i]); } fprintf(fp, "\n//T5"); for (i = 384; i < 416; ++i) { if (i%8 == 0) fprintf(fp, "\n"); fprintf(fp, "0x%02x, 0x%02x, ", uc[2*i+1], uc[2*i]); } fprintf(fp, "\n//V-CH-factorr (1B x 64 = 64B)"); for (i = 0; i < 64; ++i) { if (i%8 == 0) fprintf(fp, "\n"); fprintf(fp, "0x%02x, ", uc_vc[i]); } fclose(fp); } void proc_param0(float pr0[], float gf0[], float pr1[], float gf1[], float f_out[]) { int i; //SW-16CH (Sp OFF/ON) for (i = 0; i < 16; ++i) f_out[i] = pr0[i +40]*gf0[i +40]; for (i = 0; i < 16; ++i) f_out[i+16] = pr1[i +40]*gf1[i +40]; //Anti-8CH (Sp OFF/ON) for (i = 0; i < 8; ++i) { if (i == 3 || i == 4) continue; f_out[i+32] = ( pr0[4*i ]*gf0[4*i ] + pr0[4*i+1]*gf0[4*i+1] + pr0[4*i+2]*gf0[4*i+2] + pr0[4*i+3]*gf0[4*i+3] ); } i = 3; f_out[i+32] = ( pr0[4*i ]*gf0[4*i ] + pr0[4*i+1]*gf0[4*i+1] + pr0[4*i+2]*gf0[4*i+2] ); i = 4; f_out[i+32] = ( pr0[4*i+1]*gf0[4*i+1] + pr0[4*i+2]*gf0[4*i+2] + pr0[4*i+3]*gf0[4*i+3] ); for (i = 0; i < 8; ++i) { if (i == 3 || i == 4) continue; f_out[i+40] = ( pr1[4*i ]*gf1[4*i ] + pr1[4*i+1]*gf1[4*i+1] + pr1[4*i+2]*gf1[4*i+2] + pr1[4*i+3]*gf1[4*i+3] ); } i = 3; f_out[i+40] = ( pr1[4*i ]*gf1[4*i ] + pr1[4*i+1]*gf1[4*i+1] + pr1[4*i+2]*gf1[4*i+2] ); i = 4; f_out[i+40] = ( pr1[4*i+1]*gf1[4*i+1] + pr1[4*i+2]*gf1[4*i+2] + pr1[4*i+3]*gf1[4*i+3] ); //Anti-16CH for (i = 0; i < 16; ++i) { if (i == 7 || i == 8) continue; f_out[i+48] = ( pr0[2*i ]*gf0[2*i ] + pr0[2*i+1]*gf0[2*i+1] ); } i = 7; f_out[i+48] = pr0[2*i ]*gf0[2*i ]; i = 8; f_out[i+48] = pr0[2*i+1]*gf0[2*i+1]; } void proc_param1(float pr0[], float gf0[], float pr1[], float gf1[], float f_out[]) { int i; //SW-16CH (Sp OFF/ON) for (i = 0; i < 16; ++i) f_out[i] = pr0[i +40]; for (i = 0; i < 16; ++i) f_out[i+16] = pr1[i +40]; //Anti-8CH (Sp OFF/ON) for (i = 0; i < 8; ++i) { if (i == 3 || i == 4) continue; f_out[i+32] = ( pr0[4*i ]*gf0[4*i ] + pr0[4*i+1]*gf0[4*i+1] + pr0[4*i+2]*gf0[4*i+2] + pr0[4*i+3]*gf0[4*i+3] ) /( gf0[4*i ] + gf0[4*i+1] + gf0[4*i+2] + gf0[4*i+3] ); } i = 3; f_out[i+32] = ( pr0[4*i ]*gf0[4*i ] + pr0[4*i+1]*gf0[4*i+1] + pr0[4*i+2]*gf0[4*i+2] ) /( gf0[4*i ] + gf0[4*i+1] + gf0[4*i+2] ); i = 4; f_out[i+32] = ( pr0[4*i+1]*gf0[4*i+1] + pr0[4*i+2]*gf0[4*i+2] + pr0[4*i+3]*gf0[4*i+3] ) /( gf0[4*i+1] + gf0[4*i+2] + gf0[4*i+3] ); for (i = 0; i < 8; ++i) { if (i == 3 || i == 4) continue; f_out[i+40] = ( pr1[4*i ]*gf1[4*i ] + pr1[4*i+1]*gf1[4*i+1] + pr1[4*i+2]*gf1[4*i+2] + pr1[4*i+3]*gf1[4*i+3] ) /( gf1[4*i ] + gf1[4*i+1] + gf1[4*i+2] + gf1[4*i+3] ); } i = 3; f_out[i+40] = ( pr1[4*i ]*gf1[4*i ] + pr1[4*i+1]*gf1[4*i+1] + pr1[4*i+2]*gf1[4*i+2] ) /( gf1[4*i ] + gf1[4*i+1] + gf1[4*i+2] ); i = 4; f_out[i+40] = ( pr1[4*i+1]*gf1[4*i+1] + pr1[4*i+2]*gf1[4*i+2] + pr1[4*i+3]*gf1[4*i+3] ) /( gf1[4*i+1] + gf1[4*i+2] + gf1[4*i+3] ); //Anti-16CH for (i = 0; i < 16; ++i) { if (i == 7 || i == 8) continue; f_out[i+48] = ( pr0[2*i ]*gf0[2*i ] + pr0[2*i+1]*gf0[2*i+1] ) /( gf0[2*i ] + gf0[2*i+1] ); } i = 7; f_out[i+48] = pr0[2*i ]; i = 8; f_out[i+48] = pr0[2*i+1]; } void cal_angle(float f_al[], float f_bt[], float f_outp[], float f_outa[]) { int i; double rad = M_PI/180.; double x, y, z; for (i = 0; i < 64; ++i) { y = sin(f_bt[i]*rad); x = cos(f_bt[i]*rad)*cos(f_al[i]*rad); z = cos(f_bt[i]*rad)*sin(f_al[i]*rad); f_outp[i] = atan2(z, sqrt(x*x + y*y))/rad; f_outa[i] = atan2(y, x)/rad; //printf("x y z a b a2 b2 %d| %f %f %f %f %f %f %f\n", //i,x,y,z,f_al[i], f_bt[i],f_outp[i], f_outa[i]); } } void tentative_make_vtable(float f_vl[]) { int i; UCHAR uc[32]; for (i = 0; i < 16; ++i) { uc[2*i] = 31 - i; uc[2*i + 1] = i; } //0 = 0 //0xffff = Max f_vl[uc[0]] = f_vl[uc[0] +128] = sqrt(100);//T0&T1 100-10keV for (i = 1; i < 32; ++i) f_vl[uc[i] ] = f_vl[uc[i] +128] = f_vl[uc[i-1]]*1.0752; for (i = 0; i < 32; ++i) f_vl[uc[i] +32] = f_vl[uc[i] +32 +128] = f_vl[uc[i]]*1.0183; for (i = 0; i < 32; ++i) f_vl[uc[i] +64] = f_vl[uc[i] +64 +128] = f_vl[uc[i]]*1.0369; for (i = 0; i < 32; ++i) f_vl[uc[i] +96] = f_vl[uc[i] +96 +128] = f_vl[uc[i]]*1.0559; f_vl[uc[0] +256] = sqrt(5); //T2 5-300eV for (i = 1; i < 32; ++i) f_vl[uc[i] +256] = f_vl[uc[i-1] +256]*1.0683; f_vl[uc[0] +288] = sqrt(3000); //T2 3k-30keV for (i = 1; i < 32; ++i) f_vl[uc[i] +288] = f_vl[uc[i-1] +288]*1.0338; f_vl[uc[0] +320] = sqrt(5);//T3 5-30keV for (i = 1; i < 32; ++i) f_vl[uc[i] +320] = f_vl[uc[i-1] +320]*1.1506; f_vl[uc[0] +352] = sqrt(5);//T4 5-5keV for (i = 1; i < 32; ++i) f_vl[uc[i] +352] = f_vl[uc[i-1] +352]*1.1179; f_vl[uc[0] +384] = sqrt(5);//T5 5-30keV for (i = 1; i < 32; ++i) f_vl[uc[i] +384] = f_vl[uc[i-1] +384]*1.1506; } // // f_vl = sqrt(Cal_DATA[eV]) // void make_vtable(float f_vl[]) { int i; double df_en[128*2 + 64 + 32*3] = { //T0 108.0919143, 143.8037807, 191.313974, 254.5269766, 338.6261301, 450.5093534, 599.3663264, 797.4197764, 1060.887452, 1411.385471, 1877.716466, 2498.133045, 3323.506651, 4421.628151, 5882.753332, 7825.94061, 10046.96859, 7552.060982, 5676.211877, 4266.63718, 3206.994636, 2410.536833, 1811.906134, 1361.928696, 1023.653403, 769.4659466, 578.3726607, 434.7160054, 326.7542405, 245.603254, 184.6084501, 138.7619057, 116.0876151, 154.4420803, 205.4719664, 273.3590304, 363.6770622, 483.8389197, 643.7302992, 856.3831178, 1139.373205, 1515.787933, 2016.636815, 2682.945207, 3569.375863, 4748.755864, 6317.905055, 8405.388418, 9354.913244, 7031.463342, 5285.36754, 3972.72586, 2986.080159, 2244.511456, 1687.075874, 1268.107947, 953.1463748, 716.4442087, 538.5129892, 404.7759824, 304.2497099, 228.6894894, 171.8934186, 129.2044121, 112.0190313, 149.0267331, 198.2684795, 263.7732434, 350.9280787, 466.8798857, 621.1522059, 826.3921668, 1099.422994, 1462.653022, 1945.90344, 2588.898112, 3444.262669, 4582.277793, 6096.085191, 8110.571711, 9694.999311, 7287.235226, 5477.366213, 4117.078532, 3094.556863, 2326.05289, 1748.35927, 1314.169521, 987.7774352, 742.4740907, 558.0750114, 419.4772071, 315.3010924, 236.9964169, 178.1405903, 133.8954495, 120.3033242, 160.0498223, 212.9357521, 283.2899962, 376.8900567, 501.4204074, 667.1006063, 887.5058028, 1180.738082, 1570.846792, 2089.916591, 2780.387505, 3699.072579, 4921.288712, 6547.08119, 8710.390731, 9027.276251, 6785.311197, 5100.046098, 3833.465992, 2881.394764, 2165.799356, 1627.942772, 1223.630801, 919.7602218, 691.3197139, 519.6356661, 390.5840381, 293.5831169, 220.671154, 165.866935, 124.6718174, // //T1 // 122.6480204, 163.168995, 217.0771082, 288.8026362, 384.226931, 511.1768137, 680.0794848, 904.8036348, 1203.750961, 1601.4485, 2130.577563, 2834.542014, 3771.063858, 5017.062959, 6674.949324, 8879.81427, 11399.9351, 8569.052874, 6440.594139, 4841.20026, 3638.861851, 2735.149733, 2055.904938, 1545.331669, 1161.502821, 873.0854262, 656.2587249, 493.2566679, 370.7563234, 278.6772081, 209.4685906, 157.4481602, 131.7204554, 175.2398922, 233.1416746, 310.1706925, 412.6513256, 548.9946778, 730.4176944, 971.7072246, 1292.805932, 1719.91023, 2288.205502, 3044.24175, 4050.042838, 5388.243048, 7168.700385, 9537.292926, 10614.68471, 7978.349394, 5997.117081, 4507.709621, 3388.198113, 2546.766689, 1914.264517, 1438.876629, 1081.501024, 812.9235609, 611.0313845, 459.2847971, 345.2212392, 259.4857657, 195.0413001, 146.6036148, 127.1039792, 169.0952918, 224.9681362, 299.2940437, 398.185511, 529.7518698, 704.7991413, 937.6775676, 1247.47586, 1659.619951, 2207.946877, 2937.529882, 3908.081382, 5199.346348, 6917.009337, 9202.774977, 11000.56818, 8268.564582, 6214.971092, 4671.501423, 3511.28274, 2639.288831, 1983.800589, 1491.141046, 1120.795646, 842.4587349, 633.2277099, 475.9657497, 357.7608468, 268.9113386, 202.1297419, 151.9263668, 136.5038694, 181.602796, 241.6105647, 321.4390035, 427.6436368, 568.9437616, 756.9351441, 1007.02102, 1339.741175, 1782.383544, 2371.353438, 3154.806032, 4197.205053, 5584.009886, 7428.73833, 9883.368117, 10242.92676, 7699.049379, 5786.839483, 4349.696441, 3269.415348, 2457.454891, 1847.168306, 1388.410006, 1043.618953, 784.4156973, 589.6119627, 443.1817066, 333.1182386, 250.3876479, 188.2032653, 141.4606421, // //T2 // 3071.752423, 3547.024116, 4095.801933, 4729.516386, 5461.239004, 6306.021848, 7281.576556, 8408.217753, 9709.145986, 11211.52287, 12946.47109, 14949.07441, 17262.3387, 19932.66508, 23016.64023, 0, 0, 24733.4807, 21419.76355, 18549.68613, 16064.39826, 13911.8402, 12047.8743, 10433.45575, 9035.764256, 7824.808876, 6776.257325, 5868.606657, 5082.221287, 4401.256939, 3811.566939, 3300.871971, 0, 27.82707559, 29.34076982, 32.29006862, 36.29640698, 41.22850375, 47.20575687, 54.59371643, 64.01087504, 76.31282362, 92.62111056, 114.2938167, 142.9436629, 180.4210343, 228.8366148, 290.5444112, 327.1899581, 257.8712506, 203.1179597, 160.4515879, 127.6369605, 102.6935432, 83.88978275, 69.73744908, 58.99729342, 50.69093173, 44.06972196, 38.6453209, 34.1749716, 30.66546446, 28.37143965, 27.79538704, // //T3 // 22.49151565, 26.93470333, 34.5778689, 47.2549873, 68.26619488, 103.5310263, 163.6826884, 267.8814378, 450.6847722, 774.0494693, 1347.612261, 2361.872271, 4138.185371, 7197.262373, 12340.42754, 20712.4298, 26562.92871, 16037.23665, 9445.451964, 5464.860553, 3127.829843, 1783.386437, 1020.031854, 589.3504805, 346.4124601, 208.5842349, 129.5609083, 83.60119058, 56.42938897, 40.1250631, 30.2670941, 24.38943357, // //T4 // 20.52908889, 23.45405542, 27.3930556, 32.9300642, 42.73031477, 59.46130436, 85.7854372, 123.9135557, 191.3422674, 295.450478, 456.2132927, 704.4478283, 1087.766134, 1679.606429, 2593.481634, 4004.640759, 4976.290985, 3222.725738, 2087.087256, 1351.629916, 875.3396623, 566.8855606, 367.1345096, 237.7659961, 153.9780694, 103.3782422, 71.25397264, 50.06225349, 37.13106081, 29.79572689, 25.39045229, 21.25056932, // //T5 // 5129.414595, 5728.837508, 6398.824036, 7146.90021, 7982.685769, 8915.800452, 9958.127466, 11122.11589, 12422.47825, 13875.05884, 15497.39953, 17308.7398, 19332.84606, 21592.91885, 24117.25154, 0, 0, 25488.34728, 22820.28438, 20431.1939, 18292.78251, 16377.88858, 14663.87744, 13128.68027, 11754.75519, 10523.99447, 9422.817284, 8436.511103, 7553.192716, 6762.676517, 6054.7769, 5420.949273}; for (i = 0; i < 128*2 + 64 + 32*3; ++i) f_vl[i] = (float) ( sqrt(df_en[i])); /* for (i = 0; i < 16; ++i) { uc[2*i] = 31 - i; uc[2*i + 1] = i; } //0 = 0 //0xffff = Max f_vl[uc[0]] = f_vl[uc[0] +128] = sqrt(100);//T0&T1 100-10keV for (i = 1; i < 32; ++i) f_vl[uc[i] ] = f_vl[uc[i] +128] = f_vl[uc[i-1]]*1.0752; for (i = 0; i < 32; ++i) f_vl[uc[i] +32] = f_vl[uc[i] +32 +128] = f_vl[uc[i]]*1.0183; for (i = 0; i < 32; ++i) f_vl[uc[i] +64] = f_vl[uc[i] +64 +128] = f_vl[uc[i]]*1.0369; for (i = 0; i < 32; ++i) f_vl[uc[i] +96] = f_vl[uc[i] +96 +128] = f_vl[uc[i]]*1.0559; f_vl[uc[0] +256] = sqrt(5); //T2 5-300eV for (i = 1; i < 32; ++i) f_vl[uc[i] +256] = f_vl[uc[i-1] +256]*1.0683; f_vl[uc[0] +288] = sqrt(3000); //T2 3k-30keV for (i = 1; i < 32; ++i) f_vl[uc[i] +288] = f_vl[uc[i-1] +288]*1.0338; f_vl[uc[0] +320] = sqrt(5);//T3 5-30keV for (i = 1; i < 32; ++i) f_vl[uc[i] +320] = f_vl[uc[i-1] +320]*1.1506; f_vl[uc[0] +352] = sqrt(5);//T4 5-5keV for (i = 1; i < 32; ++i) f_vl[uc[i] +352] = f_vl[uc[i-1] +352]*1.1179; f_vl[uc[0] +384] = sqrt(5);//T5 5-30keV for (i = 1; i < 32; ++i) f_vl[uc[i] +384] = f_vl[uc[i-1] +384]*1.1506; */ }