static int translate_chromosomepos_universal (unsigned int *genomicstart, unsigned int *genomiclength, char *chromosome, unsigned int left, unsigned int length, IIT_T chromosome_iit) { int rc = 1, index; Interval_T interval; #ifdef DEBUG bool allocp; #endif if ((index = IIT_find_linear(chromosome_iit,chromosome)) >= 0) { debug(printf("chromosome %s => index %d\n",chromosome,index)); interval = IIT_interval(chromosome_iit,index); debug(printf(" => label %s with interval low %u\n", IIT_label(chromosome_iit,index,&allocp),Interval_low(interval))); *genomicstart = Interval_low(interval)+left; if (*genomicstart < Interval_low(interval)) { fprintf(stderr,"%u + %u = %u (exceeds a 32-bit unsigned int)\n", Interval_low(interval),left,*genomicstart); exit(9); } if (length == 0) { *genomiclength = Interval_length(interval)-left; } else { *genomiclength = length; } rc = 0; } return rc; }
static char check_acgt (char nt, IIT_T snps_iit, int divno, int i) { int index; char *label; bool allocp; if (nt == 'N') { return nt; } else if (nt != 'A' && nt != 'C' && nt != 'G' && nt != 'T') { index = IIT_index(snps_iit,divno,i); label = IIT_label(snps_iit,index,&allocp); fprintf(stderr,"\nFor %s, alternate allele %c is not ACGT, so using 'N' as alternate allele", label,nt); if (allocp) { FREE(label); } return 'N'; } else { return nt; } }
/* Need to store just the part of the query specified (e.g., 1..10) */ static void print_interval_runlength (Chrpos_T *lastcoord, char *divstring, Chrpos_T coordstart, Chrpos_T coordend, int indexi, IIT_T iit, bool zeroesp) { Interval_T interval; char *label; bool allocp; Chrpos_T chrpos, intervalend; int value; label = IIT_label(iit,indexi,&allocp); value = atoi(label); interval = IIT_interval(iit,indexi); chrpos = Interval_low(interval); intervalend = Interval_high(interval); if (zeroesp == true) { while (*lastcoord < chrpos) { printf("%s\t%u\t%d\n",divstring,*lastcoord,0); (*lastcoord)++; } } while (chrpos < coordstart) { chrpos++; } while (chrpos <= intervalend && chrpos <= coordend) { printf("%s\t%u\t%d\n",divstring,chrpos,value); chrpos++; } *lastcoord = chrpos; if (allocp == true) { FREE(label); } return; }
/* coordstart used only if centerp or tallyp is true */ static long int print_interval (Chrpos_T *lastcoord, long int total, char *divstring, Chrpos_T coordstart, Chrpos_T coordend, int index, IIT_T iit, int ndivs, int fieldint) { Interval_T interval; char *label, *annotation, *restofheader; bool allocp; if (centerp == true) { print_interval_centered(divstring,coordstart,index,iit,fieldint); return 0; } else if (tallyp == true) { total += print_interval_tally(&(*lastcoord),divstring,coordstart,coordend,index,iit,zeroesp); return total; } else if (runlengthp == true) { print_interval_runlength(&(*lastcoord),divstring,coordstart,coordend,index,iit,zeroesp); return 0; } if (annotationonlyp == false) { label = IIT_label(iit,index,&allocp); printf(">%s ",label); if (allocp == true) { FREE(label); } if (ndivs > 1) { if (divstring == NULL) { /* For example, if interval was retrieved by label */ divstring = IIT_divstring_from_index(iit,index); } printf("%s:",divstring); } debug(printf("index is %d\n",index)); interval = IIT_interval(iit,index); if (signedp == false) { printf("%u..%u",Interval_low(interval),Interval_high(interval)); } else if (Interval_sign(interval) < 0) { printf("%u..%u",Interval_high(interval),Interval_low(interval)); } else { printf("%u..%u",Interval_low(interval),Interval_high(interval)); } if (Interval_type(interval) > 0) { printf(" %s",IIT_typestring(iit,Interval_type(interval))); } #if 0 /* Unnecessary because of "\n" after restofheader below */ if (IIT_version(iit) < 5) { printf("\n"); } #endif } if (fieldint < 0) { annotation = IIT_annotation(&restofheader,iit,index,&allocp); printf("%s\n",restofheader); printf("%s",annotation); if (allocp == true) { FREE(restofheader); } } else { annotation = IIT_annotation(&restofheader,iit,index,&allocp); printf("%s\n",restofheader); if (allocp == true) { FREE(restofheader); } annotation = IIT_fieldvalue(iit,index,fieldint); printf("%s\n",annotation); FREE(annotation); } return 0; }
/* Need to store just the part of the query specified (e.g., 1..10) */ static void print_interval_centered (char *divstring, Chrpos_T coordstart, int index, IIT_T iit, int fieldint) { Interval_T interval; char *label, *annotation, *restofheader, centerchar; bool allocp; int annotlength, left, centerpos; if (fieldint < 0) { annotation = IIT_annotation(&restofheader,iit,index,&allocp); if (allocp == true) { FREE(restofheader); } } else { annotation = IIT_fieldvalue(iit,index,fieldint); allocp = true; } annotlength = strlen(annotation); if (annotation[annotlength-1] == '\n') { annotlength--; } interval = IIT_interval(iit,index); left = coordstart - Interval_low(interval); /* + length(query) - queryend */ if (Interval_sign(interval) < 0) { centerpos = annotlength-left-1; } else { centerpos = left; } centerchar = annotation[centerpos]; if (centeruc == true && islower(centerchar)) { if (fieldint >= 0 && allocp == true) { FREE(annotation); } } else { print_spaces(centerlength-left); if (Interval_sign(interval) < 0) { print_complement(annotation,annotlength-1,centerpos+1); printf("[%c]",complCode[(int) centerchar]); print_complement(annotation,centerpos-1,0); } else { print_forward(annotation,0,centerpos-1); printf("[%c]",centerchar); print_forward(annotation,centerpos+1,annotlength-1); } print_spaces(centerlength+left-annotlength); if (fieldint >= 0 && allocp == true) { FREE(annotation); } printf("\t"); if (Interval_type(interval) > 0) { printf("%s\t",IIT_typestring(iit,Interval_type(interval))); } if (divstring != NULL) { if (Interval_sign(interval) < 0) { printf("-%s:",divstring); } else { printf("+%s:",divstring); } } if (signedp == false) { printf("%u..%u",Interval_low(interval),Interval_high(interval)); } else if (Interval_sign(interval) < 0) { printf("%u..%u",Interval_high(interval),Interval_low(interval)); } else { printf("%u..%u",Interval_low(interval),Interval_high(interval)); } printf("\t"); label = IIT_label(iit,index,&allocp); printf("%s",label); if (allocp == true) { FREE(label); } printf("\n"); } return; }