e70152e44cc66cc599ff6b699eb8adc07f3e656a kent Sat May 24 21:09:34 2014 -0700 Adding Copyright NNNN Regents of the University of California to all files I believe with reasonable certainty were developed under UCSC employ or as part of Genome Browser copyright assignment. diff --git src/hg/lib/bioImage.c src/hg/lib/bioImage.c index e54c792..20c66f0 100644 --- src/hg/lib/bioImage.c +++ src/hg/lib/bioImage.c @@ -1,309 +1,312 @@ /* bioImage.h - Interface to bioImage database. */ +/* Copyright (C) 2014 The Regents of the University of California + * See README in this or parent directory for licensing information. */ + #include "common.h" #include "hash.h" #include "dystring.h" #include "jksql.h" #include "portable.h" #include "bioImage.h" static char *somePath(struct sqlConnection *conn, int id, char *locationField) /* Fill in path based on given location field */ { char query[256], path[PATH_LEN]; struct sqlResult *sr; char **row; sqlSafef(query, sizeof(query), "select location.name,image.fileName from image,location" " where image.id = %d and location.id=image.%s", id, locationField); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) == NULL) errAbort("No image of id %d", id); safef(path, PATH_LEN, "%s/%s", row[0], row[1]); sqlFreeResult(&sr); return cloneString(path); } char *bioImageFullSizePath(struct sqlConnection *conn, int id) /* Fill in path for full image bioImage of given id. */ { return somePath(conn, id, "fullLocation"); } char *bioImageScreenSizePath(struct sqlConnection *conn, int id) /* Fill in path for screen-sized (~700x700) image bioImage of given id. */ { return somePath(conn, id, "screenLocation"); } char *bioImageThumbSizePath(struct sqlConnection *conn, int id) /* Fill in path for thumbnail image (~200x200) bioImage of given id. */ { return somePath(conn, id, "thumbLocation"); } static char *cloneOrNull(char *s) /* Return copy of string, or NULL if it is empty */ { if (s == NULL || s[0] == 0) return NULL; return cloneString(s); } char *bioImageOrganism(struct sqlConnection *conn, int id) /* Return binomial scientific name of organism associated with given image. * FreeMem this when done. */ { char query[256], buf[256]; sqlSafef(query, sizeof(query), "select uniProt.taxon.binomial from image,uniProt.taxon" " where image.id = %d and image.taxon = uniProt.taxon.id", id); return cloneOrNull(sqlQuickQuery(conn, query, buf, sizeof(buf))); } char *bioImageStage(struct sqlConnection *conn, int id, boolean doLong) /* Return string describing growth stage of organism * FreeMem this when done. */ { char query[256], buf[256]; boolean isEmbryo; double daysPassed; char *startMarker; struct sqlResult *sr; char **row; sqlSafef(query, sizeof(query), "select isEmbryo,age from image where id = %d", id); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) == NULL) errAbort("No image of id %d", id); isEmbryo = differentString(row[0], "0"); daysPassed = atof(row[1]); if (doLong) { if (isEmbryo) startMarker = "fertilization"; else startMarker = "birth"; safef(buf, sizeof(buf), "%3.1f days after %s", daysPassed, startMarker); } else { char c; if (isEmbryo) c = 'e'; else c = 'n'; safef(buf, sizeof(buf), "%c%3.1f", c, daysPassed); } sqlFreeResult(&sr); return cloneString(buf); } char *bioImageGeneName(struct sqlConnection *conn, int id) /* Return gene name - HUGO if possible, RefSeq/GenBank, etc if not. */ { char query[256], buf[256]; sqlSafef(query, sizeof(query), "select gene from image where id=%d", id); sqlNeedQuickQuery(conn, query, buf, sizeof(buf)); if (buf[0] == 0) { sqlSafef(query, sizeof(query), "select refSeq from image where id=%d", id); sqlNeedQuickQuery(conn, query, buf, sizeof(buf)); if (buf[0] == 0) { sqlSafef(query, sizeof(query), "select genbank from image where id=%d", id); sqlNeedQuickQuery(conn, query, buf, sizeof(buf)); if (buf[0] == 0) { char locusLink[32]; sqlSafef(query, sizeof(query), "select locusLink from image where id=%d", id); sqlNeedQuickQuery(conn, query, locusLink, sizeof(locusLink)); if (locusLink[0] == 0) { sqlSafef(query, sizeof(query), "select submitId from image where id=%d", id); sqlNeedQuickQuery(conn, query, buf, sizeof(buf)); } else { safef(buf, sizeof(buf), "NCBI Gene ID #%s", locusLink); } } } } return cloneString(buf); } char *bioImageAccession(struct sqlConnection *conn, int id) /* Return RefSeq/Genbank accession or n/a if none available. */ { char query[256], buf[256]; sqlSafef(query, sizeof(query), "select refSeq from image where id=%d", id); sqlNeedQuickQuery(conn, query, buf, sizeof(buf)); if (buf[0] == 0) { sqlSafef(query, sizeof(query), "select genbank from image where id=%d", id); sqlNeedQuickQuery(conn, query, buf, sizeof(buf)); } return cloneOrNull(buf); } char *bioImageSubmitId(struct sqlConnection *conn, int id) /* Return submitId for image. */ { char query[256], buf[256]; sqlSafef(query, sizeof(query), "select submitId from image" " where image.id=%d", id); return cloneString(sqlQuickQuery(conn, query, buf, sizeof(buf))); } char *bioImageType(struct sqlConnection *conn, int id) /* Return RefSeq/Genbank accession or NULL if none available. * FreeMem this when done. */ { char query[256], buf[256]; sqlSafef(query, sizeof(query), "select imageType.name from image,imageType " "where image.id=%d and imageType.id = image.imageType", id); return cloneOrNull(sqlQuickQuery(conn, query, buf, sizeof(buf))); } static char *indirectString(struct sqlConnection *conn, int id, char *table, char *valField) /* Return value on table that is connected via id to image. */ { char query[256], buf[512]; sqlSafef(query, sizeof(query), "select %s.%s from image,%s " "where image.id=%d and image.%s = %s.id", table, valField, table, id, table, table); return cloneOrNull(sqlQuickQuery(conn, query, buf, sizeof(buf))); } char *bioImageBodyPart(struct sqlConnection *conn, int id) /* Return body part if any. */ { return indirectString(conn, id, "bodyPart", "name"); } char *bioImageSliceType(struct sqlConnection *conn, int id) /* Return slice type if any. */ { return indirectString(conn, id, "sliceType", "name"); } char *bioImageTreatment(struct sqlConnection *conn, int id) /* Return treatment if any. */ { return indirectString(conn, id, "treatment", "conditions"); } static char *submissionSetPart(struct sqlConnection *conn, int id, char *field) /* Return field from submissionSet that is linked to image. */ { return indirectString(conn, id, "submissionSet", field); } char *bioImageContributors(struct sqlConnection *conn, int id) /* Return comma-separated list of contributors in format Kent W.H, Wu F.Y. */ { return submissionSetPart(conn, id, "contributors"); } char *bioImagePublication(struct sqlConnection *conn, int id) /* Return name of publication associated with image if any. * FreeMem this when done. */ { return submissionSetPart(conn, id, "publication"); } char *bioImagePubUrl(struct sqlConnection *conn, int id) /* Return url of publication associated with image if any. * FreeMem this when done. */ { return submissionSetPart(conn, id, "pubUrl"); } char *bioImageSetUrl(struct sqlConnection *conn, int id) /* Return contributor url associated with image set if any. * FreeMem this when done. */ { return submissionSetPart(conn, id, "setUrl"); } char *bioImageItemUrl(struct sqlConnection *conn, int id) /* Return contributor url associated with this image. * Substitute in submitId for %s before using. May be null. * FreeMem when done. */ { return submissionSetPart(conn, id, "itemUrl"); } struct slInt *bioImageOnSameGene(struct sqlConnection *conn, int id) /* Get bio images that are on same gene. Do slFreeList when done. */ { struct dyString *dy = dyStringNew(0); struct sqlResult *sr; char **row; char *gene, *refSeq, *locusLink, *genbank, *submitId; int submissionSet; struct slInt *list = NULL, *el; /* Fetch all the gene ID data. */ sqlDyStringPrintf(dy, "select gene,refSeq,locusLink,genBank,submitId,submissionSet " "from image where id=%d", id); sr = sqlGetResult(conn, dy->string); if ((row = sqlNextRow(sr)) == NULL) errAbort("Can't find image #%d in bioImage database", id); gene = cloneOrNull(row[0]); refSeq = cloneOrNull(row[1]); locusLink = cloneOrNull(row[2]); genbank = cloneOrNull(row[3]); submitId = cloneOrNull(row[4]); submissionSet = atoi(row[5]); sqlFreeResult(&sr); /* Fetch everything that refers to same gene. */ dyStringClear(dy); sqlDyStringPrintf(dy, "select id from image "); dyStringPrintf(dy, "where (image.submissionSet=%d and image.submitId='%s') ", submissionSet, submitId); if (gene != NULL) sqlDyStringPrintf(dy, "or image.gene = '%s' ", gene); if (refSeq != NULL) sqlDyStringPrintf(dy, "or image.refSeq = '%s' ", refSeq); if (locusLink != NULL) sqlDyStringPrintf(dy, "or image.locusLink = '%s' ", locusLink); if (genbank != NULL) sqlDyStringPrintf(dy, "or image.genbank = '%s' ", genbank); dyStringPrintf(dy, "order by priority"); sr = sqlGetResult(conn, dy->string); while ((row = sqlNextRow(sr)) != NULL) { el = slIntNew(atoi(row[0])); slAddHead(&list, el); } slReverse(&list); sqlFreeResult(&sr); /* Clean up and return */ freeMem(gene); freeMem(refSeq); freeMem(locusLink); freeMem(genbank); freeMem(submitId); dyStringFree(&dy); return list; }