void nibbParseImageDir(char *sourceDir, char *goodTab, char *badTab) /* nibbParseImageDir - Look through nibb image directory and allowing for * typos and the like create a table that maps a file name to clone name, * developmental stage, and view of body part. */ { struct fileInfo *l1List, *l1, *l2List, *l2, *l3List, *l3; struct hash *stageHash = hashNew(0); struct hash *viewHash = hashNew(0); struct hash *otherHash = hashNew(0); struct hash *probeHash = hashNew(0); struct hash *fixHash = hashFixers(); struct imageInfo *imageList = NULL, *image; FILE *good = mustOpen(goodTab, "w"); FILE *bad = mustOpen(badTab, "w"); int goodCount = 0, badCount = 0; int jpgCount = 0, jpgDir = 0; l1List = listDirX(sourceDir, "XL*", FALSE); for (l1 = l1List; l1 != NULL; l1 = l1->next) { char l1Path[PATH_LEN]; safef(l1Path, sizeof(l1Path), "%s/%s", sourceDir, l1->name); l2List = listDirX(l1Path, "XL*", FALSE); for (l2 = l2List; l2 != NULL; l2 = l2->next) { char l2Path[PATH_LEN]; char cloneName[64], *permanentCloneName; char *cloneDir = l2->name; char *cloneEnd; int cloneNameSize = 0; if (stringIx(cloneDir, skipDir) >= 0) continue; /* Figure out clone name, whish is directory component up to * first underbar. */ cloneEnd = strchr(cloneDir, '_'); if (cloneEnd != NULL) cloneNameSize = cloneEnd - cloneDir; else errAbort("Strangely formatted image dir %s, no underbar", cloneDir); if (cloneNameSize >= sizeof(cloneName)) errAbort("Clone name too long in dir %s", cloneDir); if (cloneNameSize < 8 || cloneNameSize > 12) errAbort("Clone name wrong size %s", cloneDir); memcpy(cloneName, cloneDir, cloneNameSize); cloneName[cloneNameSize] = 0; /* Check format is XL###L##. We already checked the XL. */ if (!isdigit(cloneName[2]) || !isdigit(cloneName[3]) || !isdigit(cloneName[4]) || isdigit(cloneName[5]) || !isdigit(cloneName[6]) || !isdigit(cloneName[7])) errAbort("Strangely formatted clone name %s", cloneDir); permanentCloneName = hashStoreName(probeHash, cloneName); /* Get all files in dir. */ safef(l2Path, sizeof(l2Path), "%s/%s/%s", sourceDir, l1->name, l2->name); l3List = listDirX(l2Path, "*.jpg", FALSE); for (l3 = l3List; l3 != NULL; l3 = l3->next) { char *fileName = l3->name; if (stringIx(l3->name, skipFile) >= 0) continue; image = getImageInfo(fixHash, permanentCloneName, l1->name, cloneDir, fileName, stageHash, viewHash, otherHash, probeHash); slAddHead(&imageList, image); ++jpgCount; } ++jpgDir; } } slReverse(&imageList); verbose(1, "%d jpg images in %d directories\n", jpgCount, jpgDir); #ifdef OLD verbose(1, "%d probes, %d stages, %d views, %d other\n", probeHash->elCount, stageHash->elCount, viewHash->elCount, otherHash->elCount); printHash("stages", stageHash); printHash("views", viewHash); printHash("other", otherHash); #endif /* OLD */ for (image = imageList; image != NULL; image = image->next) { if (image->clone != NULL && image->stage != NULL && image->view != NULL) { imageInfoOut(image, good); ++goodCount; } else { imageInfoOut(image, bad); ++badCount; } } verbose(1, "%d (%4.1f%%) parsed ok, %d (%4.2f%%) didn't\n", goodCount, 100.0 * goodCount/(goodCount + badCount), badCount, 100.0 * badCount/(goodCount + badCount)); carefulClose(&good); carefulClose(&bad); }
int wormChromIx(char *name) /* Return index of worm chromosome. */ { return stringIx(name, chromIds); }