/****************************************************************** * Author: James Bynes * Date: 04-19-2016 * XRMdataExtractor.c * Description: Extracts data taken from ASIC and outputs to * readable format. ******************************************************************/ #include #include #include unsigned int data_ch[8][64]; int mm = 0; int carrier = 0; int asic = 0; void initialize_data(void){ int m,n; for(n=0;n<8;n++){ for(m=0;m<64;m++) data_ch[n][m]=0; } } unsigned int createMask(unsigned int a, unsigned int b){ unsigned int r=0; unsigned int i=0; for (i=a; i<=b; i++) r |= 1 << i; return r; } void fprint_data(FILE *fp){ int m,n; for(m=0;m<64;m++) fprintf(fp,"%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", carrier, asic, m, data_ch[0][m], data_ch[1][m], data_ch[2][m], data_ch[3][m], data_ch[4][m], data_ch[5][m], data_ch[6][m], data_ch[7][m]); } void get_eventInfo(FILE *headerFile, unsigned int wordsInPacket,int mm, int k){ unsigned int r, result; fprintf(headerFile,"line %d\n", mm); fprintf(headerFile,"k: %d\n", k); r = createMask(30,31); result = (r & wordsInPacket)>>30; carrier = result; fprintf(headerFile,"Carrier: 0x%01x\n", result); r = createMask(28,29); result = (r & wordsInPacket)>>28; asic = result; fprintf(headerFile,"IRSX: 0x%01x\n", result); r = createMask(27,27); result = (r & wordsInPacket)>>27; fprintf(headerFile,"0: 0x%01x\n", result); r = createMask(24,26); result = (r & wordsInPacket)>>24; fprintf(headerFile,"Channel: 0x%01x\n", result); r = createMask(16,23); result = (r & wordsInPacket)>>16; fprintf(headerFile,"LastWriteAddress: 0x%02x\n", result); r = createMask(9,15); result = (r & wordsInPacket)>>9; fprintf(headerFile,"SCROD ID: 0x%03x\n", result); r = createMask(0,8); result = (r & wordsInPacket); fprintf(headerFile,"Converted Addr: 0x%03x\n", result); } main(int argc, char *argv[]){ if(argc < 2){ printf("You must enter a binary filename\n"); goto INVALID_ARGS; } char headerName[80]; char dataName[80]; strcpy(headerName, "XRM_header_"); strcat(headerName, argv[1]); strcat(headerName, ".txt"); strcpy(dataName, "XRM_data_"); strcat(dataName, argv[1]); strcat(dataName, ".txt"); FILE *fileName = fopen(argv[1], "r"); FILE *headerFile = fopen(headerName, "w"); FILE *dataFile = fopen(dataName, "w"); fputs("DATA FORMAT\n", headerFile); fputs("carrier# | ASIC# | Sample# | CH0 | CH1 | CH2 | CH3 | CH4 | CH5 | CH6 | CH7\n\n", headerFile); if(!fileName){ printf("File doesn't exist\n"); INVALID_ARGS: printf("Usage:\n"); printf("XRMdataExtractor \n"); return; } unsigned int wordsInPacket, packet_hdr, result, r, num_windows, footer; int i = 0; int j = 0; int k = 0; initialize_data(); printf("_________HEADER__________\n"); while(!feof(fileName)){ NEW_EVENT: fread(&packet_hdr, sizeof(packet_hdr),1,fileName); if(feof(fileName)) break; wordsInPacket = packet_hdr; if (mm < 3){ if (mm == 0){ fprintf(headerFile,"Event size: %d\n", wordsInPacket); } if (mm == 1){ r = createMask(28,31); result = (r & wordsInPacket)>>28; fprintf(headerFile,"Trig Pattern: 0x%01x\n", result); r = createMask(19,27); result = (r & wordsInPacket)>>19; num_windows = result+1; fprintf(headerFile,"# of windows: 0x%03x\n", result); r = createMask(0,18); result = r & wordsInPacket; fprintf(headerFile,"Timestamp: 0x%05x\n", result); } if (mm == 2){ get_eventInfo(headerFile,wordsInPacket,mm,k); } } else{ if((j < 8) && (i < 64)){ r = createMask(0,11); result = (r & wordsInPacket); data_ch[j][i] = result; i++; r = createMask(16,27); result = (r & wordsInPacket)>>16; data_ch[j][i] = result; i++; } else{ if((j==7)){ //on to next event j = 0; i = 0; k = k + 1; fprint_data(dataFile); if(k<4) get_eventInfo(headerFile,wordsInPacket,mm,k); else{ footer = wordsInPacket; printf("Footer %08x\n",footer); mm = 0; k = 0; goto NEW_EVENT; } } else{//on to next channel (same event) i = 0; j++; r = createMask(0,11); result = (r & wordsInPacket); data_ch[j][i] = result; i++; r = createMask(16,27); result = (r & wordsInPacket)>>16; data_ch[j][i] = result; i++; } } } mm++; } printf("\n"); }