EnsPIntron ensIntronNewExons(EnsPExon exon1, EnsPExon exon2) { ajint strand = 0; ajuint start = 0; ajuint end = 0; AjPStr seqname1 = NULL; AjPStr seqname2 = NULL; EnsPFeature feature = NULL; EnsPFeature feature1 = NULL; EnsPFeature feature2 = NULL; EnsPIntron intron = NULL; EnsPSlice slice1 = NULL; EnsPSlice slice2 = NULL; /* ajDebug("ensIntronNew\n" " exon1 %p\n" " exon2 %p\n", exon1, exon2); ensExonTrace(exon1, 1); ensExonTrace(exon2, 1); */ if(!exon1) return NULL; if(!exon2) return NULL; feature1 = ensExonGetFeature(exon1); feature2 = ensExonGetFeature(exon2); slice1 = ensFeatureGetSlice(feature1); slice2 = ensFeatureGetSlice(feature2); seqname1 = ensFeatureGetSequenceName(feature1); seqname2 = ensFeatureGetSequenceName(feature2); /* Both Exons have to be on the same Slice or sequence. */ if(slice1 && slice2 && (!ensSliceMatch(slice1, slice2))) { ajDebug("ensIntronNewExons got Exons on different Slices.\n"); return NULL; } else if(seqname1 && seqname2 && (!ajStrMatchCaseS(seqname1, seqname2))) { ajDebug("ensIntronNewExons got Exons on different sequence names.\n"); return NULL; } else { ajDebug("ensIntronNewExons got Exons on Slice and sequence names.\n"); return NULL; } if(ensFeatureGetStrand(feature1) != ensFeatureGetStrand(feature2)) { ajDebug("ensIntronNewExons got Exons on different strands.\n"); return NULL; } if(ensFeatureGetStrand(feature1) >= 0) { start = ensFeatureGetEnd(feature1) + 1; end = ensFeatureGetStart(feature2) - 1; } else { start = ensFeatureGetEnd(feature2) + 1; end = ensFeatureGetStart(feature1) - 1; } if(start > (end + 1)) { ajDebug("ensIntronNewExons requires that the start coordinate %u " "is less than the end coordinate %u + 1 ", start, end); return NULL; } strand = ensFeatureGetStrand(feature1); if(slice1) feature = ensFeatureNewS((EnsPAnalysis) NULL, slice1, start, end, strand); if(seqname1) feature = ensFeatureNewN((EnsPAnalysis) NULL, seqname1, start, end, strand); if(feature) { AJNEW0(intron); intron->Feature = feature; intron->PreviousExon = ensExonNewRef(exon1); intron->NextExon = ensExonNewRef(exon2); intron->Use = 1; } else ajDebug("ensIntronNewExons could not create an Ensembl Feature.\n"); return intron; }
static AjBool karyotypeBandadaptorFetchAllBySQL(EnsPDatabaseadaptor dba, const AjPStr statement, EnsPAssemblymapper am, EnsPSlice slice, AjPList kblist) { ajuint identifier = 0; ajuint srid = 0; ajuint srstart = 0; ajuint srend = 0; AjPStr name = NULL; AjPStr stain = NULL; AjPSqlstatement sqls = NULL; AjISqlrow sqli = NULL; AjPSqlrow sqlr = NULL; EnsPCoordsystemadaptor csa = NULL; EnsPFeature feature = NULL; EnsPKaryotypeband kb = NULL; EnsPKaryotypebandadaptor kba = NULL; EnsPSlice srslice = NULL; EnsPSliceadaptor sa = NULL; if(!dba) return ajFalse; if(!statement) return ajFalse; (void) am; (void) slice; if(!kblist) return ajFalse; csa = ensRegistryGetCoordsystemadaptor(dba); /* ** AJB: The variable kba, set below, is not used elsewhere ** in the function. Needs fixing appropriately. */ kba = ensRegistryGetKaryotypebandadaptor(dba); sa = ensRegistryGetSliceadaptor(dba); sqls = ensDatabaseadaptorSqlstatementNew(dba, statement); sqli = ajSqlrowiterNew(sqls); while(!ajSqlrowiterDone(sqli)) { identifier = 0; srid = 0; srstart = 0; srend = 0; name = ajStrNew(); stain = ajStrNew(); sqlr = ajSqlrowiterGet(sqli); ajSqlcolumnToUint(sqlr, &identifier); ajSqlcolumnToUint(sqlr, &srid); ajSqlcolumnToUint(sqlr, &srstart); ajSqlcolumnToUint(sqlr, &srend); ajSqlcolumnToStr(sqlr, &name); ajSqlcolumnToStr(sqlr, &stain); /* Need to get the internal Ensembl Sequence Region identifier. */ srid = ensCoordsystemadaptorGetInternalSeqregionIdentifier(csa, srid); /* ** FIXME: karyotype.seq_region_start and karyotype.seq_region_end are ** defined as signed in the tables.sql file. ** All other features use unsigned start and end coordinates. */ ensSliceadaptorFetchBySeqregionIdentifier(sa, srid, 0, 0, 0, &srslice); feature = ensFeatureNewS((EnsPAnalysis) NULL, srslice, srstart, srend, 1); kb = ensKaryotypebandNew(identifier, feature, name, stain); ajListPushAppend(kblist, (void *) kb); ensFeatureDel(&feature); ensSliceDel(&srslice); ajStrDel(&name); ajStrDel(&stain); } ajSqlrowiterDel(&sqli); ajSqlstatementDel(&sqls); return ajTrue; }