void copyPslXaToTab(char *pslFile, char *tabFile) /* copy a single PSL XA to the tab file */ { struct xAli *xa; char *row[23]; struct lineFile *lf = lineFileOpen(pslFile, TRUE); struct pipeline *pl = NULL; FILE *tabFh = NULL; if (noSort) tabFh = mustOpen(tabFile, "w"); else { if (pslCreateOpts & PSL_WITH_BIN) pl = pipelineOpen(outPipeBin, pipelineWrite, tabFile, NULL); else pl = pipelineOpen(outPipeNoBin, pipelineWrite, tabFile, NULL); tabFh = pipelineFile(pl); } while (lineFileRow(lf, row)) { xa = xAliLoad(row); if (pslCreateOpts & PSL_WITH_BIN) fprintf(tabFh, "%u\t", hFindBin(xa->tStart, xa->tEnd)); xAliTabOut(xa, tabFh); xAliFree(&xa); } lineFileClose(&lf); if (noSort) carefulClose(&tabFh); else { pipelineWait(pl); pipelineFree(&pl); } }
void copyPslToTab(char *pslFile, char *tabFile) /* copy a single PSL to the tab file */ { struct psl *psl; struct lineFile *lf = pslFileOpen(pslFile); struct pipeline *pl = NULL; FILE *tabFh = NULL; if (noSort) tabFh = mustOpen(tabFile, "w"); else { if (pslCreateOpts & PSL_WITH_BIN) pl = pipelineOpen(outPipeBin, pipelineWrite, tabFile, NULL); else pl = pipelineOpen(outPipeNoBin, pipelineWrite, tabFile, NULL); tabFh = pipelineFile(pl); } while ((psl = pslNext(lf)) != NULL) { if (pslCreateOpts & PSL_WITH_BIN) fprintf(tabFh, "%u\t", hFindBin(psl->tStart, psl->tEnd)); pslTabOut(psl, tabFh); pslFree(&psl); } lineFileClose(&lf); if (noSort) carefulClose(&tabFh); else { pipelineWait(pl); pipelineFree(&pl); } }
struct pipeline *pipelineOpen1(char **cmd, unsigned opts, char *otherEndFile, char *stderrFile) /* like pipelineOpen(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpen(cmds, opts, otherEndFile, stderrFile); }
static void runCommandAppend(char *cmd[], char *program, char *inFile, char *outFile) /* Use the pipeline module to run a single command pipelineWrite|pipelineAppend. */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; cmd[0] = program; cmd[1] = inFile; struct pipeline *pl = pipelineOpen(cmds, pipelineWrite|pipelineAppend, outFile, NULL); pipelineClose(&pl); }
static struct pipeline *openPslSortPipe(char *pslFile) /* open pipeline that sorts psl */ { static char *zcatCmd[] = {"zcat", NULL}; static char *bzcatCmd[] = {"zcat", NULL}; static char *sortCmd[] = {"sort", "-k", "14,14", "-k", "16,16n", "-k", "17,17nr", NULL}; int iCmd = 0; char **cmds[3]; if (endsWith(pslFile, ".gz") || endsWith(pslFile, ".Z")) cmds[iCmd++] = zcatCmd; else if (endsWith(pslFile, ".bz2")) cmds[iCmd++] = bzcatCmd; cmds[iCmd++] = sortCmd; cmds[iCmd++] = NULL; return pipelineOpen(cmds, pipelineRead, pslFile, NULL); }
static void generateImgFiles(struct hgdpGeo *geo, char finalEpsFile[PATH_LEN], char finalPdfFile[PATH_LEN], char finalPngFile[PATH_LEN]) /* Using the frequencies given in geo and the population latitude and longitude * given above, plot allele frequency pie charts for each population on a world map. * Work in a temporary trash dir and then move result files to the given paths. */ { // The Generic Mapping Tools commands must have a writeable ./ and $HOME. // Use trashDirFile as a directory name, cd to that and work there. char cwd[PATH_LEN]; if (getcwd(cwd, sizeof(cwd)) == NULL) errAbort("PATH_LEN (%d) is too short.", PATH_LEN); struct tempName dirTn; trashDirFile(&dirTn, "hgc", "hgdpGeo", ""); makeDirs(dirTn.forCgi); mustChdir(dirTn.forCgi); char *realHome = getenv("HOME"); setenv("HOME", ".", TRUE); // Make trash files with coordinate specs for pie charts and full circles: char rootName[FILENAME_LEN]; splitPath(dirTn.forCgi, NULL, rootName, NULL); char pieFile[FILENAME_LEN], circleFile[FILENAME_LEN]; safef(pieFile, sizeof(pieFile), "%s_pie.txt", rootName); safef(circleFile, sizeof(circleFile), "%s_circle.txt", rootName); FILE *fPie = mustOpen(pieFile, "w"); FILE *fCir = mustOpen(circleFile, "w"); int i; for (i = 0; i < HGDPGEO_POP_COUNT; i++) { FILE *f = (geo->popFreqs[i] == 1.0) ? fCir : fPie; fprintf(f, "%.4f %.4f 0.65 0 %.4f\n", pops[i].latitude, pops[i].longitude, geo->popFreqs[i]*360); } fclose(fPie); fclose(fCir); // Build up an EPS image: copy a baseline EPS (map background), add SNP and allele labels, // and use ps2xy commands to allele frequency pie charts. char epsFile[FILENAME_LEN]; safef(epsFile, sizeof(epsFile), "%s.eps", rootName); char mapBgEps[PATH_LEN]; safef(mapBgEps, sizeof(mapBgEps), "%s/hgcData/hgdpGeoMap.eps", cwd); copyFile(mapBgEps, epsFile); FILE *fEps = mustOpen(epsFile, "a"); fprintf(fEps, hgdpGeoLabelFormat, geo->name, geo->name, geo->ancestralAllele, geo->ancestralAllele, geo->derivedAllele, geo->derivedAllele); fclose(fEps); //- run psxy on circle/pie spec trash files for AfrEurAsia and America char *psxy = cfgOption("hgc.psxyPath"); if (isEmpty(psxy)) errAbort("How did this get called? hg.conf doesn't have hgc.psxyPath."); runCommandAppend(psxyOrangeAeaCmd, psxy, pieFile, epsFile); runCommandAppend(psxyPieAeaCmd, psxy, pieFile, epsFile); runCommandAppend(psxyBlueAeaCmd, psxy, circleFile, epsFile); runCommandAppend(psxyOrangeAmCmd, psxy, pieFile, epsFile); runCommandAppend(psxyPieAmCmd, psxy, pieFile, epsFile); runCommandAppend(psxyBlueAmCmd, psxy, circleFile, epsFile); // Make PDF and PNG: struct pipeline *pl; char pdfFile[FILENAME_LEN], pngFile[FILENAME_LEN]; safef(pdfFile, sizeof(pdfFile), "%s.pdf", rootName); safef(pngFile, sizeof(pngFile), "%s.png", rootName); char *ps2pdfCmd[] = {"ps2pdf", epsFile, pdfFile, NULL}; char **cmdsPdf[] = {ps2pdfCmd, NULL}; pl = pipelineOpen(cmdsPdf, pipelineWrite, "/dev/null", NULL); pipelineClose(&pl); char *ps2raster = cfgOption("hgc.ps2rasterPath"); char *ghostscript = cfgOption("hgc.ghostscriptPath"); char gsOpt[PATH_LEN]; safef(gsOpt, sizeof(gsOpt), "-G%s", ghostscript); char *ps2RasterPngCmd[] = {ps2raster, gsOpt, "-P", "-A", "-Tg", "-E150", epsFile, NULL}; char **cmdsPng[] = {ps2RasterPngCmd, NULL}; pl = pipelineOpen(cmdsPng, pipelineRead, "/dev/null", NULL); pipelineClose(&pl); // Back to our usual working directory and $HOME: if (realHome == NULL) unsetenv("HOME"); else setenv("HOME", realHome, TRUE); mustChdir(cwd); // Move the result files into place: char tmpPath[PATH_LEN]; safef(tmpPath, sizeof(tmpPath), "%s/%s", dirTn.forCgi, epsFile); mustRename(tmpPath, finalEpsFile); safef(tmpPath, sizeof(tmpPath), "%s/%s", dirTn.forCgi, pdfFile); mustRename(tmpPath, finalPdfFile); safef(tmpPath, sizeof(tmpPath), "%s/%s", dirTn.forCgi, pngFile); mustRename(tmpPath, finalPngFile); // Clean up the temporary working directory (trash cleaner script doesn't // remove empty dirs: removeDir(dirTn.forCgi); }