/* Compile with: gcc -Wall -o csvmain csvmain.c "=HYPERLINK(""http://www.hep.lu.se/eudet/pictures/mcmtests/20220924/csv/"",""www.hep.lu.se"")" "=HYPERLINK(""file:////home/jum/work/ilc/readout/chiptests/csv/saltro0-mcm0-c7-bits-g3-s0-p1-s3.csv"",""saltro0-mcm0-c7-bits-g3-s0-p1-s3.csv"")" */ #include #include #include #include #include #include #include #include #include #include #include #include #include char csvfile[256]; char infile[256]; char url[256]; char dir[128]; int seturl; const char *gains[] = {"12 mV/fC","19 mV/fC","15 mV/fC","27 mV/fC"}; const char *shapers[] = {"120 ns","90 ns","-","60 ns","-","-","-","30 ns"}; typedef struct { char testtext[256]; char testfile[128]; char testlink[256]; int saltronb; int dcladdress; int chipaddress; char gain[16]; char shaper[16]; int polarity; int pgsource; unsigned int errorcode; char link[256]; char filepdf1[256]; char linkpdf1[1024]; char filepdf2[256]; char linkpdf2[1024]; char filepdf3[256]; char linkpdf3[1024]; char filepdf4[256]; char linkpdf4[1024]; } CSVCONTENT; int getParameters(int argc, char **argv); int findColumnHeader(char *header, char *entry); int getColumnEntry(char *row, int column, char *entry); unsigned int getErrorEntry(char *file); int csvBits(char *file, CSVCONTENT *csvcontent); int csvLvcard(char *file, CSVCONTENT *csvcontent); int csvRamp(char *file, CSVCONTENT *csvcontent); int csvPedsub(char *file, CSVCONTENT *csvcontent); int csvPedestal(char *file, CSVCONTENT *csvcontent); int csvZerosup(char *file, CSVCONTENT *csvcontent); int csvRegtest(char *file, CSVCONTENT *csvcontent); int csvAddrtest(char *file, CSVCONTENT *csvcontent); int getParameters(int argc, char **argv) { char bufcsv[128]; char bufin[128]; const char *short_options = "c:d:i:u:"; int option_index = 0; int c; int nbarg = 0; const struct option long_options[]= { {"csvfile",1,0,'c'}, {"dir",1,0,'d'}, {"infile",1,0,'i'}, {"url",1,0,'u'}, {0,0,0,0}, }; seturl = 0; dir[0] = '\0'; if (argc > 1) { while ((c = getopt_long(argc, argv, short_options, long_options, &option_index)) != EOF) { switch (c) { case 'c': nbarg++; strcpy(bufcsv,optarg); break; case 'd': nbarg++; strcpy(dir,optarg); if (dir[strlen(dir)-1]== '/') dir[strlen(dir)-1] = '\0'; break; case 'i': nbarg++; strcpy(bufin,optarg); break; case 'u': strcpy(url,optarg); seturl = 1; break; default: printf("%s: Unknown option %s\n",__FUNCTION__,argv[optind-1]); return 1; } } } if (nbarg != 3) { printf("%s: wrong number of arguments %d\n",__FUNCTION__,nbarg); printf("%s: ./csvmain --dir --csvfile --infile [--url ]\n", __FUNCTION__); return 2; } sprintf(infile,"%s/%s",dir,bufin); sprintf(csvfile,"%s/%s",dir,bufcsv); return 0; } int findColumnHeader(char *header, char *search) { char *pos = header; char *token,*entry; int column = 0; for (token = pos; ; token = NULL) { entry = strtok(token, ","); if (entry == NULL) break; column++; // printf(" --> %d %s %s\n", column,entry,search); if (strncmp(entry,search,strlen(search)) == 0) { // printf("Found %s %s %d\n",entry,search,column); return column; } } return 0; } int getColumnEntry(char *row, int column, char *entry) { char *pos = row; char *token,*subtoken; int mycolumn = 0; entry[0] = '\0'; for (token = pos; ; token = NULL) { subtoken = strtok(token, ","); if (entry == NULL) break; mycolumn++; if (column == mycolumn) { strcpy(entry,subtoken); return column; } } return 0; } unsigned int getErrorEntry(char *file) { FILE *fcsv; char buffer[512]; sprintf(buffer,"%s/%s",dir,file); fcsv = fopen(buffer,"r"); if (fcsv == NULL) return 0xFFFFFFFF; int row = 0; int column = 0; unsigned int errorcode = 0; unsigned int retvalue = 0; int retval; char retbuf[256]; while (fgets(buffer,sizeof(buffer),fcsv)) { if (row == 0) { column = findColumnHeader(buffer,"Error"); if (column == 0) break; } else { retval = getColumnEntry(buffer, column, retbuf); if (retval != 0) { // printf("RETBUF --> %d %s\n",retval,retbuf); sscanf(retbuf,"%X",&retvalue); errorcode |= retvalue; } } // puts(buffer); row++; } fclose(fcsv); return errorcode; } int csvLvcard(char *file, CSVCONTENT *csvcontent) { strcpy(csvcontent->testtext,"LVCARD"); csvcontent->saltronb = 0; csvcontent->dcladdress = 0; csvcontent->chipaddress = 0; strcpy(csvcontent->gain,""); strcpy(csvcontent->shaper,""); csvcontent->polarity = 0; csvcontent->pgsource = 0; csvcontent->errorcode = getErrorEntry(file); sprintf(csvcontent->testfile,"lvcard.txt"); return 0; } int csvBits(char *file, CSVCONTENT *csvcontent) { char search[512]; int saltronb,mcmnb,chipaddress,gain,shaper,polarity,source; sscanf(file,"saltro%d-mcm%d-c%d-bits-g%d-s%d-p%d-s%d.csv", &saltronb,&mcmnb,&chipaddress,&gain,&shaper,&polarity,&source); sprintf(search,"%s/saltro%d-mcm%d-c%d-bits-event?-g%d-s%d-p%d-s%d.pdf",dir, saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); strcpy(csvcontent->testtext,"Sinusbits"); csvcontent->saltronb = saltronb; csvcontent->dcladdress = mcmnb; csvcontent->chipaddress = chipaddress; strcpy(csvcontent->gain,gains[gain]); strcpy(csvcontent->shaper,shapers[shaper]); csvcontent->polarity = polarity; csvcontent->pgsource = source; csvcontent->errorcode = 0; csvcontent->errorcode = getErrorEntry(file); sprintf(csvcontent->testfile,"bits.txt"); glob_t globbuf; if (0==glob(search, 0, NULL, &globbuf)){ char **a=globbuf.gl_pathv; char *pos; for(;*a;a++) { printf("MATCHES %s\n",*a); pos = rindex(*a,'/'); pos++; if (seturl != 0) { if (strstr(*a,"events") != NULL) sprintf(csvcontent->linkpdf2,"\"=HYPERLINK(\"\"%s/pdf/%s\"\",\"\"%s\"\")\"",url,pos,"Events"); else sprintf(csvcontent->linkpdf3,"\"=HYPERLINK(\"\"%s/pdf/%s\"\",\"\"%s\"\")\"",url,pos,"Event"); } else { if (strstr(*a,"events") != NULL) sprintf(csvcontent->linkpdf2,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,pos,"Events"); else sprintf(csvcontent->linkpdf3,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,pos,"Event"); } } } globfree(&globbuf); return 0; } int csvRamp(char *file, CSVCONTENT *csvcontent) { int saltronb,mcmnb,chipaddress,pattern; sscanf(file,"saltro%d-mcm%d-c%d-ramp-p%d.csv", &saltronb,&mcmnb,&chipaddress,&pattern); if (pattern == 1) strcpy(csvcontent->testtext,"Rampup"); else if (pattern == 2) strcpy(csvcontent->testtext,"Rampdown"); else strcpy(csvcontent->testtext,"Unknown"); csvcontent->saltronb = saltronb; csvcontent->dcladdress = mcmnb; csvcontent->chipaddress = chipaddress; strcpy(csvcontent->gain,""); strcpy(csvcontent->shaper,""); csvcontent->polarity = 0; csvcontent->pgsource = 0; csvcontent->errorcode = 0; csvcontent->errorcode = getErrorEntry(file); sprintf(csvcontent->testfile,"ramp.txt"); return 0; } int csvAddrtest(char *file, CSVCONTENT *csvcontent) { int saltronb,mcmnb; sscanf(file,"saltro%d-mcm%d-addrtest.csv", &saltronb,&mcmnb); strcpy(csvcontent->testtext,"Addrtest"); csvcontent->saltronb = saltronb; csvcontent->dcladdress = mcmnb; csvcontent->chipaddress = 0; strcpy(csvcontent->gain,""); strcpy(csvcontent->shaper,""); csvcontent->polarity = 0; csvcontent->pgsource = 0; csvcontent->errorcode = 0; csvcontent->errorcode = getErrorEntry(file); sprintf(csvcontent->testfile,"addrtest.txt"); return 0; } int csvRegtest(char *file, CSVCONTENT *csvcontent) { int saltronb,mcmnb,chipaddress; sscanf(file,"saltro%d-mcm%d-c%d-regtest.csv", &saltronb,&mcmnb,&chipaddress); strcpy(csvcontent->testtext,"Regtest"); csvcontent->saltronb = saltronb; csvcontent->dcladdress = mcmnb; csvcontent->chipaddress = chipaddress; strcpy(csvcontent->gain,""); strcpy(csvcontent->shaper,""); csvcontent->polarity = 0; csvcontent->pgsource = 0; csvcontent->errorcode = 0; csvcontent->errorcode = getErrorEntry(file); sprintf(csvcontent->testfile,"regtest.txt"); return 0; } int csvPedestal(char *file, CSVCONTENT *csvcontent) { char search[512]; int saltronb,mcmnb,chipaddress,gain,shaper,polarity; if (strstr(file,"-sh.csv") == NULL) { sscanf(file,"saltro%d-mcm%d-c%d-pedestal-g%d-s%d-p%d.csv", &saltronb,&mcmnb,&chipaddress,&gain,&shaper,&polarity); // printf("saltro%d-mcm%d-c%d-pedestal-g%d-s%d-p%d.csv\n", // saltronb,mcmnb,chipaddress,gain,shaper,polarity); sprintf(search,"%s/saltro%d-mcm%d-c%d-pedestal-event?-g%d-s%d-p%d.pdf",dir, saltronb,mcmnb,chipaddress,gain,shaper,polarity); } else { sscanf(file,"saltro%d-mcm%d-c%d-pedestal-g%d-s%d-p%d-sh.csv", &saltronb,&mcmnb,&chipaddress,&gain,&shaper,&polarity); // printf("saltro%d-mcm%d-c%d-pedestal-g%d-s%d-p%d-sh.csv\n", // saltronb,mcmnb,chipaddress,gain,shaper,polarity); sprintf(search,"%s/saltro%d-mcm%d-c%d-pedestal-event?-g%d-s%d-p%d-sh.pdf",dir, saltronb,mcmnb,chipaddress,gain,shaper,polarity); } strcpy(csvcontent->testtext,"Pedestals"); csvcontent->saltronb = saltronb; csvcontent->dcladdress = mcmnb; csvcontent->chipaddress = chipaddress; strcpy(csvcontent->gain,gains[gain]); strcpy(csvcontent->shaper,shapers[shaper]); csvcontent->polarity = polarity; csvcontent->pgsource = 3; csvcontent->errorcode = 0; csvcontent->errorcode = getErrorEntry(file); sprintf(csvcontent->testfile,"pedestals.txt"); glob_t globbuf; if (0==glob(search, 0, NULL, &globbuf)){ char **a=globbuf.gl_pathv; char *pos; // puts("MATCHES"); for(;*a;a++) { pos = rindex(*a,'/'); pos++; if (seturl != 0) { sprintf(csvcontent->linkpdf2,"\"=HYPERLINK(\"\"%s/pdf/%s\"\",\"\"%s\"\")\"",url,pos,"Event"); } else { sprintf(csvcontent->linkpdf2,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,pos,"Event"); } } } globfree(&globbuf); return 0; } int csvPedsub(char *file, CSVCONTENT *csvcontent) { int saltronb,mcmnb,chipaddress,gain,shaper,polarity,source; if (strstr(file,"-sh.csv") == NULL) { sscanf(file,"saltro%d-mcm%d-c%d-pedsub-g%d-s%d-p%d-s%d.csv", &saltronb,&mcmnb,&chipaddress,&gain,&shaper,&polarity,&source); // printf("saltro%d-mcm%d-c%d-pedestal-g%d-s%d-p%d-s%d.csv\n", // saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf2,"saltro%d-mcm%d-c%d-pedsub-peaktype0-g%d-s%d-p%d-s%d.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf3,"saltro%d-mcm%d-c%d-pedsub-peaktype1-g%d-s%d-p%d-s%d.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf4,"saltro%d-mcm%d-c%d-pedsub-peaktype2-g%d-s%d-p%d-s%d.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); } else { sscanf(file,"saltro%d-mcm%d-c%d-pedsub-g%d-s%d-p%d-s%d-sh.csv", &saltronb,&mcmnb,&chipaddress,&gain,&shaper,&polarity,&source); // printf("saltro%d-mcm%d-c%d-pedsub-g%d-s%d-p%d-s%d-sh.csv\n", // saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf2,"saltro%d-mcm%d-c%d-pedsub-peaktype0-g%d-s%d-p%d-s%d-sh.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf3,"saltro%d-mcm%d-c%d-pedsub-peaktype1-g%d-s%d-p%d-s%d-sh.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf4,"saltro%d-mcm%d-c%d-pedsub-peaktype2-g%d-s%d-p%d-s%d-sh.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); } if (seturl != 0) { sprintf(csvcontent->linkpdf2,"\"=HYPERLINK(\"\"%s/pdf/%s\"\",\"\"%s\"\")\"",url,csvcontent->filepdf2,"Peaktype0"); sprintf(csvcontent->linkpdf3,"\"=HYPERLINK(\"\"%s/pdf/%s\"\",\"\"%s\"\")\"",url,csvcontent->filepdf3,"Peaktype1"); sprintf(csvcontent->linkpdf4,"\"=HYPERLINK(\"\"%s/pdf/%s\"\",\"\"%s\"\")\"",url,csvcontent->filepdf3,"Peaktype2"); } else { sprintf(csvcontent->linkpdf2,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,csvcontent->filepdf2,"Peaktype0"); sprintf(csvcontent->linkpdf3,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,csvcontent->filepdf3,"Peaktype1"); sprintf(csvcontent->linkpdf4,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,csvcontent->filepdf4,"Peaktype2"); } strcpy(csvcontent->testtext,"Pedsub"); csvcontent->saltronb = saltronb; csvcontent->dcladdress = mcmnb; csvcontent->chipaddress = chipaddress; strcpy(csvcontent->gain,gains[gain]); strcpy(csvcontent->shaper,shapers[shaper]); csvcontent->polarity = polarity; csvcontent->pgsource = source; csvcontent->errorcode = 0; csvcontent->errorcode = getErrorEntry(file); sprintf(csvcontent->testfile,"pedsub.txt"); return 0; } int csvZerosup(char *file, CSVCONTENT *csvcontent) { int saltronb,mcmnb,chipaddress,gain,shaper,polarity,source; if (strstr(file,"-sh.csv") == NULL) { sscanf(file,"saltro%d-mcm%d-c%d-zerosup-g%d-s%d-p%d-s%d.csv", &saltronb,&mcmnb,&chipaddress,&gain,&shaper,&polarity,&source); // printf("saltro%d-mcm%d-c%d-zerosup-g%d-s%d-p%d-s%d.csv\n", // saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf2,"saltro%d-mcm%d-c%d-zerosup-peaktype0-g%d-s%d-p%d-s%d.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf3,"saltro%d-mcm%d-c%d-zerosup-peaktype1-g%d-s%d-p%d-s%d.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf4,"saltro%d-mcm%d-c%d-zerosup-peaktype2-g%d-s%d-p%d-s%d.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); } else { sscanf(file,"saltro%d-mcm%d-c%d-zerosup-g%d-s%d-p%d-s%d-sh.csv", &saltronb,&mcmnb,&chipaddress,&gain,&shaper,&polarity,&source); // printf("saltro%d-mcm%d-c%d-zerosup-g%d-s%d-p%d-s%d-sh.csv\n", // saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf2,"saltro%d-mcm%d-c%d-zerosup-peaktype0-g%d-s%d-p%d-s%d-sh.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf3,"saltro%d-mcm%d-c%d-zerosup-peaktype1-g%d-s%d-p%d-s%d-sh.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); sprintf(csvcontent->filepdf4,"saltro%d-mcm%d-c%d-zerosup-peaktype2-g%d-s%d-p%d-s%d-sh.pdf", saltronb,mcmnb,chipaddress,gain,shaper,polarity,source); } if (seturl != 0) { sprintf(csvcontent->linkpdf2,"\"=HYPERLINK(\"\"%s/pdf/%s\"\",\"\"%s\"\")\"",url,csvcontent->filepdf2,"Peaktype0"); sprintf(csvcontent->linkpdf3,"\"=HYPERLINK(\"\"%s/pdf/%s\"\",\"\"%s\"\")\"",url,csvcontent->filepdf3,"Peaktype1"); sprintf(csvcontent->linkpdf4,"\"=HYPERLINK(\"\"%s/pdf/%s\"\",\"\"%s\"\")\"",url,csvcontent->filepdf3,"Peaktype2"); } else { sprintf(csvcontent->linkpdf2,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,csvcontent->filepdf2,"Peaktype0"); sprintf(csvcontent->linkpdf3,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,csvcontent->filepdf3,"Peaktype1"); sprintf(csvcontent->linkpdf4,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,csvcontent->filepdf4,"Peaktype2"); } strcpy(csvcontent->testtext,"Zerosup"); csvcontent->saltronb = saltronb; csvcontent->dcladdress = mcmnb; csvcontent->chipaddress = chipaddress; strcpy(csvcontent->gain,gains[gain]); strcpy(csvcontent->shaper,shapers[shaper]); csvcontent->polarity = polarity; csvcontent->pgsource = source; csvcontent->errorcode = 0; csvcontent->errorcode = getErrorEntry(file); sprintf(csvcontent->testfile,"zerosup.txt"); return 0; } int main(int argc, char *argv[]) { CSVCONTENT csvcontent; FILE *fin; FILE *fcsv; char buffer[512]; char filename[128]; int testtype; // Parameters if (getParameters(argc,argv) != 0) return(1); printf("Arguments: csvfile %s infile %s\n",csvfile,infile); fin = fopen(infile,"r"); if (fin == NULL) { printf("%s: could not open input file %s\n",argv[0],infile); return 2; } fcsv = fopen(csvfile,"w"); if (fcsv == NULL) { printf("%s: could not open csv file %s\n",argv[0],csvfile); fclose(fin); return 2; } fprintf(fcsv,"TestText,Gain,Shaper,Polarity,PgSource,Error,Link,Pdf1\n"); while (fgets(buffer,sizeof(buffer),fin)) { // printf("%s",buffer); if (buffer[0] != '#') { sscanf(buffer,"%d,%s",&testtype,filename); // printf("%d %s\n",testtype,filename); strcpy(csvcontent.testtext,""); memset(&csvcontent,0,sizeof(csvcontent)); // sprintf(csvcontent.link,"\"=HYPERLINK(\"\"http://www.hep.lu.se/eudet/pictures/mcmtests/20220924/csv/%s\"\",\"\"%s\"\")\"",filename,filename); switch (testtype) { case 1: csvLvcard(filename,&csvcontent);break; case 2: csvRamp(filename,&csvcontent);break; case 3: csvPedestal(filename,&csvcontent);break; case 4: csvPedestal(filename,&csvcontent);break; case 5: csvPedsub(filename,&csvcontent);break; case 6: csvPedsub(filename,&csvcontent);break; case 7: csvZerosup(filename,&csvcontent);break; case 8: csvZerosup(filename,&csvcontent);break; case 9: csvBits(filename,&csvcontent);break; case 10: csvRegtest(filename,&csvcontent);break; case 11: csvAddrtest(filename,&csvcontent);break; default: printf("Unknown testtype: %d %s\n",testtype,filename); break; } // Prepare link for pdf file // check if files exist with 'stat' sprintf(csvcontent.filepdf1,"%s",filename); char *pos = strstr(csvcontent.filepdf1,".csv"); strcpy(pos,".pdf"); sprintf(buffer,"%s/%s",dir,csvcontent.filepdf1); struct stat fileBuffer; if (stat (buffer, &fileBuffer) != 0) csvcontent.filepdf1[0] = '\0'; if (seturl != 0) { sprintf(csvcontent.link,"\"=HYPERLINK(\"\"%s/csv/%s\"\",\"\"%s\"\")\"",url,filename,filename); if (strlen(csvcontent.filepdf1) != 0) { sprintf(csvcontent.linkpdf1,"\"=HYPERLINK(\"\"%s/pdf/%s\"\",\"\"%s\"\")\"",url,csvcontent.filepdf1,csvcontent.filepdf1); } sprintf(csvcontent.testlink,"\"=HYPERLINK(\"\"%s/csv/%s\"\",\"\"%s\"\")\"",url,csvcontent.testfile,csvcontent.testtext); } else { sprintf(csvcontent.link,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,filename,filename); if (strlen(csvcontent.filepdf1) != 0) { sprintf(csvcontent.linkpdf1,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,csvcontent.filepdf1,csvcontent.filepdf1); } sprintf(csvcontent.testlink,"\"=HYPERLINK(\"\"file:///%s/%s\"\",\"\"%s\"\")\"",dir,csvcontent.testfile,csvcontent.testtext); } fprintf(fcsv,"%s,%s,%s,%d,%d,%08X,%s,%s,%s,%s,%s\n", csvcontent.testlink,csvcontent.gain,csvcontent.shaper,csvcontent.polarity, csvcontent.pgsource,csvcontent.errorcode,csvcontent.link, csvcontent.linkpdf1,csvcontent.linkpdf2,csvcontent.linkpdf3,csvcontent.linkpdf4); } } fclose(fin); return (0); }