4ac9486a77f0ed4e87de2e946f29e203b354398b
markd
  Thu Jun 13 13:56:46 2024 -0700
added chainToBigChain command

diff --git src/hg/utils/chainToBigChain/chainToBigChain.c src/hg/utils/chainToBigChain/chainToBigChain.c
new file mode 100644
index 0000000..2b6cc31
--- /dev/null
+++ src/hg/utils/chainToBigChain/chainToBigChain.c
@@ -0,0 +1,128 @@
+/* chainToBigChain - converts chain to bigChain. */
+#include "common.h"
+#include "options.h"
+#include "linefile.h"
+#include "chain.h"
+#include "bigChain.h"
+#include "bigLink.h"
+
+void usage()
+/* Explain usage and exit. */
+{
+errAbort(
+  "chainToBigChain - converts chain to bigChain input (bed format with extra fields)\n"
+  "usage:\n"
+  "  chainToBigChain chainIn bigChainOut bigLinkOut\n"
+  "\n"
+  "Output will be sorted\n"
+  "\n"
+  "To build bigBed files:\n"
+  "  bedToBigBed -type=bed6+6 -as=bigChain.as -tab data.bigChain hg38.chrom.sizes data.bb\n"
+  "  bedToBigBed -type=bed4+1 -as=bigLink.as -tab data.bigLink hg38.chrom.sizes data.link.bb\n"
+  );
+}
+
+/* Command line validation table. */
+static struct optionSpec options[] = {
+   {NULL, 0},
+};
+
+struct bigChain *chainRecToBigChain(struct chain *chain)
+/* make a bigChain from a chain */
+{
+struct bigChain *bc;
+AllocVar(bc);
+bc->chrom = cloneString(chain->tName);
+bc->chromStart = chain->tStart;
+bc->chromEnd = chain->tEnd;
+char buf[128];
+safef(buf, sizeof(buf), "%d", chain->id);
+bc->name = cloneString(buf);
+bc->score = 1000;
+bc->strand[0] = chain->qStrand;
+bc->tSize = chain->tSize;
+bc->qName = cloneString(chain->qName);
+bc->qSize = chain->qSize;
+bc->qStart = chain->qStart;
+bc->qEnd = chain->qEnd;
+bc->chainScore = chain->score;
+return bc;
+}
+
+struct bigLink *chainBlockToBigLink(struct chain *chain, struct cBlock *cblk)
+/* make a chain link from a chain block */
+{
+struct bigLink *bl;
+AllocVar(bl);
+bl->chrom = cloneString(chain->tName);
+bl->chromStart = cblk->tStart;
+bl->chromEnd = cblk->tEnd;
+char buf[128];
+safef(buf, sizeof(buf), "%d", chain->id);
+bl->name = cloneString(buf);
+bl->qStart = cblk->qStart;
+return bl;
+}
+
+void convertChain(struct chain *chain, struct bigChain **bigChains, struct bigLink **bigLinks)
+/* convert on chain to bigChain and bigLink */
+{
+for (struct cBlock *cblk = chain->blockList; cblk != NULL; cblk = cblk->next)
+    {
+    slAddHead(bigLinks, chainBlockToBigLink(chain, cblk));
+    }
+slAddHead(bigChains, chainRecToBigChain(chain));
+}
+
+static void convertChains(char *chainIn, struct bigChain **bigChains, struct bigLink **bigLinks)
+/* convert all chains to bigChains and links  */
+{
+struct chain *chain;
+struct lineFile *lf = lineFileOpen(chainIn, TRUE);
+while ((chain = chainRead(lf)) != NULL)
+    {
+    convertChain(chain, bigChains, bigLinks);
+    chainFree(&chain);
+    }
+lineFileClose(&lf);
+slSort(bigChains, bigChainCmpTarget);
+slSort(bigLinks, bigLinkCmpTarget);
+}
+
+static void bigChainWrite(char *bigChainOut, struct bigChain *bigChains)
+/* write bigChain records to a tab file */
+{
+FILE *fh = mustOpen(bigChainOut, "w");
+for (struct bigChain *bc = bigChains; bc != NULL; bc = bc->next)
+    bigChainTabOut(bc, fh);
+carefulClose(&fh);
+}
+
+static void bigLinkWrite(char *bigLinkOut, struct bigLink *bigLinks)
+/* write bigLink records to a tab file */
+{
+FILE *fh = mustOpen(bigLinkOut, "w");
+for (struct bigLink *cl = bigLinks; cl != NULL; cl = cl->next)
+    bigLinkTabOut(cl, fh);
+carefulClose(&fh);
+}
+
+static void chainToBigChain(char *chainIn, char *bigChainOut, char *bigLinkOut)
+/* chainToBigChain - converts chains to bigChain and bigLink files. */
+{
+struct bigChain *bigChains = NULL;
+struct bigLink *bigLinks = NULL;
+convertChains(chainIn, &bigChains, &bigLinks);
+bigChainWrite(bigChainOut, bigChains);
+bigLinkWrite(bigLinkOut, bigLinks);
+}
+
+int main(int argc, char *argv[])
+/* Process command line. */
+{
+optionInit(&argc, argv, options);
+if (argc != 4)
+    usage();
+chainToBigChain(argv[1], argv[2], argv[3]);
+return 0;
+}