MapperRangeSet *PredictionTranscript_cDNA2Genomic(PredictionTranscript *trans, int start, int end) { Mapper *mapper; mapper = PredictionTranscript_getcDNACoordMapper(trans); return Mapper_mapCoordinates(mapper, (IDType)trans, start, end, 1, "cdna" ); }
int testTransform(Mapper *mapper, int srcId, int srcStart, int srcEnd, int srcStrand, char *srcType, int dest[][4], int nDest ) { MapperRangeSet *results = Mapper_mapCoordinates(mapper, srcId, srcStart, srcEnd, srcStrand, srcType); printf("\nNew test\n"); int diff = 0; printf("Number of results = %d nDest = %d\n",MapperRangeSet_getNumRange(results), nDest); if (MapperRangeSet_getNumRange(results) != nDest) { diff =1; } else{ int i; for (i=0;i<MapperRangeSet_getNumRange(results) && !diff;i++) { MapperRange *range = MapperRangeSet_getRangeAt(results, i); switch (range->rangeType) { case MAPPERRANGE_COORD : { MapperCoordinate *mc = (MapperCoordinate *)range; printf("Coord: "IDFMTSTR" %ld %ld %d\n", mc->id, mc->start, mc->end, mc->strand); if (dest[i][0] != mc->id || dest[i][1] != mc->start || dest[i][2] != mc->end || dest[i][3] != mc->strand) { diff=1; } } break; case MAPPERRANGE_GAP : { MapperGap *mg = (MapperGap *)range; printf("Gap: %ld %ld\n", mg->start, mg->end); if (dest[i][0] != srcId || dest[i][1] != mg->start || dest[i][2] != mg->end || dest[i][3] != 0) { diff=1; } } break; default: { printf("Unhandled range type %d\n",range->rangeType); diff=1; } break; } } } if (diff) { printf("DIFFERENCE\n"); } return 1; }
MapperRangeSet *PredictionTranscript_genomic2cDNA(PredictionTranscript *trans, int start, int end, int strand, BaseContig *contig) { Mapper *mapper; // "ids" in mapper are contigs of exons, so use the same contig that should // be attached to all of the exons... if (!contig) { Vector *translateable = PredictionTranscript_getAllTranslateableExons(trans); PredictionExon *firstExon; if (!Vector_getNumElement(translateable)) { return MapperRangeSet_new(); } firstExon = Vector_getElementAt(translateable, 0); contig = (BaseContig*)PredictionExon_getSlice(firstExon); Vector_free(translateable); } mapper = PredictionTranscript_getcDNACoordMapper(trans); return Mapper_mapCoordinates(mapper,(IDType)contig, start, end, strand, "genomic"); }
MapperRangeSet *AssemblyMapper_mapImpl(AssemblyMapper *am, char *frmSeqRegionName, long frmStart, long frmEnd, int frmStrand, CoordSystem *frmCs, int fakeFastMapFlag, Slice *toSlice) { Mapper *mapper = AssemblyMapper_getMapper(am); CoordSystem *asmCs = AssemblyMapper_getAssembledCoordSystem(am); CoordSystem *cmpCs = AssemblyMapper_getComponentCoordSystem(am); AssemblyMapperAdaptor *adaptor = AssemblyMapper_getAdaptor(am); char *frm; IDType seqRegionId = AssemblyMapper_getSeqRegionId(am, frmSeqRegionName, frmCs); // Speed critical section: // Try to do simple pointer equality comparisons of the coord system // objects first since this is likely to work most of the time and is // much faster than a function call. if ( frmCs == cmpCs || ( frmCs != asmCs && !CoordSystem_compare(frmCs, cmpCs)) ) { if ( !IDHash_contains(AssemblyMapper_getComponentRegister(am), seqRegionId) ) { AssemblyMapperAdaptor_registerComponent( adaptor, am, seqRegionId); } frm = "component"; } else if ( frmCs == asmCs || !CoordSystem_compare(frmCs, asmCs) ) { // This can be probably be sped up some by only calling registered // assembled if needed. AssemblyMapperAdaptor_registerAssembled( adaptor, am, seqRegionId, frmStart, frmEnd); frm = "assembled"; } else { fprintf(stderr,"Coordinate system %s %s is neither the assembled nor the component coordinate system of this AssemblyMapper\n", CoordSystem_getName(frmCs), CoordSystem_getVersion(frmCs) ); } return Mapper_mapCoordinates( mapper, seqRegionId, frmStart, frmEnd, frmStrand, frm ); }
MapperRangeSet *Mapper_mapInsert(Mapper *m, IDType id, long start, long end, int strand, char *type, int fastmap) { // swap start/end and map the resultant 2bp coordinate long tmp; tmp = start; start = end; end = tmp; MapperRangeSet *coords = Mapper_mapCoordinates(m, id, start, end, strand, type); MapperRangeSet *retSet = MapperRangeSet_new(); if (MapperRangeSet_getNumRange(coords) == 1) { // Note assuming its a mapper coordinate - not sure if this is always true MapperCoordinate *c = (MapperCoordinate *)MapperRangeSet_getRangeAt(coords,0); // swap start and end to convert back into insert MapperCoordinate *newC = MapperCoordinate_new(c->id, c->end, c->start, c->strand, c->coordSystem, 0); // Perl didn't set rank so use 0 MapperRangeSet_addRange(retSet, (MapperRange *)newC); } else { if (MapperRangeSet_getNumRange(coords) != 2) { fprintf(stderr, "Unexpected: Got %d expected 2.\n", MapperRangeSet_getNumRange(coords)); exit(1); } // adjust coordinates, remove gaps MapperRange *c1, *c2; if (strand == -1) { c1 = MapperRangeSet_getRangeAt(coords,1); c2 = MapperRangeSet_getRangeAt(coords,0); } else { c1 = MapperRangeSet_getRangeAt(coords,0); c2 = MapperRangeSet_getRangeAt(coords,1); } //@coords = (); // Was ref($c1) eq 'Bio::EnsEMBL::Mapper::Coordinate' so think this WON'T include MAPPERRANGE_INDEL MapperCoordinate *newC1 = NULL; if (c1->rangeType == MAPPERRANGE_COORD) { MapperCoordinate *mcC1 = (MapperCoordinate *)c1; // insert is after first coord if (mcC1->strand * strand == -1) { mcC1->end--; } else { mcC1->start++; } newC1 = MapperCoordinate_new(mcC1->id, mcC1->start, mcC1->end, mcC1->strand, mcC1->coordSystem, 0); // Perl didn't set rank, so use 0 } // (see above for note on this condition if (ref($c2) eq 'Bio::EnsEMBL::Mapper::Coordinate') MapperCoordinate *newC2 = NULL; if (c2->rangeType == MAPPERRANGE_COORD) { MapperCoordinate *mcC2 = (MapperCoordinate *)c2; // insert is before second coord if(mcC2->strand * strand == -1) { mcC2->start++; } else { mcC2->end--; } newC2 = MapperCoordinate_new(mcC2->id, mcC2->start, mcC2->end, mcC2->strand, mcC2->coordSystem, 0); // Perl didn't set rank, so use 0 } if (strand == -1) { // Add in 2, 1 order if (newC2) MapperRangeSet_addRange(retSet, (MapperRange *)newC2); if (newC1) MapperRangeSet_addRange(retSet, (MapperRange *)newC1); } else { // Add in 1, 2 order if (newC1) MapperRangeSet_addRange(retSet, (MapperRange *)newC1); if (newC2) MapperRangeSet_addRange(retSet, (MapperRange *)newC2); } } if (fastmap) { if (MapperRangeSet_getNumRange(coords) != 1) { MapperRangeSet_free(retSet); retSet = NULL; } else { MapperRange *c = MapperRangeSet_getRangeAt(coords, 0); // Type check - not sure what we're supposed to have here so belt and braces seem appropriate if (c->rangeType != MAPPERRANGE_COORD) { fprintf(stderr, "Expected a Coordinate range, got a %d range (look up in MapperRange.h)\n", c->rangeType); exit(1); } MapperCoordinate *mcC = (MapperCoordinate *)c; MapperCoordinate *newC = MapperCoordinate_new(mcC->id, mcC->start, mcC->end, mcC->strand, mcC->coordSystem, 0); // Perl didn't set rank, so use 0 MapperRangeSet_addRange(retSet, (MapperRange *)newC); /* return ($c->{'id'}, $c->{'start'}, $c->{'end'}, $c->{'strand'}, $c->{'coord_system'}); */ } } MapperRangeSet_free(coords); return retSet; }