// // 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 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テーブルが未提出なので一時的に作成する //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); 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; }