1 /* @source enstranscript ******************************************************
2 **
3 ** Ensembl Transcript functions
4 **
5 ** @author Copyright (C) 1999 Ensembl Developers
6 ** @author Copyright (C) 2006 Michael K. Schuster
7 ** @version $Revision: 1.81 $
8 ** @modified 2009 by Alan Bleasby for incorporation into EMBOSS core
9 ** @modified $Date: 2013/02/17 13:09:58 $ by $Author: mks $
10 ** @@
11 **
12 ** This library is free software; you can redistribute it and/or
13 ** modify it under the terms of the GNU Lesser General Public
14 ** License as published by the Free Software Foundation; either
15 ** version 2.1 of the License, or (at your option) any later version.
16 **
17 ** This library is distributed in the hope that it will be useful,
18 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 ** Lesser General Public License for more details.
21 **
22 ** You should have received a copy of the GNU Lesser General Public
23 ** License along with this library; if not, write to the Free Software
24 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 ** MA  02110-1301,  USA.
26 **
27 ******************************************************************************/
28 
29 /* ========================================================================= */
30 /* ============================= include files ============================= */
31 /* ========================================================================= */
32 
33 #include "ensalign.h"
34 #include "ensattribute.h"
35 #include "ensdatabaseentry.h"
36 #include "ensexon.h"
37 #include "ensgene.h"
38 #include "ensintron.h"
39 #include "ensprojectionsegment.h"
40 #include "enssequenceedit.h"
41 #include "enstable.h"
42 #include "enstranscript.h"
43 #include "enstranslation.h"
44 
45 
46 
47 
48 /* ========================================================================= */
49 /* =============================== constants =============================== */
50 /* ========================================================================= */
51 
52 
53 
54 
55 /* ========================================================================= */
56 /* =========================== global variables ============================ */
57 /* ========================================================================= */
58 
59 
60 
61 
62 /* ========================================================================= */
63 /* ============================= private data ============================== */
64 /* ========================================================================= */
65 
66 /* @datastatic TranscriptPExonRank ********************************************
67 **
68 ** Ensembl Transcript, Exon and rank associations.
69 **
70 ** Holds associations between Ensembl Transcript objects, Ensembl Exon objects
71 ** and their rank in the Ensembl Transcript.
72 **
73 ** @alias TranscriptSExonRank
74 ** @alias TranscriptOExonRank
75 **
76 ** @attr Transcriptidentifier [ajuint] Ensembl Transcript identifier
77 ** @attr Rank [ajint] Ensembl Exon rank
78 ** @@
79 ******************************************************************************/
80 
81 typedef struct TranscriptSExonRank
82 {
83     ajuint Transcriptidentifier;
84     ajint Rank;
85 } TranscriptOExonRank;
86 
87 #define TranscriptPExonRank TranscriptOExonRank*
88 
89 
90 
91 
92 /* ========================================================================= */
93 /* =========================== private constants =========================== */
94 /* ========================================================================= */
95 
96 /* @conststatic transcriptKSequenceeditCode ***********************************
97 **
98 ** Ensembl Sequence Edit objects for Ensembl Transcript objects are a sub-set
99 ** of Ensembl Attribute objects that provide information about
100 ** post-transcriptional modifications of the Transcript sequence.
101 ** Attribute objects with the following codes are Sequence Edit objects
102 ** on the Transcript-level.
103 **
104 ** _rna_edit: General cDNA, RNA or Transcript sequence edit
105 **
106 ******************************************************************************/
107 
108 static const char *const transcriptKSequenceeditCode[] =
109 {
110     "_rna_edit",
111     (const char *) NULL
112 };
113 
114 
115 
116 
117 /* @conststatic transcriptKStatus *********************************************
118 **
119 ** The Ensembl Transcript status member is enumerated in both, the SQL table
120 ** definition and the data structure. The following strings are used for
121 ** conversion in database operations and correspond to EnsETranscriptStatus
122 ** and the 'transcript.status' field.
123 **
124 ******************************************************************************/
125 
126 static const char *const transcriptKStatus[] =
127 {
128     "",
129     "KNOWN",
130     "NOVEL",
131     "PUTATIVE",
132     "PREDICTED",
133     "KNOWN_BY_PROJECTION",
134     "UNKNOWN",
135     "ANNOTATED",
136     (const char *) NULL
137 };
138 
139 
140 
141 
142 /* @conststatic transcriptadaptorKTablenames **********************************
143 **
144 ** Array of Ensembl Transcript Adaptor SQL table names
145 **
146 ******************************************************************************/
147 
148 static const char *const transcriptadaptorKTablenames[] =
149 {
150     "transcript",
151     "xref",
152     "external_db",
153     (const char *) NULL
154 };
155 
156 
157 
158 
159 /* @conststatic transcriptadaptorKColumnnames *********************************
160 **
161 ** Array of Ensembl Transcript Adaptor SQL column names
162 **
163 ******************************************************************************/
164 
165 static const char *const transcriptadaptorKColumnnames[] =
166 {
167     "transcript.transcript_id",
168     "transcript.seq_region_id",
169     "transcript.seq_region_start",
170     "transcript.seq_region_end",
171     "transcript.seq_region_strand",
172     "transcript.analysis_id",
173     "transcript.display_xref_id",
174     "transcript.description",
175     "transcript.biotype",
176     "transcript.status",
177     "transcript.is_current",
178     "transcript.gene_id",
179     "transcript.stable_id",
180     "transcript.version",
181     "transcript.created_date",
182     "transcript.modified_date",
183     "xref.external_db_id",
184     "xref.dbprimary_acc",
185     "xref.display_label",
186     "xref.version",
187     "xref.description",
188     "xref.info_type",
189     "xref.info_text",
190     (const char *) NULL
191 };
192 
193 
194 
195 
196 /* @conststatic transcriptadaptorKLeftjoins ***********************************
197 **
198 ** Array of Ensembl Transcript Adaptor SQL LEFT JOIN conditions
199 **
200 ******************************************************************************/
201 
202 static const EnsOBaseadaptorLeftjoin transcriptadaptorKLeftjoins[] =
203 {
204     {"xref", "xref.xref_id = transcript.display_xref_id"},
205     {"external_db", "external_db.external_db_id = xref.external_db_id"},
206     {(const char *) NULL, (const char *) NULL}
207 };
208 
209 
210 
211 
212 /* ========================================================================= */
213 /* =========================== private variables =========================== */
214 /* ========================================================================= */
215 
216 
217 
218 
219 /* ========================================================================= */
220 /* =========================== private functions =========================== */
221 /* ========================================================================= */
222 
223 static TranscriptPExonRank transcriptExonRankNew(ajuint trid, ajint rank);
224 
225 static void transcriptExonRankDel(TranscriptPExonRank *Ptrex);
226 
227 static EnsPTranscript transcriptNewCpyFeatures(EnsPTranscript transcript);
228 
229 static int listTranscriptCompareEndAscending(
230     const void *item1,
231     const void *item2);
232 
233 static int listTranscriptCompareEndDescending(
234     const void *item1,
235     const void *item2);
236 
237 static int listTranscriptCompareIdentifierAscending(
238     const void *item1,
239     const void *item2);
240 
241 static int listTranscriptCompareStartAscending(
242     const void *item1,
243     const void *item2);
244 
245 static int listTranscriptCompareStartDescending(
246     const void *item1,
247     const void *item2);
248 
249 static AjBool transcriptadaptorFetchAllbyStatement(
250     EnsPBaseadaptor ba,
251     const AjPStr statement,
252     EnsPAssemblymapper am,
253     EnsPSlice slice,
254     AjPList transcripts);
255 
256 static void transcriptadaptorListTranscriptExonRankValdel(void **Pvalue);
257 
258 
259 
260 
261 /* ========================================================================= */
262 /* ======================= All functions by section ======================== */
263 /* ========================================================================= */
264 
265 
266 
267 
268 /* @filesection enstranscript *************************************************
269 **
270 ** @nam1rule ens Function belongs to the Ensembl library
271 **
272 ******************************************************************************/
273 
274 
275 
276 
277 /* @funcstatic transcriptExonRankNew ******************************************
278 **
279 ** Default constructor for a Transcript Exon Rank object.
280 **
281 ** @param [r] trid [ajuint] Ensembl Transcript identifier
282 ** @param [r] rank [ajint] Ensembl Exon rank
283 **
284 ** @return [TranscriptPExonRank] Transcript Exon Rank object
285 **
286 ** @release 6.3.0
287 ** @@
288 ******************************************************************************/
289 
transcriptExonRankNew(ajuint trid,ajint rank)290 static TranscriptPExonRank transcriptExonRankNew(ajuint trid, ajint rank)
291 {
292     TranscriptPExonRank trex = NULL;
293 
294     AJNEW0(trex);
295 
296     trex->Transcriptidentifier = trid;
297     trex->Rank = rank;
298 
299     return trex;
300 }
301 
302 
303 
304 
305 /* @funcstatic transcriptExonRankDel ******************************************
306 **
307 ** Default destructor for a Transcript Exon Rank object.
308 **
309 ** @param [d] Ptrex [TranscriptPExonRank*] Transcript Exon Rank object address
310 **
311 ** @return [void]
312 **
313 ** @release 6.3.0
314 ** @@
315 ******************************************************************************/
316 
transcriptExonRankDel(TranscriptPExonRank * Ptrex)317 static void transcriptExonRankDel(TranscriptPExonRank *Ptrex)
318 {
319     ajMemFree((void **) Ptrex);
320 
321     return;
322 }
323 
324 
325 
326 
327 /* @datasection [EnsPTranscript] Ensembl Transcript ***************************
328 **
329 ** @nam2rule Transcript Functions for manipulating Ensembl Transcript objects
330 **
331 ** @cc Bio::EnsEMBL::Transcript
332 ** @cc CVS Revision: 1.336
333 ** @cc CVS Tag: branch-ensembl-68
334 **
335 ******************************************************************************/
336 
337 
338 
339 
340 /* @section constructors ******************************************************
341 **
342 ** All constructors return a new Ensembl Transcript by pointer.
343 ** It is the responsibility of the user to first destroy any previous
344 ** Transcript. The target pointer does not need to be initialised to
345 ** NULL, but it is good programming practice to do so anyway.
346 **
347 ** @fdata [EnsPTranscript]
348 **
349 ** @nam3rule New Constructor
350 ** @nam4rule Cpy Constructor with existing object
351 ** @nam4rule Ini Constructor with initial values
352 ** @nam4rule Ref Constructor by incrementing the reference counter
353 **
354 ** @argrule Cpy transcript [const EnsPTranscript] Ensembl Transcript
355 ** @argrule Ini tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
356 ** @argrule Ini identifier [ajuint] SQL database-internal identifier
357 ** @argrule Ini feature [EnsPFeature] Ensembl Feature
358 ** @argrule Ini displaydbe [EnsPDatabaseentry] Ensembl Database Entry
359 ** @argrule Ini description [AjPStr] Description
360 ** @argrule Ini biotype [AjPStr] Biotype
361 ** @argrule Ini status [EnsETranscriptStatus] Status
362 ** @argrule Ini current [AjBool] Current attribute
363 ** @argrule Ini stableid [AjPStr] Stable identifier
364 ** @argrule Ini version [ajuint] Version
365 ** @argrule Ini cdate [AjPStr] Creation date
366 ** @argrule Ini mdate [AjPStr] Modification date
367 ** @argrule Ini exons [AjPList] AJAX List of Ensembl Exon objects
368 ** @argrule Ref transcript [EnsPTranscript] Ensembl Transcript
369 **
370 ** @valrule * [EnsPTranscript] Ensembl Transcript or NULL
371 **
372 ** @fcategory new
373 ******************************************************************************/
374 
375 
376 
377 
378 /* @func ensTranscriptNewCpy **************************************************
379 **
380 ** Object-based constructor function, which returns an independent object.
381 **
382 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
383 **
384 ** @return [EnsPTranscript] Ensembl Transcript or NULL
385 **
386 ** @release 6.4.0
387 ** @@
388 ******************************************************************************/
389 
ensTranscriptNewCpy(const EnsPTranscript transcript)390 EnsPTranscript ensTranscriptNewCpy(const EnsPTranscript transcript)
391 {
392     AjBool *Pcanonical = NULL;
393 
394     AjIList iter = NULL;
395 
396     EnsPAttribute attribute = NULL;
397 
398     EnsPBasealignfeature baf = NULL;
399 
400     EnsPDatabaseentry dbe = NULL;
401 
402     EnsPExon exon = NULL;
403 
404     EnsPIntronsupportingevidence ise = NULL;
405 
406     EnsPTranscript pthis = NULL;
407 
408     EnsPTranslation translation = NULL;
409 
410     if (!transcript)
411         return NULL;
412 
413     AJNEW0(pthis);
414 
415     pthis->Use = 1U;
416 
417     pthis->Identifier = transcript->Identifier;
418 
419     pthis->Adaptor = transcript->Adaptor;
420 
421     pthis->Feature = ensFeatureNewRef(transcript->Feature);
422 
423     pthis->Displayreference = ensDatabaseentryNewRef(
424         transcript->Displayreference);
425 
426     if (transcript->Description)
427         pthis->Description = ajStrNewRef(transcript->Description);
428 
429     if (transcript->Biotype)
430         pthis->Biotype = ajStrNewRef(transcript->Biotype);
431 
432     pthis->Status = transcript->Status;
433 
434     pthis->Current = transcript->Current;
435 
436     if (transcript->Stableidentifier)
437         pthis->Stableidentifier = ajStrNewRef(transcript->Stableidentifier);
438 
439     if (transcript->DateCreation)
440         pthis->DateCreation = ajStrNewRef(transcript->DateCreation);
441 
442     if (transcript->DateModification)
443         pthis->DateModification = ajStrNewRef(transcript->DateModification);
444 
445     pthis->Version = transcript->Version;
446 
447     pthis->Geneidentifier = transcript->Geneidentifier;
448 
449     /* NOTE: Copy the AJAX List of alternative Ensembl Translation objects. */
450 
451     if (transcript->Alternativetranslations
452         && ajListGetLength(transcript->Alternativetranslations))
453     {
454         pthis->Alternativetranslations = ajListNew();
455 
456         iter = ajListIterNew(transcript->Alternativetranslations);
457 
458         while (!ajListIterDone(iter))
459         {
460             translation = (EnsPTranslation) ajListIterGet(iter);
461 
462             ajListPushAppend(pthis->Alternativetranslations,
463                              (void *) ensTranslationNewRef(translation));
464         }
465 
466         ajListIterDel(&iter);
467     }
468     else
469         pthis->Alternativetranslations = NULL;
470 
471     /* Copy the AJAX List of Ensembl Attribute objects. */
472 
473     if (transcript->Attributes && ajListGetLength(transcript->Attributes))
474     {
475         pthis->Attributes = ajListNew();
476 
477         iter = ajListIterNew(transcript->Attributes);
478 
479         while (!ajListIterDone(iter))
480         {
481             attribute = (EnsPAttribute) ajListIterGet(iter);
482 
483             ajListPushAppend(pthis->Attributes,
484                              (void *) ensAttributeNewRef(attribute));
485         }
486 
487         ajListIterDel(&iter);
488     }
489     else
490         pthis->Attributes = NULL;
491 
492     /* NOTE: Copy the AJAX List of Ensembl Database Entry objects. */
493 
494     if (transcript->Databaseentries
495         && ajListGetLength(transcript->Databaseentries))
496     {
497         pthis->Databaseentries = ajListNew();
498 
499         iter = ajListIterNew(transcript->Databaseentries);
500 
501         while (!ajListIterDone(iter))
502         {
503             dbe = (EnsPDatabaseentry) ajListIterGet(iter);
504 
505             ajListPushAppend(pthis->Databaseentries,
506                              (void *) ensDatabaseentryNewRef(dbe));
507         }
508 
509         ajListIterDel(&iter);
510     }
511     else
512         pthis->Databaseentries = NULL;
513 
514     /* Copy the AJAX List of Ensembl Exon objects. */
515 
516     if (transcript->Exons && ajListGetLength(transcript->Exons))
517     {
518         pthis->Exons = ajListNew();
519 
520         iter = ajListIterNew(transcript->Exons);
521 
522         while (!ajListIterDone(iter))
523         {
524             exon = (EnsPExon) ajListIterGet(iter);
525 
526             ajListPushAppend(pthis->Exons, (void *) ensExonNewRef(exon));
527         }
528 
529         ajListIterDel(&iter);
530     }
531     else
532         pthis->Exons = NULL;
533 
534     /* Copy the AJAX List of Ensembl Intron Supporting Evidence objects. */
535 
536     if (transcript->Intronsupportingevidences
537         && ajListGetLength(transcript->Intronsupportingevidences))
538     {
539         pthis->Intronsupportingevidences = ajListNew();
540 
541         iter = ajListIterNew(transcript->Intronsupportingevidences);
542 
543         while (!ajListIterDone(iter))
544         {
545             ise = (EnsPIntronsupportingevidence) ajListIterGet(iter);
546 
547             ajListPushAppend(pthis->Intronsupportingevidences,
548                              (void *) ensIntronsupportingevidenceNewRef(ise));
549         }
550 
551         ajListIterDel(&iter);
552     }
553     else
554         pthis->Intronsupportingevidences = NULL;
555 
556     /*
557     ** NOTE: Copy the AJAX List of supporting
558     ** Ensembl Base Align Feature objects.
559     */
560 
561     if (transcript->Supportingfeatures &&
562         ajListGetLength(transcript->Supportingfeatures))
563     {
564         pthis->Supportingfeatures = ajListNew();
565 
566         iter = ajListIterNew(transcript->Supportingfeatures);
567 
568         while (!ajListIterDone(iter))
569         {
570             baf = (EnsPBasealignfeature) ajListIterGet(iter);
571 
572             ajListPushAppend(pthis->Supportingfeatures,
573                              (void *) ensBasealignfeatureNewRef(baf));
574         }
575 
576         ajListIterDel(&iter);
577     }
578     else
579         pthis->Supportingfeatures = NULL;
580 
581     pthis->Translation = ensTranslationNewRef(transcript->Translation);
582 
583     pthis->Sequenceedits = transcript->Sequenceedits;
584 
585     if (transcript->Canonical)
586     {
587         AJNEW0(Pcanonical);
588 
589         pthis->Canonical = Pcanonical;
590 
591         *pthis->Canonical = *transcript->Canonical;
592     }
593 
594     /*
595     ** NOTE: The ExonCoordMapper is not copied here, as the new Transcript
596     ** object is most likely placed onto a new Slice, which required
597     ** subsequent deletion of the Ensembl Mapper.
598     */
599 
600     pthis->ExonCoordMapper = NULL;
601 
602     return pthis;
603 }
604 
605 
606 
607 
608 /* @func ensTranscriptNewIni **************************************************
609 **
610 ** Constructor for an Ensembl Transcript with initial values.
611 **
612 ** @cc Bio::EnsEMBL::Storable::new
613 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
614 ** @param [r] identifier [ajuint] SQL database-internal identifier
615 ** @cc Bio::EnsEMBL::Feature::new
616 ** @param [u] feature [EnsPFeature] Ensembl Feature
617 ** @cc Bio::EnsEMBL::Transcript::new
618 ** @param [u] displaydbe [EnsPDatabaseentry] Ensembl Database Entry
619 ** @param [u] description [AjPStr] Description
620 ** @param [u] biotype [AjPStr] Biotype
621 ** @param [u] status [EnsETranscriptStatus] Status
622 ** @param [r] current [AjBool] Current attribute
623 ** @param [u] stableid [AjPStr] Stable identifier
624 ** @param [r] version [ajuint] Version
625 ** @param [u] cdate [AjPStr] Creation date
626 ** @param [u] mdate [AjPStr] Modification date
627 ** @param [u] exons [AjPList] AJAX List of Ensembl Exon objects
628 **
629 ** @return [EnsPTranscript] Ensembl Transcript or NULL
630 **
631 ** @release 6.4.0
632 ** @@
633 ******************************************************************************/
634 
ensTranscriptNewIni(EnsPTranscriptadaptor tca,ajuint identifier,EnsPFeature feature,EnsPDatabaseentry displaydbe,AjPStr description,AjPStr biotype,EnsETranscriptStatus status,AjBool current,AjPStr stableid,ajuint version,AjPStr cdate,AjPStr mdate,AjPList exons)635 EnsPTranscript ensTranscriptNewIni(EnsPTranscriptadaptor tca,
636                                    ajuint identifier,
637                                    EnsPFeature feature,
638                                    EnsPDatabaseentry displaydbe,
639                                    AjPStr description,
640                                    AjPStr biotype,
641                                    EnsETranscriptStatus status,
642                                    AjBool current,
643                                    AjPStr stableid,
644                                    ajuint version,
645                                    AjPStr cdate,
646                                    AjPStr mdate,
647                                    AjPList exons)
648 {
649     AjIList iter = NULL;
650 
651     EnsPExon exon = NULL;
652 
653     EnsPTranscript transcript = NULL;
654 
655     if (!feature)
656         return NULL;
657 
658     AJNEW0(transcript);
659 
660     transcript->Use = 1U;
661 
662     transcript->Identifier = identifier;
663 
664     transcript->Adaptor = tca;
665 
666     transcript->Feature = ensFeatureNewRef(feature);
667 
668     transcript->Displayreference = ensDatabaseentryNewRef(displaydbe);
669 
670     if (description)
671         transcript->Description = ajStrNewRef(description);
672 
673     if (biotype)
674         transcript->Biotype = ajStrNewRef(biotype);
675 
676     transcript->Status = status;
677 
678     transcript->Current = current;
679 
680     if (stableid)
681         transcript->Stableidentifier = ajStrNewRef(stableid);
682 
683     if (cdate)
684         transcript->DateCreation = ajStrNewRef(cdate);
685 
686     if (mdate)
687         transcript->DateModification = ajStrNewRef(mdate);
688 
689     transcript->Version = version;
690 
691     transcript->Geneidentifier = 0;
692 
693     transcript->Alternativetranslations = NULL;
694 
695     transcript->Attributes = NULL;
696 
697     transcript->Databaseentries = NULL;
698 
699     if (exons && ajListGetLength(exons))
700     {
701         transcript->Exons = ajListNew();
702 
703         iter = ajListIterNew(exons);
704 
705         while (!ajListIterDone(iter))
706         {
707             exon = (EnsPExon) ajListIterGet(iter);
708 
709             ajListPushAppend(transcript->Exons,
710                              (void *) ensExonNewRef(exon));
711         }
712 
713         ajListIterDel(&iter);
714     }
715     else
716         transcript->Exons = NULL;
717 
718     transcript->Intronsupportingevidences = NULL;
719 
720     transcript->Supportingfeatures = NULL;
721 
722     transcript->Translation = NULL;
723 
724     /*
725     ** NOTE: Sequence Edit objects such as transcription and translation
726     ** exceptions are applied by default. Use ensTranscriptGetSequenceedits and
727     ** ensTranscriptSetSequenceedits to toggle Sequence Edit application.
728     */
729 
730     transcript->Sequenceedits = ajTrue;
731 
732     transcript->Canonical = NULL;
733 
734     transcript->ExonCoordMapper = NULL;
735 
736     return transcript;
737 }
738 
739 
740 
741 
742 /* @func ensTranscriptNewRef **************************************************
743 **
744 ** Ensembl Object referencing function, which returns a pointer to the
745 ** Ensembl Object passed in and increases its reference count.
746 **
747 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
748 **
749 ** @return [EnsPTranscript] Ensembl Transcript or NULL
750 **
751 ** @release 6.2.0
752 ** @@
753 ******************************************************************************/
754 
ensTranscriptNewRef(EnsPTranscript transcript)755 EnsPTranscript ensTranscriptNewRef(EnsPTranscript transcript)
756 {
757     if (!transcript)
758         return NULL;
759 
760     transcript->Use++;
761 
762     return transcript;
763 }
764 
765 
766 
767 
768 /* @funcstatic transcriptNewCpyFeatures ***************************************
769 **
770 ** Returns a new copy of an Ensembl Transcript, but in addition to the shallow
771 ** copy provided by ensTranscriptNewCpy, also copies all Ensembl Transcript-
772 ** internal Ensembl Objects based on the Ensembl Feature class. This is useful
773 ** in preparation of ensTranscriptTransform and ensTranscriptTransfer, which
774 ** return an independent Ensembl Transcript object and therefore, require
775 ** independent mapping of all internal Feature objects to the new
776 ** Ensembl Coordinate System or Ensembl Slice.
777 **
778 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
779 **
780 ** @return [EnsPTranscript] Ensembl Transcript or NULL
781 **
782 ** @release 6.4.0
783 ** @@
784 ******************************************************************************/
785 
transcriptNewCpyFeatures(EnsPTranscript transcript)786 static EnsPTranscript transcriptNewCpyFeatures(EnsPTranscript transcript)
787 {
788     AjIList iter = NULL;
789 
790     EnsPBasealignfeature newbaf = NULL;
791     EnsPBasealignfeature oldbaf = NULL;
792 
793     EnsPExon newexon = NULL;
794     EnsPExon oldexon = NULL;
795 
796     EnsPIntronsupportingevidence newise = NULL;
797     EnsPIntronsupportingevidence oldise = NULL;
798 
799     EnsPTranscript newtranscript = NULL;
800 
801     EnsPTranslation newtranslation = NULL;
802     EnsPTranslation oldtranslation = NULL;
803 
804     if (!transcript)
805         return NULL;
806 
807     newtranscript = ensTranscriptNewCpy(transcript);
808 
809     if (!newtranscript)
810         return NULL;
811 
812     /* Copy the AJAX List of alternative Ensembl Translation objects. */
813 
814     if (newtranscript->Alternativetranslations)
815     {
816         iter = ajListIterNew(newtranscript->Alternativetranslations);
817 
818         while (!ajListIterDone(iter))
819         {
820             oldtranslation = (EnsPTranslation) ajListIterGet(iter);
821 
822             ajListIterRemove(iter);
823 
824             newtranslation = ensTranslationNewCpy(oldtranslation);
825 
826             ajListIterInsert(iter, (void *) newtranslation);
827 
828             /* Advance the AJAX List Iterator after the insert. */
829 
830             (void) ajListIterGet(iter);
831 
832             ensTranslationDel(&oldtranslation);
833         }
834 
835         ajListIterDel(&iter);
836     }
837 
838     /* Copy the AJAX List of Ensembl Exon objects. */
839 
840     if (newtranscript->Exons)
841     {
842         iter = ajListIterNew(newtranscript->Exons);
843 
844         while (!ajListIterDone(iter))
845         {
846             oldexon = (EnsPExon) ajListIterGet(iter);
847 
848             ajListIterRemove(iter);
849 
850             newexon = ensExonNewCpy(oldexon);
851 
852             ajListIterInsert(iter, (void *) newexon);
853 
854             /* Advance the AJAX List Iterator after the insert. */
855 
856             (void) ajListIterGet(iter);
857 
858             ensExonDel(&oldexon);
859         }
860 
861         ajListIterDel(&iter);
862     }
863 
864     /* Copy the AJAX List of Ensembl Intron Supporting Evidence objects. */
865 
866     if (newtranscript->Intronsupportingevidences)
867     {
868         iter = ajListIterNew(newtranscript->Intronsupportingevidences);
869 
870         while (!ajListIterDone(iter))
871         {
872             oldise = (EnsPIntronsupportingevidence) ajListIterGet(iter);
873 
874             ajListIterRemove(iter);
875 
876             newise = ensIntronsupportingevidenceNewCpy(oldise);
877 
878             ajListIterInsert(iter, (void *) newise);
879 
880             /* Advance the AJAX List Iterator after the insert. */
881 
882             (void) ajListIterGet(iter);
883 
884             ensIntronsupportingevidenceDel(&oldise);
885         }
886 
887         ajListIterDel(&iter);
888     }
889 
890     /* Copy the AJAX List of supporting Ensembl Base Align Feature objects. */
891 
892     if (newtranscript->Supportingfeatures)
893     {
894         iter = ajListIterNew(newtranscript->Supportingfeatures);
895 
896         while (!ajListIterDone(iter))
897         {
898             oldbaf = (EnsPBasealignfeature) ajListIterGet(iter);
899 
900             ajListIterRemove(iter);
901 
902             newbaf = ensBasealignfeatureNewCpy(oldbaf);
903 
904             ajListIterInsert(iter, (void *) newbaf);
905 
906             /* Advance the AJAX List Iterator after the insert. */
907 
908             (void) ajListIterGet(iter);
909 
910             ensBasealignfeatureDel(&oldbaf);
911         }
912 
913         ajListIterDel(&iter);
914     }
915 
916     /* Copy the canonical Ensembl Translation. */
917 
918     newtranslation = ensTranslationNewCpy(newtranscript->Translation);
919 
920     ensTranslationDel(&newtranscript->Translation);
921 
922     newtranscript->Translation = newtranslation;
923 
924     return newtranscript;
925 }
926 
927 
928 
929 
930 /* @section clear *************************************************************
931 **
932 ** Clear internal data structures and frees the memory
933 ** allocated for an Ensembl Transcript object internals.
934 **
935 ** @fdata [EnsPTranscript]
936 **
937 ** @nam3rule Clear Clear an Ensembl Transcript
938 ** @nam4rule Intronsupportingevidences
939 ** Clear Ensembl Intron Supporting Evidence objects
940 **
941 ** @argrule * transcript [EnsPTranscript] Ensembl Transcript
942 **
943 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
944 **
945 ** @fcategory modify
946 ******************************************************************************/
947 
948 
949 
950 
951 /* @func ensTranscriptClearIntronsupportingevidences **************************
952 **
953 ** Clear Ensembl Intron Supporting Evidence objects of an Ensembl Transcript.
954 **
955 ** @cc Bio::EnsEMBL::Transcript::flush_IntronSupportingEvidence
956 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
957 **
958 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
959 **
960 ** @release 6.5.0
961 ** @@
962 ******************************************************************************/
963 
ensTranscriptClearIntronsupportingevidences(EnsPTranscript transcript)964 AjBool ensTranscriptClearIntronsupportingevidences(EnsPTranscript transcript)
965 {
966     EnsPIntronsupportingevidence ise = NULL;
967 
968     if (!transcript)
969         return ajFalse;
970 
971     /*
972     ** Clear and delete the AJAX List of
973     ** Ensembl Intron Supporting Evidence objects.
974     */
975 
976     while (ajListPop(transcript->Intronsupportingevidences, (void **) &ise))
977         ensIntronsupportingevidenceDel(&ise);
978 
979     ajListFree(&transcript->Intronsupportingevidences);
980 
981     return ajTrue;
982 }
983 
984 
985 
986 
987 /* @section destructors *******************************************************
988 **
989 ** Destruction destroys all internal data structures and frees the memory
990 ** allocated for an Ensembl Transcript object.
991 **
992 ** @fdata [EnsPTranscript]
993 **
994 ** @nam3rule Del Destroy (free) an Ensembl Transcript
995 **
996 ** @argrule * Ptranscript [EnsPTranscript*] Ensembl Transcript address
997 **
998 ** @valrule * [void]
999 **
1000 ** @fcategory delete
1001 ******************************************************************************/
1002 
1003 
1004 
1005 
1006 /* @func ensTranscriptDel *****************************************************
1007 **
1008 ** Default destructor for an Ensembl Transcript.
1009 **
1010 ** @param [d] Ptranscript [EnsPTranscript*] Ensembl Transcript address
1011 **
1012 ** @return [void]
1013 **
1014 ** @release 6.2.0
1015 ** @@
1016 ******************************************************************************/
1017 
ensTranscriptDel(EnsPTranscript * Ptranscript)1018 void ensTranscriptDel(EnsPTranscript *Ptranscript)
1019 {
1020     EnsPAttribute attribute = NULL;
1021 
1022     EnsPBasealignfeature baf = NULL;
1023 
1024     EnsPDatabaseentry dbe = NULL;
1025 
1026     EnsPExon exon = NULL;
1027 
1028     EnsPIntronsupportingevidence ise = NULL;
1029 
1030     EnsPTranscript pthis = NULL;
1031 
1032     EnsPTranslation translation = NULL;
1033 
1034     if (!Ptranscript)
1035         return;
1036 
1037 #if defined(AJ_DEBUG) && AJ_DEBUG >= 1
1038     if (ajDebugTest("ensTranscriptDel"))
1039     {
1040         ajDebug("ensTranscriptDel\n"
1041                 "  *Ptranscript %p\n",
1042                 *Ptranscript);
1043 
1044         ensTranscriptTrace(*Ptranscript, 1);
1045     }
1046 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 1 */
1047 
1048     if (!(pthis = *Ptranscript) || --pthis->Use)
1049     {
1050         *Ptranscript = NULL;
1051 
1052         return;
1053     }
1054 
1055     ensFeatureDel(&pthis->Feature);
1056 
1057     ensDatabaseentryDel(&pthis->Displayreference);
1058 
1059     ajStrDel(&pthis->Description);
1060     ajStrDel(&pthis->Biotype);
1061     ajStrDel(&pthis->Stableidentifier);
1062     ajStrDel(&pthis->DateCreation);
1063     ajStrDel(&pthis->DateModification);
1064 
1065     /*
1066     ** Clear and delete the AJAX List of alternative
1067     ** Ensembl Translation objects.
1068     */
1069 
1070     while (ajListPop(pthis->Alternativetranslations, (void **) &translation))
1071         ensTranslationDel(&translation);
1072 
1073     ajListFree(&pthis->Alternativetranslations);
1074 
1075     /* Clear and delete the AJAX List of Ensembl Attribute objects. */
1076 
1077     while (ajListPop(pthis->Attributes, (void **) &attribute))
1078         ensAttributeDel(&attribute);
1079 
1080     ajListFree(&pthis->Attributes);
1081 
1082     /* Clear and delete the AJAX List of Ensembl Database Entry objects. */
1083 
1084     while (ajListPop(pthis->Databaseentries, (void **) &dbe))
1085         ensDatabaseentryDel(&dbe);
1086 
1087     ajListFree(&pthis->Databaseentries);
1088 
1089     /* Clear and delete the AJAX List of Ensembl Exon objects. */
1090 
1091     while (ajListPop(pthis->Exons, (void **) &exon))
1092         ensExonDel(&exon);
1093 
1094     ajListFree(&pthis->Exons);
1095 
1096     /*
1097     ** Clear and delete the AJAX List of
1098     ** Ensembl Intron Supporting Evidence objects.
1099     */
1100 
1101     while (ajListPop(pthis->Intronsupportingevidences, (void **) &ise))
1102         ensIntronsupportingevidenceDel(&ise);
1103 
1104     ajListFree(&pthis->Intronsupportingevidences);
1105 
1106     /* Clear and delete the AJAX List of Ensembl Base Align Feature objects. */
1107 
1108     while (ajListPop(pthis->Supportingfeatures, (void **) &baf))
1109         ensBasealignfeatureDel(&baf);
1110 
1111     ajListFree(&pthis->Supportingfeatures);
1112 
1113     ensTranslationDel(&pthis->Translation);
1114 
1115     ajMemFree((void **) &pthis->Canonical);
1116 
1117     ensMapperDel(&pthis->ExonCoordMapper);
1118 
1119     ajMemFree((void **) Ptranscript);
1120 
1121     return;
1122 }
1123 
1124 
1125 
1126 
1127 /* @section member retrieval **************************************************
1128 **
1129 ** Functions for returning members of an Ensembl Transcript object.
1130 **
1131 ** @fdata [EnsPTranscript]
1132 **
1133 ** @nam3rule Get Return Transcript attribute(s)
1134 ** @nam4rule Adaptor Return the Ensembl Transcript Adaptor
1135 ** @nam4rule Biotype Return the biological type
1136 ** @nam4rule Canonical Return the canonical flag
1137 ** @nam4rule Current Return the current flag
1138 ** @nam4rule Date Return a date
1139 ** @nam5rule DateCreation Return the creation date
1140 ** @nam5rule DateModification Return the modification date
1141 ** @nam4rule Description Return the description
1142 ** @nam4rule Displayreference Return the display Database Entry
1143 ** @nam4rule Feature Return the Feature
1144 ** @nam4rule Geneidentifier Return the Ensembl Gene identifier
1145 ** @nam4rule Identifier Return the SQL database-internal identifier
1146 ** @nam4rule Sequenceedits Return the enable Ensembl Sequence Edit flag
1147 ** @nam4rule Stableidentifier Return the stable identifier
1148 ** @nam4rule Status Return the status
1149 ** @nam4rule Version Return the version
1150 **
1151 ** @argrule * transcript [const EnsPTranscript] Transcript
1152 **
1153 ** @valrule Adaptor [EnsPTranscriptadaptor] Ensembl Transcript Adaptor or NULL
1154 ** @valrule Biotype [AjPStr] Biological type or NULL
1155 ** @valrule Canonical [const AjBool*] Canonical atrribute or NULL
1156 ** @valrule Current [AjBool] Current attribute or ajFalse
1157 ** @valrule DateCreation [AjPStr] Creation date or NULL
1158 ** @valrule DateModification [AjPStr] Modification date or NULL
1159 ** @valrule Description [AjPStr] Description or NULL
1160 ** @valrule Displayreference [EnsPDatabaseentry] Ensembl Database Entry or NULL
1161 ** @valrule Feature [EnsPFeature] Ensembl Feature or NULL
1162 ** @valrule Geneidentifier [ajuint] Ensembl Gene identifier or 0U
1163 ** @valrule Identifier [ajuint] SQL database-internal identifier or 0U
1164 ** @valrule Sequenceedits [AjBool] Enable Ensembl Sequence Edit flag ro ajFalse
1165 ** @valrule Status [EnsETranscriptStatus] Status or NULL
1166 ** @valrule Stableidentifier [AjPStr] Stable identifier or NULL
1167 ** @valrule Version [ajuint] Version or 0U
1168 ** @valrule Exons [const AjPList] AJAX List of Ensembl Exon objects or NULL
1169 ** @valrule Supportingfeatures [const AjPList] AJAX List of Ensembl Base
1170 ** Align Feature objects or NULL
1171 ** @valrule Translation [EnsPTranslation] Ensembl Translation or NULL
1172 **
1173 ** @fcategory use
1174 ******************************************************************************/
1175 
1176 
1177 
1178 
1179 /* @func ensTranscriptGetAdaptor **********************************************
1180 **
1181 ** Get the Ensembl Transcript Adaptor member of an Ensembl Transcript.
1182 **
1183 ** @cc Bio::EnsEMBL::Storable::adaptor
1184 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1185 **
1186 ** @return [EnsPTranscriptadaptor] Ensembl Transcript Adaptor or NULL
1187 **
1188 ** @release 6.2.0
1189 ** @@
1190 ******************************************************************************/
1191 
ensTranscriptGetAdaptor(const EnsPTranscript transcript)1192 EnsPTranscriptadaptor ensTranscriptGetAdaptor(const EnsPTranscript transcript)
1193 {
1194     return (transcript) ? transcript->Adaptor : NULL;
1195 }
1196 
1197 
1198 
1199 
1200 /* @func ensTranscriptGetBiotype **********************************************
1201 **
1202 ** Get the biological type member of an Ensembl Transcript.
1203 **
1204 ** @cc Bio::EnsEMBL::Transcript::biotype
1205 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1206 **
1207 ** @return [AjPStr] Biological type or NULL
1208 **
1209 ** @release 6.4.0
1210 ** @@
1211 ******************************************************************************/
1212 
ensTranscriptGetBiotype(const EnsPTranscript transcript)1213 AjPStr ensTranscriptGetBiotype(const EnsPTranscript transcript)
1214 {
1215     return (transcript) ? transcript->Biotype : NULL;
1216 }
1217 
1218 
1219 
1220 
1221 /* @func ensTranscriptGetCanonical ********************************************
1222 **
1223 ** Get the canonical member of an Ensembl Transcript.
1224 **
1225 ** @cc Bio::EnsEMBL::Transcript::is_canonical
1226 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1227 **
1228 ** @return [const AjBool*] Canonical attribute or NULL
1229 **
1230 ** @release 6.4.0
1231 ** @@
1232 ******************************************************************************/
1233 
ensTranscriptGetCanonical(const EnsPTranscript transcript)1234 const AjBool* ensTranscriptGetCanonical(const EnsPTranscript transcript)
1235 {
1236     return (transcript) ? transcript->Canonical : NULL;
1237 }
1238 
1239 
1240 
1241 
1242 /* @func ensTranscriptGetCurrent **********************************************
1243 **
1244 ** Get the current member of an Ensembl Transcript.
1245 **
1246 ** @cc Bio::EnsEMBL::Transcript::is_current
1247 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1248 **
1249 ** @return [AjBool] ajTrue if this Transcript reflects the current state of
1250 **                  annotation
1251 **
1252 ** @release 6.2.0
1253 ** @@
1254 ******************************************************************************/
1255 
ensTranscriptGetCurrent(const EnsPTranscript transcript)1256 AjBool ensTranscriptGetCurrent(const EnsPTranscript transcript)
1257 {
1258     return (transcript) ? transcript->Current : ajFalse;
1259 }
1260 
1261 
1262 
1263 
1264 /* @func ensTranscriptGetDateCreation *****************************************
1265 **
1266 ** Get the creation date member of an Ensembl Transcript.
1267 **
1268 ** @cc Bio::EnsEMBL::Transcript::created_date
1269 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1270 **
1271 ** @return [AjPStr] Creation date or NULL
1272 **
1273 ** @release 6.4.0
1274 ** @@
1275 ******************************************************************************/
1276 
ensTranscriptGetDateCreation(const EnsPTranscript transcript)1277 AjPStr ensTranscriptGetDateCreation(const EnsPTranscript transcript)
1278 {
1279     return (transcript) ? transcript->DateCreation : NULL;
1280 }
1281 
1282 
1283 
1284 
1285 /* @func ensTranscriptGetDateModification *************************************
1286 **
1287 ** Get the modification date member of an Ensembl Transcript.
1288 **
1289 ** @cc Bio::EnsEMBL::Transcript::modified_date
1290 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1291 **
1292 ** @return [AjPStr] Modification date or NULL
1293 **
1294 ** @release 6.4.0
1295 ** @@
1296 ******************************************************************************/
1297 
ensTranscriptGetDateModification(const EnsPTranscript transcript)1298 AjPStr ensTranscriptGetDateModification(const EnsPTranscript transcript)
1299 {
1300     return (transcript) ? transcript->DateModification : NULL;
1301 }
1302 
1303 
1304 
1305 
1306 /* @func ensTranscriptGetDescription ******************************************
1307 **
1308 ** Get the description member of an Ensembl Transcript.
1309 **
1310 ** @cc Bio::EnsEMBL::Transcript::description
1311 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1312 **
1313 ** @return [AjPStr] Description or NULL
1314 **
1315 ** @release 6.2.0
1316 ** @@
1317 ******************************************************************************/
1318 
ensTranscriptGetDescription(const EnsPTranscript transcript)1319 AjPStr ensTranscriptGetDescription(const EnsPTranscript transcript)
1320 {
1321     return (transcript) ? transcript->Description : NULL;
1322 }
1323 
1324 
1325 
1326 
1327 /* @func ensTranscriptGetDisplayreference *************************************
1328 **
1329 ** Get the display reference member of an Ensembl Transcript.
1330 **
1331 ** @cc Bio::EnsEMBL::Transcript::display_xref
1332 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1333 **
1334 ** @return [EnsPDatabaseentry] Ensembl Database Entry or NULL
1335 **
1336 ** @release 6.4.0
1337 ** @@
1338 ******************************************************************************/
1339 
ensTranscriptGetDisplayreference(const EnsPTranscript transcript)1340 EnsPDatabaseentry ensTranscriptGetDisplayreference(
1341     const EnsPTranscript transcript)
1342 {
1343     return (transcript) ? transcript->Displayreference : NULL;
1344 }
1345 
1346 
1347 
1348 
1349 /* @func ensTranscriptGetFeature **********************************************
1350 **
1351 ** Get the Ensembl Feature member of an Ensembl Transcript.
1352 **
1353 ** @cc Bio::EnsEMBL::Feature
1354 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1355 **
1356 ** @return [EnsPFeature] Ensembl Feature or NULL
1357 **
1358 ** @release 6.2.0
1359 ** @@
1360 ******************************************************************************/
1361 
ensTranscriptGetFeature(const EnsPTranscript transcript)1362 EnsPFeature ensTranscriptGetFeature(const EnsPTranscript transcript)
1363 {
1364     return (transcript) ? transcript->Feature : NULL;
1365 }
1366 
1367 
1368 
1369 
1370 /* @func ensTranscriptGetGeneidentifier ***************************************
1371 **
1372 ** Get the SQL database-internal Ensembl Gene identifier member of an
1373 ** Ensembl Transcript.
1374 **
1375 ** @cc Bio::EnsEMBL::Transcript::???
1376 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1377 **
1378 ** @return [ajuint] SQL database-internal identifier of the Ensembl Gene or 0U
1379 **
1380 ** @release 6.4.0
1381 ** @@
1382 ******************************************************************************/
1383 
ensTranscriptGetGeneidentifier(const EnsPTranscript transcript)1384 ajuint ensTranscriptGetGeneidentifier(const EnsPTranscript transcript)
1385 {
1386     return (transcript) ? transcript->Geneidentifier : 0U;
1387 }
1388 
1389 
1390 
1391 
1392 /* @func ensTranscriptGetIdentifier *******************************************
1393 **
1394 ** Get the SQL database-internal identifier member of an Ensembl Transcript.
1395 **
1396 ** @cc Bio::EnsEMBL::Storable::dbID
1397 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1398 **
1399 ** @return [ajuint] SQL database-internal identifier or 0U
1400 **
1401 ** @release 6.2.0
1402 ** @@
1403 ******************************************************************************/
1404 
ensTranscriptGetIdentifier(const EnsPTranscript transcript)1405 ajuint ensTranscriptGetIdentifier(const EnsPTranscript transcript)
1406 {
1407     return (transcript) ? transcript->Identifier : 0U;
1408 }
1409 
1410 
1411 
1412 
1413 /* @func ensTranscriptGetSequenceedits ****************************************
1414 **
1415 ** Get the enable Ensembl Sequence Edit objects member of an
1416 ** Ensembl Transcript.
1417 **
1418 ** @cc Bio::EnsEMBL::Transcript::edits_enabled
1419 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1420 **
1421 ** @return [AjBool] ajTrue: Apply Ensembl Sequence Edit objects to the sequence
1422 **
1423 ** @release 6.4.0
1424 ** @@
1425 ******************************************************************************/
1426 
ensTranscriptGetSequenceedits(const EnsPTranscript transcript)1427 AjBool ensTranscriptGetSequenceedits(const EnsPTranscript transcript)
1428 {
1429     return (transcript) ? transcript->Sequenceedits : ajFalse;
1430 }
1431 
1432 
1433 
1434 
1435 /* @func ensTranscriptGetStableidentifier *************************************
1436 **
1437 ** Get the stable identifier member of an Ensembl Transcript.
1438 **
1439 ** @cc Bio::EnsEMBL::Transcript::stable_id
1440 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1441 **
1442 ** @return [AjPStr] Stable identifier or NULL
1443 **
1444 ** @release 6.4.0
1445 ** @@
1446 ******************************************************************************/
1447 
ensTranscriptGetStableidentifier(const EnsPTranscript transcript)1448 AjPStr ensTranscriptGetStableidentifier(const EnsPTranscript transcript)
1449 {
1450     return (transcript) ? transcript->Stableidentifier : NULL;
1451 }
1452 
1453 
1454 
1455 
1456 /* @func ensTranscriptGetStatus ***********************************************
1457 **
1458 ** Get the status member of an Ensembl Transcript.
1459 **
1460 ** @cc Bio::EnsEMBL::Transcript::status
1461 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1462 **
1463 ** @return [EnsETranscriptStatus] Status or ensETranscriptStatusNULL
1464 **
1465 ** @release 6.2.0
1466 ** @@
1467 ******************************************************************************/
1468 
ensTranscriptGetStatus(const EnsPTranscript transcript)1469 EnsETranscriptStatus ensTranscriptGetStatus(const EnsPTranscript transcript)
1470 {
1471     return (transcript) ? transcript->Status : ensETranscriptStatusNULL;
1472 }
1473 
1474 
1475 
1476 
1477 /* @func ensTranscriptGetVersion **********************************************
1478 **
1479 ** Get the version member of an Ensembl Transcript.
1480 **
1481 ** @cc Bio::EnsEMBL::Transcript::version
1482 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
1483 **
1484 ** @return [ajuint] Version or 0U
1485 **
1486 ** @release 6.2.0
1487 ** @@
1488 ******************************************************************************/
1489 
ensTranscriptGetVersion(const EnsPTranscript transcript)1490 ajuint ensTranscriptGetVersion(const EnsPTranscript transcript)
1491 {
1492     return (transcript) ? transcript->Version : 0U;
1493 }
1494 
1495 
1496 
1497 
1498 /* @section load on demand ****************************************************
1499 **
1500 ** Functions for returning members of an Ensembl Transcript object,
1501 ** which may need loading from an Ensembl SQL database on demand.
1502 **
1503 ** @fdata [EnsPTranscript]
1504 **
1505 ** @nam3rule Load Return Ensembl Transcript attribute(s) loaded on demand
1506 ** @nam4rule Alternativetranslations
1507 ** Return all alternative Ensembl Translation objects
1508 ** @nam4rule Attributes Return all Ensembl Attribute objects
1509 ** @nam4rule Canonical Return the canonical flag
1510 ** @nam4rule Databaseentries Return all Ensembl Database Entry objects
1511 ** @nam4rule Exons Return all Ensembl Exon objects
1512 ** @nam4rule Intronsupportingevidences
1513 ** Return all Ensembl Intron Supporting Evidence objects
1514 ** @nam4rule Supportingfeatures
1515 ** Return the supporting Ensembl Base Align Feature objects
1516 ** @nam4rule Translation Return the Ensembl Translation
1517 **
1518 ** @argrule * transcript [EnsPTranscript] Ensembl Transcript
1519 **
1520 ** @valrule Alternativetranslations [const AjPList]
1521 ** AJAX List of alternative Ensembl Translation objects or NULL
1522 ** @valrule Attributes [const AjPList]
1523 ** AJAX List of Ensembl Attribute objects or NULL
1524 ** @valrule Canonical [const AjBool*] Canonical flag
1525 ** @valrule Databaseentries [const AjPList]
1526 ** AJAX List of Ensembl Database Entry objects or NULL
1527 ** @valrule Exons [const AjPList]
1528 ** AJAX List of Ensembl Exon objects or NULL
1529 ** @valrule Intronsupportingevidences [const AjPList]
1530 ** AJAX List of Ensembl Intron Supporting Evidence objects or NULL
1531 ** @valrule Supportingfeatures [const AjPList]
1532 ** AJAX List of supporting Ensembl Base Align Feature objects or NULL
1533 ** @valrule Translation [EnsPTranslation] Ensembl Translation or NULL
1534 **
1535 ** @fcategory use
1536 ******************************************************************************/
1537 
1538 
1539 
1540 
1541 /* @func ensTranscriptLoadAlternativetranslations *****************************
1542 **
1543 ** Load all alternative Ensembl Translation objects of an Ensembl Transcript.
1544 **
1545 ** This is not a simple accessor function, it will fetch Ensembl Translation
1546 ** objects from the Ensembl SQL database in case the AJAX List is not defined.
1547 **
1548 **
1549 ** @cc Bio::EnsEMBL::Transcript::get_all_alternative_translations
1550 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
1551 ** @see ensTranscriptFetchAllAttributes
1552 **
1553 ** @return [const AjPList] AJAX List of Ensembl Translation objects or NULL
1554 **
1555 ** @release 6.4.0
1556 ** @@
1557 ******************************************************************************/
1558 
ensTranscriptLoadAlternativetranslations(EnsPTranscript transcript)1559 const AjPList ensTranscriptLoadAlternativetranslations(
1560     EnsPTranscript transcript)
1561 {
1562     EnsPDatabaseadaptor dba = NULL;
1563 
1564     EnsPTranslationadaptor tla  = NULL;
1565 
1566     if (!transcript)
1567         return NULL;
1568 
1569     if (transcript->Alternativetranslations)
1570         return transcript->Alternativetranslations;
1571 
1572     if (!transcript->Adaptor)
1573     {
1574         ajDebug("ensTranscriptLoadAlternativetranslations cannot fetch "
1575                 "Ensembl Translation objects for an "
1576                 "Ensembl Transcript without an "
1577                 "Ensembl Transcript Adaptor.\n");
1578 
1579         return NULL;
1580     }
1581 
1582     dba = ensTranscriptadaptorGetDatabaseadaptor(transcript->Adaptor);
1583 
1584     if (!dba)
1585     {
1586         ajDebug("ensTranscriptLoadAlternativetranslations cannot fetch "
1587                 "Ensembl Translation objects for an "
1588                 "Ensembl Transcript without an "
1589                 "Ensembl Database Adaptor set in the "
1590                 "Ensembl Transcript Adaptor.\n");
1591 
1592         return NULL;
1593     }
1594 
1595     tla = ensRegistryGetTranslationadaptor(dba);
1596 
1597     transcript->Alternativetranslations = ajListNew();
1598 
1599     ensTranslationadaptorFetchAllbyTranscript(tla, transcript);
1600 
1601     return transcript->Alternativetranslations;
1602 }
1603 
1604 
1605 
1606 
1607 /* @func ensTranscriptLoadAttributes ******************************************
1608 **
1609 ** Load all Ensembl Attribute objects of an Ensembl Transcript.
1610 **
1611 ** This is not a simple accessor function, it will fetch Ensembl Attribute
1612 ** objects from an Ensembl SQL database in case the AJAX List is empty.
1613 **
1614 ** To filter Ensembl Attribute objects via their code, consider using
1615 ** ensTranscriptFetchAllAttributes.
1616 **
1617 ** @cc Bio::EnsEMBL::Transcript::get_all_Attributes
1618 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
1619 ** @see ensTranscriptFetchAllAttributes
1620 **
1621 ** @return [const AjPList] AJAX List of Ensembl Attribute objects or NULL
1622 **
1623 ** @release 6.4.0
1624 ** @@
1625 ******************************************************************************/
1626 
ensTranscriptLoadAttributes(EnsPTranscript transcript)1627 const AjPList ensTranscriptLoadAttributes(
1628     EnsPTranscript transcript)
1629 {
1630     EnsPAttributeadaptor ata = NULL;
1631 
1632     EnsPDatabaseadaptor dba = NULL;
1633 
1634     if (!transcript)
1635         return NULL;
1636 
1637     if (transcript->Attributes)
1638         return transcript->Attributes;
1639 
1640     if (!transcript->Adaptor)
1641     {
1642         ajDebug("ensTranscriptLoadAttributes cannot fetch "
1643                 "Ensembl Attribute objects for an "
1644                 "Ensembl Transcript without an "
1645                 "Ensembl Transcript Adaptor.\n");
1646 
1647         return NULL;
1648     }
1649 
1650     dba = ensTranscriptadaptorGetDatabaseadaptor(transcript->Adaptor);
1651 
1652     if (!dba)
1653     {
1654         ajDebug("ensTranscriptLoadAttributes cannot fetch "
1655                 "Ensembl Attribute objects for an "
1656                 "Ensembl Transcript without an "
1657                 "Ensembl Database Adaptor set in the "
1658                 "Ensembl Transcript Adaptor.\n");
1659 
1660         return NULL;
1661     }
1662 
1663     ata = ensRegistryGetAttributeadaptor(dba);
1664 
1665     transcript->Attributes = ajListNew();
1666 
1667     ensAttributeadaptorFetchAllbyTranscript(ata,
1668                                             transcript,
1669                                             (const AjPStr) NULL,
1670                                             transcript->Attributes);
1671 
1672     return transcript->Attributes;
1673 }
1674 
1675 
1676 
1677 
1678 /* @func ensTranscriptLoadCanonical *******************************************
1679 **
1680 ** Load the canonical member of an Ensembl Transcript.
1681 **
1682 ** This is not a simple accessor function, it will fetch the canonical flag
1683 ** from an Ensembl SQL database in case the flag is not defined.
1684 **
1685 ** @cc Bio::EnsEMBL::Transcript::is_canonical
1686 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
1687 ** @see ensTranscriptadaptorRetrieveCanonical
1688 **
1689 ** @return [const AjBool*] Canonical attribute or NULL
1690 **
1691 ** @release 6.5.0
1692 ** @@
1693 ******************************************************************************/
1694 
ensTranscriptLoadCanonical(EnsPTranscript transcript)1695 const AjBool* ensTranscriptLoadCanonical(
1696     EnsPTranscript transcript)
1697 {
1698     AjBool canonical = AJFALSE;
1699 
1700     if (!transcript)
1701         return NULL;
1702 
1703     if (transcript->Canonical)
1704         return transcript->Canonical;
1705 
1706     if (!transcript->Canonical)
1707     {
1708         ajDebug("ensTranscriptLoadCanonical cannot fetch "
1709                 "the canonical flag for an "
1710                 "Ensembl Transcript without an "
1711                 "Ensembl Transcript Adaptor.\n");
1712 
1713         return NULL;
1714     }
1715 
1716     ensTranscriptadaptorRetrieveCanonical(transcript->Adaptor,
1717                                           transcript,
1718                                           &canonical);
1719 
1720     return transcript->Canonical;
1721 }
1722 
1723 
1724 
1725 
1726 /* @func ensTranscriptLoadDatabaseentries *************************************
1727 **
1728 ** Load all Ensembl Database Entry objects of an Ensembl Transcript.
1729 **
1730 ** This is not a simple accessor function, since it will attempt loading the
1731 ** Ensembl Database Entry objects from the Ensembl SQL database associated with
1732 ** the Ensembl Transcript Adaptor.
1733 **
1734 ** To filter Ensembl Database Entry objects via an Ensembl External Database
1735 ** name or type, consider using ensTranscriptFetchAllDatabaseentries.
1736 **
1737 ** @cc Bio::EnsEMBL::Transcript::get_all_DBEntries
1738 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
1739 ** @see ensTranscriptFetchAllDatabaseentries
1740 **
1741 ** @return [const AjPList] AJAX List of Ensembl Database Entry objects or NULL
1742 **
1743 ** @release 6.4.0
1744 ** @@
1745 ******************************************************************************/
1746 
ensTranscriptLoadDatabaseentries(EnsPTranscript transcript)1747 const AjPList ensTranscriptLoadDatabaseentries(
1748     EnsPTranscript transcript)
1749 {
1750     AjPStr objtype = NULL;
1751 
1752     EnsPDatabaseadaptor dba = NULL;
1753 
1754     EnsPDatabaseentryadaptor dbea = NULL;
1755 
1756     if (!transcript)
1757         return NULL;
1758 
1759     if (transcript->Databaseentries)
1760         return transcript->Databaseentries;
1761 
1762     if (!transcript->Adaptor)
1763     {
1764         ajDebug("ensTranscriptLoadDatabaseentries cannot fetch "
1765                 "Ensembl Database Entry objects for an "
1766                 "Ensembl Transcript without an "
1767                 "Ensembl Transcript Adaptor.\n");
1768 
1769         return NULL;
1770     }
1771 
1772     dba = ensTranscriptadaptorGetDatabaseadaptor(transcript->Adaptor);
1773 
1774     if (!dba)
1775     {
1776         ajDebug("ensTranscriptLoadDatabaseentries cannot fetch "
1777                 "Ensembl Database Entry objects for an "
1778                 "Ensembl Transcript without an "
1779                 "Ensembl Database Adaptor set in the "
1780                 "Ensembl Transcript Adaptor.\n");
1781 
1782         return NULL;
1783     }
1784 
1785     dbea = ensRegistryGetDatabaseentryadaptor(dba);
1786 
1787     objtype = ajStrNewC("Transcript");
1788 
1789     transcript->Databaseentries = ajListNew();
1790 
1791     ensDatabaseentryadaptorFetchAllbyObject(dbea,
1792                                             transcript->Identifier,
1793                                             objtype,
1794                                             (AjPStr) NULL,
1795                                             ensEExternaldatabaseTypeNULL,
1796                                             transcript->Databaseentries);
1797 
1798     ajStrDel(&objtype);
1799 
1800     return transcript->Databaseentries;
1801 }
1802 
1803 
1804 
1805 
1806 /* @func ensTranscriptLoadExons ***********************************************
1807 **
1808 ** Load all Ensembl Exon objects of an Ensembl Transcript.
1809 **
1810 ** This is not a simple accessor function, since it will attempt fetching the
1811 ** Ensembl Exon objects from the Ensembl Core database associated with the
1812 ** Ensembl Transcript Adaptor.
1813 **
1814 ** @cc Bio::EnsEMBL::Transcript::get_all_Exons
1815 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
1816 **
1817 ** @return [const AjPList] AJAX List of Ensembl Exon objects or NULL
1818 **
1819 ** @release 6.4.0
1820 ** @@
1821 ** NOTE: This implementation does not support the constitutive parameter.
1822 ** Please use the ensTranscriptFetchAllConstitutiveexons function instead.
1823 ******************************************************************************/
1824 
ensTranscriptLoadExons(EnsPTranscript transcript)1825 const AjPList ensTranscriptLoadExons(
1826     EnsPTranscript transcript)
1827 {
1828     EnsPDatabaseadaptor dba = NULL;
1829 
1830     EnsPExonadaptor ea = NULL;
1831 
1832     if (!transcript)
1833         return NULL;
1834 
1835     if (transcript->Exons)
1836         return transcript->Exons;
1837 
1838     if (!transcript->Adaptor)
1839     {
1840         ajDebug("ensTranscriptLoadExons cannot fetch "
1841                 "Ensembl Exon objects for an "
1842                 "Ensembl Transcript without an "
1843                 "Ensembl Transcript Adaptor.\n");
1844 
1845         return NULL;
1846     }
1847 
1848     dba = ensTranscriptadaptorGetDatabaseadaptor(transcript->Adaptor);
1849 
1850     ea = ensRegistryGetExonadaptor(dba);
1851 
1852     transcript->Exons = ajListNew();
1853 
1854     ensExonadaptorFetchAllbyTranscript(ea, transcript, transcript->Exons);
1855 
1856     return transcript->Exons;
1857 }
1858 
1859 
1860 
1861 
1862 /* @func ensTranscriptLoadIntronsupportingevidences ***************************
1863 **
1864 ** Load all Ensembl Intron Suppoorting Eidence objects of an
1865 ** Ensembl Transcript.
1866 **
1867 ** This is not a simple accessor function, since it will attempt fetching the
1868 ** Ensembl Intron Suppoorting Evidence objects from the
1869 ** Ensembl Core database associated with the Ensembl Transcript Adaptor.
1870 **
1871 ** @cc Bio::EnsEMBL::Transcript::get_all_IntronSupportingEvidence
1872 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
1873 **
1874 ** @return [const AjPList]
1875 ** AJAX List of Ensembl Intron Supporting Evidence objects or NULL
1876 **
1877 ** @release 6.5.0
1878 ** @@
1879 ******************************************************************************/
1880 
ensTranscriptLoadIntronsupportingevidences(EnsPTranscript transcript)1881 const AjPList ensTranscriptLoadIntronsupportingevidences(
1882     EnsPTranscript transcript)
1883 {
1884     EnsPDatabaseadaptor dba = NULL;
1885 
1886     EnsPIntronsupportingevidenceadaptor isea = NULL;
1887 
1888     if (!transcript)
1889         return NULL;
1890 
1891     if (transcript->Intronsupportingevidences)
1892         return transcript->Intronsupportingevidences;
1893 
1894     if (!transcript->Adaptor)
1895     {
1896         ajDebug("ensTranscriptLoadExons cannot fetch "
1897                 "Ensembl Intron Suppoorting Evidence objects for an "
1898                 "Ensembl Transcript without an "
1899                 "Ensembl Transcript Adaptor.\n");
1900 
1901         return NULL;
1902     }
1903 
1904     dba = ensTranscriptadaptorGetDatabaseadaptor(transcript->Adaptor);
1905 
1906     isea = ensRegistryGetIntronsupportingevidenceadaptor(dba);
1907 
1908     transcript->Intronsupportingevidences = ajListNew();
1909 
1910     ensIntronsupportingevidenceadaptorFetchAllbyTranscript(
1911         isea,
1912         transcript,
1913         transcript->Intronsupportingevidences);
1914 
1915     return transcript->Intronsupportingevidences;
1916 }
1917 
1918 
1919 
1920 
1921 /* @func ensTranscriptLoadSupportingfeatures **********************************
1922 **
1923 ** Load all Ensembl Supporting Feature objects of an Ensembl Transcript.
1924 **
1925 ** This is not a simple accessor function, since it will attempt loading the
1926 ** supporting Ensembl Base Align Feature objects from the Ensembl SQL database
1927 ** associated with the Ensembl Transcript Adaptor.
1928 **
1929 ** @cc Bio::EnsEMBL::Transcript::get_all_supporting_features
1930 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
1931 **
1932 ** @return [const AjPList] AJAX List of Ensembl Base Align Feature objects
1933 ** or NULL
1934 **
1935 ** @release 6.4.0
1936 ** @@
1937 ******************************************************************************/
1938 
ensTranscriptLoadSupportingfeatures(EnsPTranscript transcript)1939 const AjPList ensTranscriptLoadSupportingfeatures(
1940     EnsPTranscript transcript)
1941 {
1942     EnsPDatabaseadaptor dba = NULL;
1943 
1944     EnsPSupportingfeatureadaptor sfa = NULL;
1945 
1946     if (!transcript)
1947         return NULL;
1948 
1949     if (transcript->Supportingfeatures)
1950         return transcript->Supportingfeatures;
1951 
1952     if (!transcript->Adaptor)
1953     {
1954         ajDebug("ensTranscriptLoadSupportingfeatures cannot fetch "
1955                 "Ensembl Base Align Feature objects for an Ensembl Transcript "
1956                 "without an Ensembl Transcript Adaptor.\n");
1957 
1958         return NULL;
1959     }
1960 
1961     dba = ensTranscriptadaptorGetDatabaseadaptor(transcript->Adaptor);
1962 
1963     sfa = ensRegistryGetSupportingfeatureadaptor(dba);
1964 
1965     transcript->Supportingfeatures = ajListNew();
1966 
1967     ensSupportingfeatureadaptorFetchAllbyTranscript(
1968         sfa,
1969         transcript,
1970         transcript->Supportingfeatures);
1971 
1972     return transcript->Supportingfeatures;
1973 }
1974 
1975 
1976 
1977 
1978 /* @func ensTranscriptLoadTranslation *****************************************
1979 **
1980 ** Load the Ensembl Translation of an Ensembl Transcript.
1981 **
1982 ** This is not a simple accessor function, since it will attempt loading the
1983 ** Ensembl Translation from the Ensembl Core database associated
1984 ** with the Ensembl Transcript Adaptor.
1985 **
1986 ** @cc Bio::EnsEMBL::Transcript::translation
1987 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
1988 **
1989 ** @return [EnsPTranslation] Ensembl Translation objects or NULL
1990 **
1991 ** @release 6.4.0
1992 ** @@
1993 ******************************************************************************/
1994 
ensTranscriptLoadTranslation(EnsPTranscript transcript)1995 EnsPTranslation ensTranscriptLoadTranslation(
1996     EnsPTranscript transcript)
1997 {
1998     EnsPDatabaseadaptor dba = NULL;
1999 
2000     EnsPTranslationadaptor tla = NULL;
2001 
2002     if (!transcript)
2003         return NULL;
2004 
2005     if (transcript->Translation)
2006         return transcript->Translation;
2007 
2008     if (!transcript->Adaptor)
2009     {
2010         ajDebug("ensTranscriptLoadTranslation cannot fetch an "
2011                 "Ensembl Translation for a Transcript without a "
2012                 "Transcript Adaptor.\n");
2013 
2014         return NULL;
2015     }
2016 
2017     dba = ensTranscriptadaptorGetDatabaseadaptor(transcript->Adaptor);
2018 
2019     tla = ensRegistryGetTranslationadaptor(dba);
2020 
2021     ensTranslationadaptorFetchByTranscript(tla, transcript);
2022 
2023     return transcript->Translation;
2024 }
2025 
2026 
2027 
2028 
2029 /* @section member assignment *************************************************
2030 **
2031 ** Functions for assigning members of an Ensembl Transcript object.
2032 **
2033 ** @fdata [EnsPTranscript]
2034 **
2035 ** @nam3rule Set Set one member of an Ensembl Transcript
2036 ** @nam4rule Adaptor Set the Ensembl Transcript Adaptor
2037 ** @nam4rule Biotype Set the biological type
2038 ** @nam4rule Canonical Set the canonical attribute
2039 ** @nam4rule Current Set the current attribute
2040 ** @nam4rule Date Set a date
2041 ** @nam5rule DateCreation Set the creation date
2042 ** @nam5rule DateModification Set the modification date
2043 ** @nam4rule Description Set the description
2044 ** @nam4rule Displayreference Set the display Ensembl Database Entry
2045 ** @nam4rule Feature Set the Ensembl Feature
2046 ** @nam4rule Geneidentifier Set the Ensembl Gene identifier
2047 ** @nam4rule Identifier Set the SQL database-internal identifier
2048 ** @nam4rule Stableidentifier Set the stable identifier
2049 ** @nam4rule Status Set the status
2050 ** @nam4rule Version Set the version
2051 ** @nam4rule Sequenceedits Set enable Ensembl Sequence Edit objects
2052 ** @nam4rule Translation Set the Ensembl Translation
2053 **
2054 ** @argrule * transcript [EnsPTranscript] Ensembl Transcript object
2055 **
2056 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
2057 ** @argrule Adaptor tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
2058 ** @argrule Biotype biotype [AjPStr] Biological type
2059 ** @argrule Canonical canonical [AjBool] Canonical attribute
2060 ** @argrule Current current [AjBool] Current attribute
2061 ** @argrule DateCreation cdate [AjPStr] Creation date
2062 ** @argrule DateModification mdate [AjPStr] Modification date
2063 ** @argrule Description description [AjPStr] Description
2064 ** @argrule Displayreference displaydbe [EnsPDatabaseentry] Ensembl Database
2065 ** Entry
2066 ** @argrule Feature feature [EnsPFeature] Ensembl Feature
2067 ** @argrule Geneidentifier geneid [ajuint] Ensembl Gene identifier
2068 ** @argrule Identifier identifier [ajuint] SQL database-internal identifier
2069 ** @argrule Sequenceedits enablese [AjBool] Enable Ensembl Sequence Edit
2070 ** objects
2071 ** @argrule Stableidentifier stableid [AjPStr] Stable identifier
2072 ** @argrule Status status [EnsETranscriptStatus] Status
2073 ** @argrule Translation translation [EnsPTranslation] Ensembl Translation
2074 ** @argrule Version version [ajuint] Version
2075 **
2076 ** @fcategory modify
2077 ******************************************************************************/
2078 
2079 
2080 
2081 
2082 /* @func ensTranscriptSetAdaptor **********************************************
2083 **
2084 ** Set the Ensembl Transcript Adaptor member of an Ensembl Transcript.
2085 **
2086 ** @cc Bio::EnsEMBL::Storable::adaptor
2087 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2088 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
2089 **
2090 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2091 **
2092 ** @release 6.2.0
2093 ** @@
2094 ******************************************************************************/
2095 
ensTranscriptSetAdaptor(EnsPTranscript transcript,EnsPTranscriptadaptor tca)2096 AjBool ensTranscriptSetAdaptor(EnsPTranscript transcript,
2097                                EnsPTranscriptadaptor tca)
2098 {
2099     if (!transcript)
2100         return ajFalse;
2101 
2102     transcript->Adaptor = tca;
2103 
2104     return ajTrue;
2105 }
2106 
2107 
2108 
2109 
2110 /* @func ensTranscriptSetBiotype **********************************************
2111 **
2112 ** Set the biological type member of an Ensembl Transcript.
2113 **
2114 ** @cc Bio::EnsEMBL::Transcript::biotype
2115 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2116 ** @param [uN] biotype [AjPStr] Biological type
2117 **
2118 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2119 **
2120 ** @release 6.4.0
2121 ** @@
2122 ******************************************************************************/
2123 
ensTranscriptSetBiotype(EnsPTranscript transcript,AjPStr biotype)2124 AjBool ensTranscriptSetBiotype(EnsPTranscript transcript,
2125                                AjPStr biotype)
2126 {
2127     if (!transcript)
2128         return ajFalse;
2129 
2130     ajStrDel(&transcript->Biotype);
2131 
2132     if (biotype)
2133         transcript->Description = ajStrNewRef(biotype);
2134 
2135     return ajTrue;
2136 }
2137 
2138 
2139 
2140 
2141 /* @func ensTranscriptSetCanonical ********************************************
2142 **
2143 ** Set the canonical member of an Ensembl Transcript.
2144 **
2145 ** @cc Bio::EnsEMBL::Transcript::is_canonical
2146 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2147 ** @param [r] canonical [AjBool] Canonical attribute
2148 **
2149 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2150 **
2151 ** @release 6.4.0
2152 ** @@
2153 ******************************************************************************/
2154 
ensTranscriptSetCanonical(EnsPTranscript transcript,AjBool canonical)2155 AjBool ensTranscriptSetCanonical(EnsPTranscript transcript,
2156                                  AjBool canonical)
2157 {
2158     AjBool *Pcanonical = NULL;
2159 
2160     if (!transcript)
2161         return ajFalse;
2162 
2163     if (!transcript->Canonical)
2164     {
2165         AJNEW0(Pcanonical);
2166 
2167         transcript->Canonical = Pcanonical;
2168     }
2169 
2170     *transcript->Canonical = canonical;
2171 
2172     return ajTrue;
2173 }
2174 
2175 
2176 
2177 
2178 /* @func ensTranscriptSetCurrent **********************************************
2179 **
2180 ** Set the current member of an Ensembl Transcript.
2181 **
2182 ** @cc Bio::EnsEMBL::Transcript::is_current
2183 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2184 ** @param [r] current [AjBool] Current attribute
2185 **
2186 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2187 **
2188 ** @release 6.3.0
2189 ** @@
2190 ******************************************************************************/
2191 
ensTranscriptSetCurrent(EnsPTranscript transcript,AjBool current)2192 AjBool ensTranscriptSetCurrent(EnsPTranscript transcript,
2193                                AjBool current)
2194 {
2195     if (!transcript)
2196         return ajFalse;
2197 
2198     transcript->Current = current;
2199 
2200     return ajTrue;
2201 }
2202 
2203 
2204 
2205 
2206 /* @func ensTranscriptSetDateCreation *****************************************
2207 **
2208 ** Set the creation date member of an Ensembl Transcript.
2209 **
2210 ** @cc Bio::EnsEMBL::Transcript::created_date
2211 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2212 ** @param [uN] cdate [AjPStr] Creation date
2213 **
2214 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2215 **
2216 ** @release 6.4.0
2217 ** @@
2218 ******************************************************************************/
2219 
ensTranscriptSetDateCreation(EnsPTranscript transcript,AjPStr cdate)2220 AjBool ensTranscriptSetDateCreation(EnsPTranscript transcript,
2221                                     AjPStr cdate)
2222 {
2223     if (!transcript)
2224         return ajFalse;
2225 
2226     ajStrDel(&transcript->DateCreation);
2227 
2228     if (cdate)
2229         transcript->DateCreation = ajStrNewRef(cdate);
2230 
2231     return ajTrue;
2232 }
2233 
2234 
2235 
2236 
2237 /* @func ensTranscriptSetDateModification *************************************
2238 **
2239 ** Set the modification date member of an Ensembl Transcript.
2240 **
2241 ** @cc Bio::EnsEMBL::Transcript::modified_date
2242 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2243 ** @param [uN] mdate [AjPStr] Modification date
2244 **
2245 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2246 **
2247 ** @release 6.4.0
2248 ** @@
2249 ******************************************************************************/
2250 
ensTranscriptSetDateModification(EnsPTranscript transcript,AjPStr mdate)2251 AjBool ensTranscriptSetDateModification(EnsPTranscript transcript,
2252                                         AjPStr mdate)
2253 {
2254     if (!transcript)
2255         return ajFalse;
2256 
2257     ajStrDel(&transcript->DateModification);
2258 
2259     if (mdate)
2260         transcript->DateModification = ajStrNewRef(mdate);
2261 
2262     return ajTrue;
2263 }
2264 
2265 
2266 
2267 
2268 /* @func ensTranscriptSetDescription ******************************************
2269 **
2270 ** Set the description member of an Ensembl Transcript.
2271 **
2272 ** @cc Bio::EnsEMBL::Transcript::description
2273 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2274 ** @param [uN] description [AjPStr] Description
2275 **
2276 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2277 **
2278 ** @release 6.3.0
2279 ** @@
2280 ******************************************************************************/
2281 
ensTranscriptSetDescription(EnsPTranscript transcript,AjPStr description)2282 AjBool ensTranscriptSetDescription(EnsPTranscript transcript,
2283                                    AjPStr description)
2284 {
2285     if (!transcript)
2286         return ajFalse;
2287 
2288     ajStrDel(&transcript->Description);
2289 
2290     if (description)
2291         transcript->Description = ajStrNewRef(description);
2292 
2293     return ajTrue;
2294 }
2295 
2296 
2297 
2298 
2299 /* @func ensTranscriptSetDisplayreference *************************************
2300 **
2301 ** Set the display Ensembl Database Entry member of an Ensembl Transcript.
2302 **
2303 ** @cc Bio::EnsEMBL::Transcript::display_xref
2304 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2305 ** @param [uN] displaydbe [EnsPDatabaseentry] Ensembl Database Entry
2306 **
2307 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2308 **
2309 ** @release 6.4.0
2310 ** @@
2311 ******************************************************************************/
2312 
ensTranscriptSetDisplayreference(EnsPTranscript transcript,EnsPDatabaseentry displaydbe)2313 AjBool ensTranscriptSetDisplayreference(EnsPTranscript transcript,
2314                                         EnsPDatabaseentry displaydbe)
2315 {
2316     if (!transcript)
2317         return ajFalse;
2318 
2319     ensDatabaseentryDel(&transcript->Displayreference);
2320 
2321     transcript->Displayreference = ensDatabaseentryNewRef(displaydbe);
2322 
2323     return ajTrue;
2324 }
2325 
2326 
2327 
2328 
2329 /* @func ensTranscriptSetFeature **********************************************
2330 **
2331 ** Set the Ensembl Feature member of an Ensembl Transcript.
2332 **
2333 ** @cc Bio::EnsEMBL::Feature
2334 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2335 ** @param [u] feature [EnsPFeature] Ensembl Feature
2336 **
2337 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2338 **
2339 ** @release 6.2.0
2340 ** @@
2341 ******************************************************************************/
2342 
ensTranscriptSetFeature(EnsPTranscript transcript,EnsPFeature feature)2343 AjBool ensTranscriptSetFeature(EnsPTranscript transcript,
2344                                EnsPFeature feature)
2345 {
2346     AjIList iter1 = NULL;
2347     AjIList iter2 = NULL;
2348 
2349     EnsPBasealignfeature oldbaf = NULL;
2350     EnsPBasealignfeature newbaf = NULL;
2351 
2352     EnsPExon oldexon = NULL;
2353     EnsPExon newexon = NULL;
2354 
2355     EnsPIntronsupportingevidence oldise = NULL;
2356     EnsPIntronsupportingevidence newise = NULL;
2357 
2358     EnsPSlice slice = NULL;
2359 
2360     EnsPTranslation translation = NULL;
2361 
2362     if (ajDebugTest("ensTranscriptSetFeature"))
2363     {
2364         ajDebug("ensTranscriptSetFeature\n"
2365                 "  transcript %p\n"
2366                 "  feature %p\n",
2367                 transcript,
2368                 feature);
2369 
2370         ensTranscriptTrace(transcript, 1);
2371 
2372         ensFeatureTrace(feature, 1);
2373     }
2374 
2375     if (!transcript)
2376         return ajFalse;
2377 
2378     if (!feature)
2379         return ajFalse;
2380 
2381     /* Replace the current Feature. */
2382 
2383     ensFeatureDel(&transcript->Feature);
2384 
2385     transcript->Feature = ensFeatureNewRef(feature);
2386 
2387     slice = ensFeatureGetSlice(transcript->Feature);
2388 
2389     /*
2390     ** Transfer Ensembl Exon objects onto the new Ensembl Feature Slice and
2391     ** thereby also adjust the start and end Exon objects of the
2392     ** Ensembl Translation if it is defined.
2393     */
2394 
2395     if (transcript->Exons)
2396     {
2397         iter1 = ajListIterNew(transcript->Exons);
2398 
2399         while (!ajListIterDone(iter1))
2400         {
2401             oldexon = (EnsPExon) ajListIterGet(iter1);
2402 
2403             ajListIterRemove(iter1);
2404 
2405             newexon = ensExonTransfer(oldexon, slice);
2406 
2407             if (!newexon)
2408             {
2409                 ajDebug("ensTranscriptSetFeature could not transfer "
2410                         "Ensembl Exon onto new "
2411                         "Ensembl Feature Slice.");
2412 
2413                 ensExonTrace(oldexon, 1);
2414             }
2415 
2416             ajListIterInsert(iter1, (void *) newexon);
2417 
2418             /* Advance the AJAX List Iterator after the insert. */
2419 
2420             (void) ajListIterGet(iter1);
2421 
2422             /*
2423             ** Re-assign the start and end Ensembl Exon objects of the
2424             ** Ensembl Translation.
2425             */
2426 
2427             if (transcript->Translation)
2428             {
2429                 if (ensExonMatch(
2430                         oldexon,
2431                         ensTranslationGetStartexon(transcript->Translation)))
2432                     ensTranslationSetStartexon(transcript->Translation,
2433                                                newexon);
2434 
2435                 if (ensExonMatch(
2436                         oldexon,
2437                         ensTranslationGetEndexon(transcript->Translation)))
2438                     ensTranslationSetEndexon(transcript->Translation,
2439                                              newexon);
2440             }
2441 
2442             /*
2443             ** Reassign also the start and end Exon for each alternative
2444             ** Translation of this Transcript.
2445             */
2446 
2447             if (transcript->Alternativetranslations)
2448             {
2449                 iter2 = ajListIterNew(transcript->Alternativetranslations);
2450 
2451                 while (!ajListIterDone(iter2))
2452                 {
2453                     translation = (EnsPTranslation) ajListIterGet(iter2);
2454 
2455                     if (ensExonMatch(
2456                             oldexon,
2457                             ensTranslationGetStartexon(translation)))
2458                         ensTranslationSetStartexon(translation, newexon);
2459 
2460                     if (ensExonMatch(
2461                             oldexon,
2462                             ensTranslationGetEndexon(translation)))
2463                         ensTranslationSetEndexon(translation, newexon);
2464                 }
2465 
2466                 ajListIterDel(&iter2);
2467             }
2468 
2469             ensExonDel(&oldexon);
2470         }
2471 
2472         ajListIterDel(&iter1);
2473     }
2474 
2475     /*
2476     ** Transfer all Ensembl Intron Supporting Evidence objects onto the new
2477     ** Ensembl Feature Slice.
2478     */
2479 
2480     if (transcript->Intronsupportingevidences)
2481     {
2482         iter1 = ajListIterNew(transcript->Intronsupportingevidences);
2483 
2484         while (!ajListIterDone(iter1))
2485         {
2486             oldise = (EnsPIntronsupportingevidence) ajListIterGet(iter1);
2487 
2488             ajListIterRemove(iter1);
2489 
2490             newise = ensIntronsupportingevidenceTransfer(oldise, slice);
2491 
2492             if (!newise)
2493             {
2494                 ajDebug("ensTranscriptSetFeature could not transfer "
2495                         "Ensembl Intron Supporting Evidence onto new "
2496                         "Ensembl Feature Slice.");
2497 
2498                 ensIntronsupportingevidenceTrace(oldise, 1);
2499             }
2500 
2501             ajListIterInsert(iter1, (void *) newise);
2502 
2503             /* Advance the AJAX List Iterator after the insert. */
2504 
2505             (void) ajListIterGet(iter1);
2506 
2507             ensIntronsupportingevidenceDel(&oldise);
2508         }
2509 
2510         ajListIterDel(&iter1);
2511     }
2512 
2513     /*
2514     ** Transfer all Ensembl Base Align Feature objects onto the new
2515     ** Ensembl Feature Slice.
2516     */
2517 
2518     if (transcript->Supportingfeatures)
2519     {
2520         iter1 = ajListIterNew(transcript->Supportingfeatures);
2521 
2522         while (!ajListIterDone(iter1))
2523         {
2524             oldbaf = (EnsPBasealignfeature) ajListIterGet(iter1);
2525 
2526             ajListIterRemove(iter1);
2527 
2528             newbaf = ensBasealignfeatureTransfer(oldbaf, slice);
2529 
2530             if (!newbaf)
2531             {
2532                 ajDebug("ensTranscriptSetFeature could not transfer "
2533                         "Ensembl Base Align Feature onto new "
2534                         "Ensembl Feature Slice.");
2535 
2536                 ensBasealignfeatureTrace(oldbaf, 1);
2537             }
2538 
2539             ajListIterInsert(iter1, (void *) newbaf);
2540 
2541             /* Advance the AJAX List Iterator after the insert. */
2542 
2543             (void) ajListIterGet(iter1);
2544 
2545             ensBasealignfeatureDel(&oldbaf);
2546         }
2547 
2548         ajListIterDel(&iter1);
2549     }
2550 
2551     /* Clear internal members that depend on Ensembl Exon coordinates. */
2552 
2553     ensMapperClear(transcript->ExonCoordMapper);
2554 
2555     return ajTrue;
2556 }
2557 
2558 
2559 
2560 
2561 /* @func ensTranscriptSetGeneidentifier ***************************************
2562 **
2563 ** Set the Ensembl Gene identifier member of an Ensembl Transcript.
2564 **
2565 ** @cc Bio::EnsEMBL::Transcript::???
2566 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2567 ** @param [r] geneid [ajuint] Ensembl Gene identifier
2568 **
2569 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2570 **
2571 ** @release 6.4.0
2572 ** @@
2573 ******************************************************************************/
2574 
ensTranscriptSetGeneidentifier(EnsPTranscript transcript,ajuint geneid)2575 AjBool ensTranscriptSetGeneidentifier(EnsPTranscript transcript,
2576                                       ajuint geneid)
2577 {
2578     if (!transcript)
2579         return ajFalse;
2580 
2581     transcript->Geneidentifier = geneid;
2582 
2583     return ajTrue;
2584 }
2585 
2586 
2587 
2588 
2589 /* @func ensTranscriptSetIdentifier *******************************************
2590 **
2591 ** Set the SQL database-internal identifier member of an Ensembl Transcript.
2592 **
2593 ** @cc Bio::EnsEMBL::Storable::dbID
2594 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2595 ** @param [r] identifier [ajuint] SQL database-internal identifier
2596 **
2597 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2598 **
2599 ** @release 6.2.0
2600 ** @@
2601 ******************************************************************************/
2602 
ensTranscriptSetIdentifier(EnsPTranscript transcript,ajuint identifier)2603 AjBool ensTranscriptSetIdentifier(EnsPTranscript transcript, ajuint identifier)
2604 {
2605     if (!transcript)
2606         return ajFalse;
2607 
2608     transcript->Identifier = identifier;
2609 
2610     return ajTrue;
2611 }
2612 
2613 
2614 
2615 
2616 /* @func ensTranscriptSetSequenceedits ****************************************
2617 **
2618 ** Set the enable Ensembl Sequence Edit object member of an
2619 ** Ensembl Transcript.
2620 **
2621 ** @cc Bio::EnsEMBL::Transcript::edits_enabled
2622 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2623 ** @param [r] enablese [AjBool] Enable Ensembl Sequence Edit objects
2624 **
2625 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2626 **
2627 ** @release 6.4.0
2628 ** @@
2629 ******************************************************************************/
2630 
ensTranscriptSetSequenceedits(EnsPTranscript transcript,AjBool enablese)2631 AjBool ensTranscriptSetSequenceedits(EnsPTranscript transcript,
2632                                      AjBool enablese)
2633 {
2634     if (!transcript)
2635         return ajFalse;
2636 
2637     transcript->Sequenceedits = enablese;
2638 
2639     return ajTrue;
2640 }
2641 
2642 
2643 
2644 
2645 /* @func ensTranscriptSetStableidentifier *************************************
2646 **
2647 ** Set the stable identifier member of an Ensembl Transcript.
2648 **
2649 ** @cc Bio::EnsEMBL::Transcript::stable_id
2650 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2651 ** @param [uN] stableid [AjPStr] Stable identifier
2652 **
2653 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2654 **
2655 ** @release 6.4.0
2656 ** @@
2657 ******************************************************************************/
2658 
ensTranscriptSetStableidentifier(EnsPTranscript transcript,AjPStr stableid)2659 AjBool ensTranscriptSetStableidentifier(EnsPTranscript transcript,
2660                                         AjPStr stableid)
2661 {
2662     if (!transcript)
2663         return ajFalse;
2664 
2665     ajStrDel(&transcript->Stableidentifier);
2666 
2667     if (stableid)
2668         transcript->Stableidentifier = ajStrNewRef(stableid);
2669 
2670     return ajTrue;
2671 }
2672 
2673 
2674 
2675 
2676 /* @func ensTranscriptSetStatus ***********************************************
2677 **
2678 ** Set the status member of an Ensembl Transcript.
2679 **
2680 ** @cc Bio::EnsEMBL::Transcript::status
2681 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2682 ** @param [u] status [EnsETranscriptStatus] Status
2683 **
2684 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2685 **
2686 ** @release 6.3.0
2687 ** @@
2688 ******************************************************************************/
2689 
ensTranscriptSetStatus(EnsPTranscript transcript,EnsETranscriptStatus status)2690 AjBool ensTranscriptSetStatus(EnsPTranscript transcript,
2691                               EnsETranscriptStatus status)
2692 {
2693     if (!transcript)
2694         return ajFalse;
2695 
2696     transcript->Status = status;
2697 
2698     return ajTrue;
2699 }
2700 
2701 
2702 
2703 
2704 /* @func ensTranscriptSetTranslation ******************************************
2705 **
2706 ** Set the Ensembl Translation member of an Ensembl Transcript.
2707 **
2708 ** @cc Bio::EnsEMBL::Transcript::translation
2709 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2710 ** @param [uE] translation [EnsPTranslation] Ensembl Translation
2711 **
2712 ** @return [AjBool] ajTrue on success, ajFalse otherwise
2713 **
2714 ** @release 6.3.0
2715 ** @@
2716 ******************************************************************************/
2717 
ensTranscriptSetTranslation(EnsPTranscript transcript,EnsPTranslation translation)2718 AjBool ensTranscriptSetTranslation(EnsPTranscript transcript,
2719                                    EnsPTranslation translation)
2720 {
2721     if (!transcript)
2722         return ajFalse;
2723 
2724     ensTranslationDel(&transcript->Translation);
2725 
2726     transcript->Translation = ensTranslationNewRef(translation);
2727 
2728     /* Clear internal members that depend on Ensembl Translation coordinates. */
2729 
2730     /*
2731     ** NOTE: The Perl API clears the Bio::EnsEMBL::TranscriptMapper,
2732     ** although it is independent of a Bio::EnsEMBL::Translation.
2733     ** It also sets the Bio::EnsEMBL::Transcript in the
2734     ** Bio::EnsEMBL::Translation object via weak references,
2735     ** which is not implemented here.
2736     */
2737 
2738     return ajTrue;
2739 }
2740 
2741 
2742 
2743 
2744 /* @func ensTranscriptSetVersion **********************************************
2745 **
2746 ** Set the version member of an Ensembl Transcript.
2747 **
2748 ** @cc Bio::EnsEMBL::Transcript::version
2749 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2750 ** @param [r] version [ajuint] Version
2751 **
2752 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2753 **
2754 ** @release 6.3.0
2755 ** @@
2756 ******************************************************************************/
2757 
ensTranscriptSetVersion(EnsPTranscript transcript,ajuint version)2758 AjBool ensTranscriptSetVersion(EnsPTranscript transcript,
2759                                ajuint version)
2760 {
2761     if (!transcript)
2762         return ajFalse;
2763 
2764     transcript->Version = version;
2765 
2766     return ajTrue;
2767 }
2768 
2769 
2770 
2771 
2772 /* @section member addition ***************************************************
2773 **
2774 ** Functions for adding members to an Ensembl Transcript object.
2775 **
2776 ** @fdata [EnsPTranscript]
2777 **
2778 ** @nam3rule Add Add one object to an Ensembl Transcript
2779 ** @nam4rule Alternativetranslation Add an alternative Ensembl Translation
2780 ** @nam4rule Attribute Add an Ensembl Attribute
2781 ** @nam4rule Databaseentry Add an Ensembl Database Entry
2782 ** @nam4rule Exon Add an Ensembl Exon
2783 ** @nam4rule Intronsupportingevidence Add an Ensembl Intron Supporting Evidence
2784 **
2785 ** @argrule * transcript [EnsPTranscript] Ensembl Transcript object
2786 ** @argrule Alternativetranslation translation [EnsPTranslation]
2787 **                                                         Ensembl Translation
2788 ** @argrule Attribute attribute [EnsPAttribute] Ensembl Attribute
2789 ** @argrule Databaseentry dbe [EnsPDatabaseentry] Ensembl Database Entry
2790 ** @argrule Exon exon [EnsPExon] Ensembl Exon
2791 ** @argrule Exon rank [ajint] Ensembl Exon rank
2792 ** @argrule Intronsupportingevidence ise [EnsPIntronsupportingevidence]
2793 ** Ensembl Intron Supporting Evidence
2794 **
2795 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
2796 **
2797 ** @fcategory modify
2798 ******************************************************************************/
2799 
2800 
2801 
2802 
2803 /* @func ensTranscriptAddAlternativetranslation *******************************
2804 **
2805 ** Add an alternative Ensembl Translation to an Ensembl Transcript.
2806 **
2807 ** @cc Bio::EnsEMBL::Transcript::add_alternative_translation
2808 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2809 ** @param [u] translation [EnsPTranslation] Ensembl Translation
2810 **
2811 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2812 **
2813 ** @release 6.4.0
2814 ** @@
2815 ******************************************************************************/
2816 
ensTranscriptAddAlternativetranslation(EnsPTranscript transcript,EnsPTranslation translation)2817 AjBool ensTranscriptAddAlternativetranslation(
2818     EnsPTranscript transcript,
2819     EnsPTranslation translation)
2820 {
2821     if (!transcript)
2822         return ajFalse;
2823 
2824     if (!translation)
2825         return ajFalse;
2826 
2827     if (!transcript->Alternativetranslations)
2828         transcript->Alternativetranslations = ajListNew();
2829 
2830     ajListPushAppend(transcript->Alternativetranslations,
2831                      (void *) ensTranslationNewRef(translation));
2832 
2833     return ajTrue;
2834 }
2835 
2836 
2837 
2838 
2839 /* @func ensTranscriptAddAttribute ********************************************
2840 **
2841 ** Add an Ensembl Attribute to an Ensembl Transcript.
2842 **
2843 ** @cc Bio::EnsEMBL::Transcript::add_Attribute
2844 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2845 ** @param [u] attribute [EnsPAttribute] Ensembl Attribute
2846 **
2847 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2848 **
2849 ** @release 6.2.0
2850 ** @@
2851 ******************************************************************************/
2852 
ensTranscriptAddAttribute(EnsPTranscript transcript,EnsPAttribute attribute)2853 AjBool ensTranscriptAddAttribute(
2854     EnsPTranscript transcript,
2855     EnsPAttribute attribute)
2856 {
2857     register ajuint i = 0U;
2858 
2859     AjBool match = AJFALSE;
2860 
2861     if (!transcript)
2862         return ajFalse;
2863 
2864     if (!attribute)
2865         return ajFalse;
2866 
2867     if (!transcript->Attributes)
2868         transcript->Attributes = ajListNew();
2869 
2870     ajListPushAppend(transcript->Attributes,
2871                      (void *) ensAttributeNewRef(attribute));
2872 
2873     /*
2874     ** Check if this Attribute is associated with a Sequence Edit and clear
2875     ** internal members that depend on the now modified Transcript sequence.
2876     */
2877 
2878     for (i = 0U; transcriptKSequenceeditCode[i]; i++)
2879         if (ajStrMatchC(ensAttributeGetCode(attribute),
2880                         transcriptKSequenceeditCode[i]))
2881             match = ajTrue;
2882 
2883     if (match)
2884         ensMapperClear(transcript->ExonCoordMapper);
2885 
2886     return ajTrue;
2887 }
2888 
2889 
2890 
2891 
2892 /* @func ensTranscriptAddDatabaseentry ****************************************
2893 **
2894 ** Add an Ensembl Database Entry to an Ensembl Transcript.
2895 **
2896 ** @cc Bio::EnsEMBL::Transcript::add_DBEntry
2897 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2898 ** @param [u] dbe [EnsPDatabaseentry] Ensembl Database Entry
2899 **
2900 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2901 **
2902 ** @release 6.2.0
2903 ** @@
2904 ******************************************************************************/
2905 
ensTranscriptAddDatabaseentry(EnsPTranscript transcript,EnsPDatabaseentry dbe)2906 AjBool ensTranscriptAddDatabaseentry(
2907     EnsPTranscript transcript,
2908     EnsPDatabaseentry dbe)
2909 {
2910     if (!transcript)
2911         return ajFalse;
2912 
2913     if (!dbe)
2914         return ajFalse;
2915 
2916     if (!transcript->Databaseentries)
2917         transcript->Databaseentries = ajListNew();
2918 
2919     ajListPushAppend(transcript->Databaseentries,
2920                      (void *) ensDatabaseentryNewRef(dbe));
2921 
2922     return ajTrue;
2923 }
2924 
2925 
2926 
2927 
2928 /* @func ensTranscriptAddExon *************************************************
2929 **
2930 ** Add an Ensembl Exon to an Ensembl Transcript.
2931 **
2932 ** @cc Bio::EnsEMBL::Transcript::add_Exon
2933 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
2934 ** @param [u] exon [EnsPExon] Ensembl Exon
2935 ** @param [rE] rank [ajint] Ensembl Exon rank
2936 **
2937 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2938 **
2939 ** @release 6.3.0
2940 ** @@
2941 ******************************************************************************/
2942 
ensTranscriptAddExon(EnsPTranscript transcript,EnsPExon exon,ajint rank)2943 AjBool ensTranscriptAddExon(
2944     EnsPTranscript transcript,
2945     EnsPExon exon,
2946     ajint rank)
2947 {
2948     register ajint i = 0;
2949 
2950     AjBool added = AJFALSE;
2951 
2952     AjIList iter = NULL;
2953 
2954     AjPStr message = NULL;
2955 
2956     EnsPExon curexon = NULL; /* Current Ensembl Exon */
2957 
2958     EnsPFeature feature    = NULL;
2959     EnsPFeature curfeature = NULL; /* Current Ensembl Feature */
2960     EnsPFeature prvfeature = NULL; /* Previous Ensembl Feature */
2961 
2962     if (ajDebugTest("ensTranscriptAddExon"))
2963         ajDebug("ensTranscriptAddExon\n"
2964                 "  transcript %p\n"
2965                 "  exon %p\n"
2966                 "  rank %d\n",
2967                 transcript,
2968                 exon,
2969                 rank);
2970 
2971     if (!transcript)
2972         return ajFalse;
2973 
2974     if (!exon)
2975         return ajFalse;
2976 
2977     if (!transcript->Exons)
2978         transcript->Exons = ajListNew();
2979 
2980     if (rank > 0)
2981     {
2982         iter = ajListIterNew(transcript->Exons);
2983 
2984         i = 0;
2985 
2986         while (i < rank)
2987         {
2988             i++;
2989 
2990             if (ajListIterDone(iter))
2991             {
2992                 /*
2993                 ** If the AJAX List is too short, append the Exon if the rank
2994                 ** matches this position or an empty node otherwise.
2995                 */
2996 
2997                 if (i == rank)
2998                 {
2999                     ajListPushAppend(transcript->Exons,
3000                                      (void *) ensExonNewRef(exon));
3001 
3002                     break;
3003                 }
3004                 else
3005                     ajListPushAppend(transcript->Exons, NULL);
3006             }
3007 
3008             /* Advance one step. */
3009 
3010             curexon = (EnsPExon) ajListIterGet(iter);
3011 
3012             if (i == rank)
3013             {
3014                 /*
3015                 ** Remove the current position, delete the previous
3016                 ** Ensembl Exon, if any, insert the new Ensembl Exon and
3017                 ** advance the AJAX List Iterator one step. Remember, inserts
3018                 ** into AJAX List objects are applied ahead of the
3019                 ** AJAX List Iterator so that they will be seen in the
3020                 ** next iteration.
3021                 */
3022 
3023                 ajListIterRemove(iter);
3024 
3025                 ensExonDel(&curexon);
3026 
3027                 ajListIterInsert(iter, (void *) ensExonNewRef(exon));
3028 
3029                 /* Advance the AJAX List Iterator after the insert. */
3030 
3031                 curexon = (EnsPExon) ajListIterGet(iter);
3032             }
3033         }
3034 
3035         ajListIterDel(&iter);
3036 
3037         return ajTrue;
3038     }
3039 
3040     feature = ensExonGetFeature(exon);
3041 
3042     if (ensFeatureGetStrand(feature) > 0)
3043     {
3044         ajListPeekLast(transcript->Exons, (void **) &curexon);
3045 
3046         curfeature = ensExonGetFeature(curexon);
3047 
3048         if (ensFeatureGetStart(feature) > ensFeatureGetEnd(curfeature))
3049         {
3050             /* Append at the end. */
3051 
3052             ajListPushAppend(transcript->Exons, (void *) ensExonNewRef(exon));
3053 
3054             added = ajTrue;
3055         }
3056         else
3057         {
3058             /* Insert at the correct position. */
3059 
3060             prvfeature = NULL;
3061 
3062             iter = ajListIterNew(transcript->Exons);
3063 
3064             while (!ajListIterDone(iter))
3065             {
3066                 curexon = (EnsPExon) ajListIterGet(iter);
3067 
3068                 curfeature = ensExonGetFeature(curexon);
3069 
3070                 if (ensFeatureGetStart(feature) <
3071                     ensFeatureGetStart(curfeature))
3072                 {
3073                     /* Ensembl Exon objects that overlap are not added. */
3074 
3075                     if (ensFeatureGetEnd(feature) >=
3076                         ensFeatureGetStart(curfeature))
3077                         break;
3078 
3079                     if ((prvfeature != NULL) &&
3080                         (ensFeatureGetStart(feature) <=
3081                          ensFeatureGetEnd(prvfeature)))
3082                         break;
3083 
3084                     ajListIterInsert(iter, (void *) ensExonNewRef(exon));
3085 
3086                     added = ajTrue;
3087 
3088                     break;
3089                 }
3090 
3091                 prvfeature = curfeature;
3092             }
3093 
3094             ajListIterDel(&iter);
3095         }
3096     }
3097     else
3098     {
3099         ajListPeekLast(transcript->Exons, (void **) &curexon);
3100 
3101         curfeature = ensExonGetFeature(curexon);
3102 
3103         if (ensFeatureGetEnd(feature) < ensFeatureGetStart(curfeature))
3104         {
3105             /* Append at the end. */
3106 
3107             ajListPushAppend(transcript->Exons, (void *) ensExonNewRef(exon));
3108 
3109             added = ajTrue;
3110         }
3111         else
3112         {
3113             /* Insert at the correct position. */
3114 
3115             prvfeature = NULL;
3116 
3117             iter = ajListIterNew(transcript->Exons);
3118 
3119             while (!ajListIterDone(iter))
3120             {
3121                 curexon = (EnsPExon) ajListIterGet(iter);
3122 
3123                 curfeature = ensExonGetFeature(curexon);
3124 
3125                 if (ensFeatureGetEnd(feature) > ensFeatureGetEnd(curfeature))
3126                 {
3127                     /* Ensembl Exon objects that overlap are not added. */
3128 
3129                     if (ensFeatureGetStart(feature) <=
3130                         ensFeatureGetEnd(curfeature))
3131                         break;
3132 
3133                     if ((prvfeature != NULL) &&
3134                         (ensFeatureGetEnd(feature) >=
3135                          ensFeatureGetStart(prvfeature)))
3136                         ajListIterInsert(iter, (void *) ensExonNewRef(exon));
3137 
3138                     added = ajTrue;
3139 
3140                     break;
3141                 }
3142 
3143                 prvfeature = curfeature;
3144             }
3145 
3146             ajListIterDel(&iter);
3147         }
3148     }
3149 
3150     /* Sanity check. */
3151 
3152     if (!added)
3153     {
3154         /* The Exon was not added because it overlaps with another Exon. */
3155 
3156         message = ajStrNewC("ensTranscriptAddExon got an Exon, "
3157                             "which overlaps with another Exon in the same "
3158                             "Transcript.\n"
3159                             "  Transcript Exons:\n");
3160 
3161         iter = ajListIterNew(transcript->Exons);
3162 
3163         while (!ajListIterDone(iter))
3164         {
3165             curexon = (EnsPExon) ajListIterGet(iter);
3166 
3167             curfeature = ensExonGetFeature(curexon);
3168 
3169             ajFmtPrintAppS(&message,
3170                            "    %S %d:%d:%d\n",
3171                            ensExonGetStableidentifier(exon),
3172                            ensFeatureGetStart(curfeature),
3173                            ensFeatureGetEnd(curfeature),
3174                            ensFeatureGetStrand(curfeature));
3175         }
3176 
3177         ajListIterDel(&iter);
3178 
3179         ajFmtPrintAppS(&message,
3180                        "  This Exon:\n"
3181                        "    %S %d:%d:%d\n",
3182                        ensExonGetStableidentifier(exon),
3183                        ensFeatureGetStart(feature),
3184                        ensFeatureGetEnd(feature),
3185                        ensFeatureGetStrand(feature));
3186 
3187         ajFatal(ajStrGetPtr(message));
3188 
3189         ajStrDel(&message);
3190     }
3191 
3192     /*
3193     ** Recalculate the Transcript coordinates, delete the
3194     ** Ensembl Transcript Mapper, as well as internal members.
3195     */
3196 
3197     ensTranscriptCalculateCoordinates(transcript);
3198 
3199     return ajTrue;
3200 }
3201 
3202 
3203 
3204 
3205 /* @func ensTranscriptAddIntronsupportingevidence *****************************
3206 **
3207 ** Add an Ensembl Intron Supporting Evidence to an Ensembl Transcript.
3208 **
3209 ** @cc Bio::EnsEMBL::Transcript::add_IntronSupportingEvidence
3210 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
3211 ** @param [u] ise [EnsPIntronsupportingevidence]
3212 ** Ensembl Intron Supporting Evidence
3213 **
3214 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3215 **
3216 ** @release 6.5.0
3217 ** @@
3218 ******************************************************************************/
3219 
ensTranscriptAddIntronsupportingevidence(EnsPTranscript transcript,EnsPIntronsupportingevidence ise)3220 AjBool ensTranscriptAddIntronsupportingevidence(
3221     EnsPTranscript transcript,
3222     EnsPIntronsupportingevidence ise)
3223 {
3224     AjBool match = AJFALSE;
3225 
3226     AjIList iter = NULL;
3227 
3228     EnsPIntronsupportingevidence oldise = NULL;
3229 
3230     if (!transcript)
3231         return ajFalse;
3232 
3233     if (!ise)
3234         return ajFalse;
3235 
3236     if (!transcript->Intronsupportingevidences)
3237         transcript->Intronsupportingevidences = ajListNew();
3238 
3239     iter = ajListIterNewread(transcript->Intronsupportingevidences);
3240 
3241     while (!ajListIterDone(iter))
3242     {
3243         oldise = (EnsPIntronsupportingevidence) ajListIterGet(iter);
3244 
3245         if ((match = ensIntronsupportingevidenceMatch(ise, oldise)))
3246             break;
3247     }
3248 
3249     ajListIterDel(&iter);
3250 
3251     if (match)
3252         return ajFalse;
3253 
3254     ajListPushAppend(transcript->Intronsupportingevidences,
3255                      (void *) ensIntronsupportingevidenceNewRef(ise));
3256 
3257     return ajTrue;
3258 }
3259 
3260 
3261 
3262 
3263 /* @section debugging *********************************************************
3264 **
3265 ** Functions for reporting of an Ensembl Transcript object.
3266 **
3267 ** @fdata [EnsPTranscript]
3268 **
3269 ** @nam3rule Trace Report Ensembl Transcript members to debug file
3270 **
3271 ** @argrule Trace transcript [const EnsPTranscript] Ensembl Transcript
3272 ** @argrule Trace level [ajuint] Indentation level
3273 **
3274 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
3275 **
3276 ** @fcategory misc
3277 ******************************************************************************/
3278 
3279 
3280 
3281 
3282 /* @func ensTranscriptTrace ***************************************************
3283 **
3284 ** Trace an Ensembl Transcript.
3285 **
3286 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
3287 ** @param [r] level [ajuint] Indentation level
3288 **
3289 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3290 **
3291 ** @release 6.2.0
3292 ** @@
3293 ******************************************************************************/
3294 
ensTranscriptTrace(const EnsPTranscript transcript,ajuint level)3295 AjBool ensTranscriptTrace(const EnsPTranscript transcript, ajuint level)
3296 {
3297     AjIList iter = NULL;
3298 
3299     AjPStr indent = NULL;
3300 
3301     EnsPAttribute attribute = NULL;
3302 
3303     EnsPBasealignfeature baf = NULL;
3304 
3305     EnsPDatabaseentry dbe = NULL;
3306 
3307     EnsPExon exon = NULL;
3308 
3309     EnsPIntronsupportingevidence ise = NULL;
3310 
3311     EnsPTranslation translation = NULL;
3312 
3313     if (!transcript)
3314         return ajFalse;
3315 
3316     indent = ajStrNew();
3317 
3318     ajStrAppendCountK(&indent, ' ', level * 2);
3319 
3320     ajDebug("%SensTranscriptTrace %p\n"
3321             "%S  Use %u\n"
3322             "%S  Identifier %u\n"
3323             "%S  Adaptor %p\n"
3324             "%S  Feature %p\n"
3325             "%S  Displayreference %p\n"
3326             "%S  Description '%S'\n"
3327             "%S  Biotype '%S'\n"
3328             "%S  Status %d\n"
3329             "%S  Current '%B'\n"
3330             "%S  Stableidentifier '%S'\n"
3331             "%S  DateCreation '%S'\n"
3332             "%S  DateModification '%S'\n"
3333             "%S  Version %u\n"
3334             "%S  Geneidentifier %u\n"
3335             "%S  Alternativetranslations %p\n"
3336             "%S  Attributes %p\n"
3337             "%S  Databaseentries %p\n"
3338             "%S  Exons %p\n"
3339             "%S  Intronsupportingevidences %p\n"
3340             "%S  Supportingfeatures %p\n"
3341             "%S  Translation %p\n"
3342             "%S  Sequenceedits '%B'\n"
3343             "%S  Canonical %p\n"
3344             "%S  ExonCoordMapper %p\n",
3345             indent, transcript,
3346             indent, transcript->Use,
3347             indent, transcript->Identifier,
3348             indent, transcript->Adaptor,
3349             indent, transcript->Feature,
3350             indent, transcript->Displayreference,
3351             indent, transcript->Description,
3352             indent, transcript->Biotype,
3353             indent, transcript->Status,
3354             indent, transcript->Current,
3355             indent, transcript->Stableidentifier,
3356             indent, transcript->DateCreation,
3357             indent, transcript->DateModification,
3358             indent, transcript->Version,
3359             indent, transcript->Geneidentifier,
3360             indent, transcript->Alternativetranslations,
3361             indent, transcript->Attributes,
3362             indent, transcript->Databaseentries,
3363             indent, transcript->Exons,
3364             indent, transcript->Intronsupportingevidences,
3365             indent, transcript->Supportingfeatures,
3366             indent, transcript->Translation,
3367             indent, transcript->Sequenceedits,
3368             indent, transcript->Canonical,
3369             indent, transcript->ExonCoordMapper);
3370 
3371     ensFeatureTrace(transcript->Feature, level + 1);
3372 
3373     ensDatabaseentryTrace(transcript->Displayreference, level + 1);
3374 
3375     /* Trace the AJAX List of alternative Ensembl Translation objects. */
3376 
3377     if (transcript->Alternativetranslations)
3378     {
3379         ajDebug("%S    AJAX List %p of alternative "
3380                 "Ensembl Translation objects:\n",
3381                 indent, transcript->Alternativetranslations);
3382 
3383         iter = ajListIterNewread(transcript->Alternativetranslations);
3384 
3385         while (!ajListIterDone(iter))
3386         {
3387             translation = (EnsPTranslation) ajListIterGet(iter);
3388 
3389             ensTranslationTrace(translation, level + 2);
3390         }
3391 
3392         ajListIterDel(&iter);
3393     }
3394 
3395     /* Trace the AJAX List of Ensembl Attribute objects. */
3396 
3397     if (transcript->Attributes)
3398     {
3399         ajDebug("%S    AJAX List %p of "
3400                 "Ensembl Attribute objects\n",
3401                 indent, transcript->Attributes);
3402 
3403         iter = ajListIterNewread(transcript->Attributes);
3404 
3405         while (!ajListIterDone(iter))
3406         {
3407             attribute = (EnsPAttribute) ajListIterGet(iter);
3408 
3409             ensAttributeTrace(attribute, level + 2);
3410         }
3411 
3412         ajListIterDel(&iter);
3413     }
3414 
3415     /* Trace the AJAX List of Ensembl Database Entry objects. */
3416 
3417     if (transcript->Databaseentries)
3418     {
3419         ajDebug("%S    AJAX List %p of "
3420                 "Ensembl Database Entry objects\n",
3421                 indent, transcript->Databaseentries);
3422 
3423         iter = ajListIterNewread(transcript->Databaseentries);
3424 
3425         while (!ajListIterDone(iter))
3426         {
3427             dbe = (EnsPDatabaseentry) ajListIterGet(iter);
3428 
3429             ensDatabaseentryTrace(dbe, level + 2);
3430         }
3431 
3432         ajListIterDel(&iter);
3433     }
3434 
3435     /* Trace the AJAX List of Ensembl Exon objects. */
3436 
3437     if (transcript->Exons)
3438     {
3439         ajDebug("%S    AJAX List %p of "
3440                 "Ensembl Exon objects\n",
3441                 indent, transcript->Exons);
3442 
3443         iter = ajListIterNewread(transcript->Exons);
3444 
3445         while (!ajListIterDone(iter))
3446         {
3447             exon = (EnsPExon) ajListIterGet(iter);
3448 
3449             ensExonTrace(exon, level + 2);
3450         }
3451 
3452         ajListIterDel(&iter);
3453     }
3454 
3455     /* Trace the AJAX List of Ensembl Intron Supporting Evidence objects. */
3456 
3457     if (transcript->Intronsupportingevidences)
3458     {
3459         ajDebug("%S    AJAX List %p of "
3460                 "Ensembl Intron Supporting Evidence objects\n",
3461                 indent, transcript->Intronsupportingevidences);
3462 
3463         iter = ajListIterNewread(transcript->Intronsupportingevidences);
3464 
3465         while (!ajListIterDone(iter))
3466         {
3467             ise = (EnsPIntronsupportingevidence) ajListIterGet(iter);
3468 
3469             ensIntronsupportingevidenceTrace(ise, level + 2);
3470         }
3471 
3472         ajListIterDel(&iter);
3473     }
3474 
3475     /* Trace the AJAX List of supporting Ensembl Base Align Feature objects. */
3476 
3477     if (transcript->Supportingfeatures)
3478     {
3479         ajDebug("%S    AJAX List %p of "
3480                 "Ensembl Base Align Feature objects\n",
3481                 indent, transcript->Supportingfeatures);
3482 
3483         iter = ajListIterNewread(transcript->Supportingfeatures);
3484 
3485         while (!ajListIterDone(iter))
3486         {
3487             baf = (EnsPBasealignfeature) ajListIterGet(iter);
3488 
3489             ensBasealignfeatureTrace(baf, level + 2);
3490         }
3491 
3492         ajListIterDel(&iter);
3493     }
3494 
3495     ensTranslationTrace(transcript->Translation, level + 1);
3496 
3497     if (transcript->Canonical)
3498         ajDebug("%S    AJAX Boolean Canonical %p '%B'\n",
3499                 indent, transcript->Canonical, *transcript->Canonical);
3500 
3501     ensMapperTrace(transcript->ExonCoordMapper, level + 1);
3502 
3503     ajStrDel(&indent);
3504 
3505     return ajTrue;
3506 }
3507 
3508 
3509 
3510 
3511 /* @section calculate *********************************************************
3512 **
3513 ** Functions for calculating information from an Ensembl Transcript object.
3514 **
3515 ** @fdata [EnsPTranscript]
3516 **
3517 ** @nam3rule Calculate Calculate Ensembl Transcript information
3518 ** @nam4rule Coordinates Calculate coordinates
3519 ** @nam4rule Length  Calculate the length
3520 ** @nam4rule Memsize Calculate the memory size in bytes
3521 ** @nam4rule Phase   Calculate the phase
3522 ** @nam4rule Slice   Calculate Ensembl Transcript coordinates relative to
3523 **                   an Ensembl Slice
3524 ** @nam5rule Coding  Calculate Ensembl Transcript coding coordinates
3525 ** @nam6rule End     Calculate the Ensembl Transcript coding end coordinate
3526 ** @nam6rule Start   Calculate the Ensembl Transcript coding start coordinate
3527 ** @nam4rule Transcript Calculate Ensembl Transcript coordinates relative to
3528 **                      an Ensembl Transcript
3529 ** @nam5rule Coding  Calculate Ensembl Transcript coding coordinates
3530 ** @nam6rule End     Calculate the Ensembl Transcript coding end coordinate
3531 ** @nam6rule Start   Calculate the Ensembl Transcript coding start coordinate
3532 ** @nam5rule End     Calculate the Ensembl Transcript end coordinate
3533 ** @nam5rule Start   Calculate the Ensembl Transcript start coordinate
3534 **
3535 ** @argrule Coordinates transcript [EnsPTranscript] Ensembl Transcript
3536 ** @argrule Length transcript [EnsPTranscript] Ensembl Transcript
3537 ** @argrule Memsize transcript [const EnsPTranscript] Ensembl Transcript
3538 ** @argrule Phase transcript [EnsPTranscript] Ensembl Transcript
3539 ** @argrule CodingEnd transcript [EnsPTranscript] Ensembl Transcript
3540 ** @argrule CodingEnd translation [EnsPTranslation] Ensembl Translation
3541 ** @argrule CodingStart transcript [EnsPTranscript] Ensembl Transcript
3542 ** @argrule CodingStart translation [EnsPTranslation] Ensembl Translation
3543 ** @argrule TranscriptEnd exon [EnsPExon] Ensembl Exon
3544 ** @argrule TranscriptEnd transcript [EnsPTranscript] Ensembl Transcript
3545 ** @argrule TranscriptStart exon [EnsPExon] Ensembl Exon
3546 ** @argrule TranscriptStart transcript [EnsPTranscript] Ensembl Transcript
3547 **
3548 ** @valrule Coordinates [AjBool] ajTrue upon success, ajFalse otherwise
3549 ** @valrule Length [ajuint] Transcript (cDNA) length or 0U
3550 ** @valrule Memsize [size_t] Memory size in bytes or 0
3551 ** @valrule PhaseStart [ajint] Start phase or -1
3552 ** @valrule SliceCodingEnd [ajint] End coordinate or 0
3553 ** @valrule SliceCodingStart [ajint] Start coordinate or 0
3554 ** @valrule TranscriptCodingEnd [ajuint] End coordinate or 0U
3555 ** @valrule TranscriptCodingStart [ajuint] Start coordinate or 0U
3556 ** @valrule TranscriptEnd [ajuint] End coordinate or 0U
3557 ** @valrule TranscriptStart [ajuint] Start coordinate or 0U
3558 **
3559 ** @fcategory misc
3560 ******************************************************************************/
3561 
3562 
3563 
3564 
3565 /* @func ensTranscriptCalculateCoordinates ************************************
3566 **
3567 ** Calculate coordinates of an Ensembl Transcript.
3568 ** This function should be called, whenever an Exon of this Transcript has
3569 ** been changed.
3570 **
3571 ** @cc Bio::EnsEMBL::Transcript::recalculate_coordinates
3572 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
3573 **
3574 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3575 **
3576 ** @release 6.2.0
3577 ** @@
3578 ******************************************************************************/
3579 
ensTranscriptCalculateCoordinates(EnsPTranscript transcript)3580 AjBool ensTranscriptCalculateCoordinates(EnsPTranscript transcript)
3581 {
3582     ajint start  = 0;
3583     ajint end    = 0;
3584     ajint strand = 0;
3585 
3586     AjBool transsplicing = AJFALSE;
3587 
3588     AjIList iter       = NULL;
3589     const AjPList list = NULL;
3590 
3591     EnsPExon exon = NULL;
3592 
3593     EnsPFeature efeature = NULL;
3594     EnsPFeature tfeature = NULL;
3595 
3596     EnsPSlice slice = NULL;
3597 
3598     if (!transcript)
3599         return ajFalse;
3600 
3601     list = ensTranscriptLoadExons(transcript);
3602 
3603     if (!ajListGetLength(list))
3604         return ajTrue;
3605 
3606     iter = ajListIterNewread(list);
3607 
3608     while (!ajListIterDone(iter))
3609     {
3610         exon = (EnsPExon) ajListIterGet(iter);
3611 
3612         /* Skip missing Exon objects. */
3613 
3614         if (!exon)
3615             continue;
3616 
3617         efeature = ensExonGetFeature(exon);
3618 
3619         /* Skip un-mapped Exon objects. */
3620 
3621         if (!ensFeatureGetStart(efeature))
3622             continue;
3623 
3624         slice  = ensFeatureGetSlice(efeature);
3625         start  = ensFeatureGetStart(efeature);
3626         end    = ensFeatureGetEnd(efeature);
3627         strand = ensFeatureGetStrand(efeature);
3628 
3629         break;
3630     }
3631 
3632     ajListIterDel(&iter);
3633 
3634     /* Start loop after the first Exon with coordinates. */
3635 
3636     iter = ajListIterNewread(list);
3637 
3638     while (!ajListIterDone(iter))
3639     {
3640         exon = (EnsPExon) ajListIterGet(iter);
3641 
3642         /* Skip missing Exon objects. */
3643 
3644         if (!exon)
3645             continue;
3646 
3647         efeature = ensExonGetFeature(exon);
3648 
3649         /* Skip un-mapped Exon objects. */
3650 
3651         if (!ensFeatureGetStart(efeature))
3652             continue;
3653 
3654         if (!ensSliceMatch(ensFeatureGetSlice(efeature), slice))
3655             ajFatal("ensTranscriptCalculateCoordinates got "
3656                     "Ensembl Exon objects of one "
3657                     "Ensembl Transcript on different "
3658                     "Ensembl Slice objects.\n");
3659 
3660         start = (ensFeatureGetStart(efeature) < start)
3661             ? ensFeatureGetStart(efeature) : start;
3662 
3663         end = (ensFeatureGetEnd(efeature) > end)
3664             ? ensFeatureGetEnd(efeature) : end;
3665 
3666         if (ensFeatureGetStrand(efeature) != strand)
3667             transsplicing = ajTrue;
3668     }
3669 
3670     ajListIterDel(&iter);
3671 
3672     if (transsplicing)
3673         ajWarn("ensTranscriptCalculateCoordinates got Transcript with "
3674                "trans-splicing event.\n");
3675 
3676     tfeature = ensTranscriptGetFeature(transcript);
3677 
3678     ensFeatureSetStart(tfeature, start);
3679     ensFeatureSetEnd(tfeature, end);
3680     ensFeatureSetStrand(tfeature, strand);
3681     ensFeatureSetSlice(tfeature, slice);
3682 
3683     /* Clear internal members that depend on Ensembl Exon coordinates. */
3684 
3685     ensMapperClear(transcript->ExonCoordMapper);
3686 
3687     return ajTrue;
3688 }
3689 
3690 
3691 
3692 
3693 /* @func ensTranscriptCalculateLength *****************************************
3694 **
3695 ** Calculate the length of an Ensembl Transcript, which is the sum of the
3696 ** length of all Ensembl Exon objects.
3697 **
3698 ** @cc Bio::EnsEMBL::Transcript::length
3699 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
3700 **
3701 ** @return [ajuint] Transcript (cDNA) length or 0U
3702 **
3703 ** @release 6.4.0
3704 ** @@
3705 ******************************************************************************/
3706 
ensTranscriptCalculateLength(EnsPTranscript transcript)3707 ajuint ensTranscriptCalculateLength(EnsPTranscript transcript)
3708 {
3709     ajuint length = 0U;
3710 
3711     AjIList iter = NULL;
3712 
3713     const AjPList exons = NULL;
3714     AjPList ses         = NULL;
3715 
3716     EnsPExon exon = NULL;
3717 
3718     EnsPFeature feature = NULL;
3719 
3720     EnsPSequenceedit se = NULL;
3721 
3722     if (!transcript)
3723         return 0U;
3724 
3725     exons = ensTranscriptLoadExons(transcript);
3726 
3727     iter = ajListIterNewread(exons);
3728 
3729     while (!ajListIterDone(iter))
3730     {
3731         exon = (EnsPExon) ajListIterGet(iter);
3732 
3733         feature = ensExonGetFeature(exon);
3734 
3735         length += ensFeatureCalculateLength(feature);
3736     }
3737 
3738     ajListIterDel(&iter);
3739 
3740     /*
3741     ** Adjust the length if post-transcriptional Sequence Edit objects are
3742     ** applied.
3743     */
3744 
3745     if (transcript->Sequenceedits)
3746     {
3747         ses = ajListNew();
3748 
3749         ensTranscriptFetchAllSequenceedits(transcript, ses);
3750 
3751         while (ajListPop(ses, (void **) &se))
3752         {
3753             length += ensSequenceeditCalculateDifference(se);
3754 
3755             ensSequenceeditDel(&se);
3756         }
3757 
3758         ajListFree(&ses);
3759     }
3760 
3761     return length;
3762 }
3763 
3764 
3765 
3766 
3767 /* @func ensTranscriptCalculateMemsize ****************************************
3768 **
3769 ** Calculate the memory size in bytes of an Ensembl Transcript.
3770 **
3771 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
3772 **
3773 ** @return [size_t] Memory size in bytes or 0
3774 **
3775 ** @release 6.4.0
3776 ** @@
3777 ******************************************************************************/
3778 
ensTranscriptCalculateMemsize(const EnsPTranscript transcript)3779 size_t ensTranscriptCalculateMemsize(const EnsPTranscript transcript)
3780 {
3781     size_t size = 0;
3782 
3783     AjIList iter = NULL;
3784 
3785     EnsPAttribute attribute = NULL;
3786 
3787     EnsPBasealignfeature baf = NULL;
3788 
3789     EnsPDatabaseentry dbe = NULL;
3790 
3791     EnsPExon exon = NULL;
3792 
3793     EnsPIntronsupportingevidence ise = NULL;
3794 
3795     EnsPTranslation translation = NULL;
3796 
3797     if (!transcript)
3798         return 0;
3799 
3800     size += sizeof (EnsOTranscript);
3801 
3802     size += ensFeatureCalculateMemsize(transcript->Feature);
3803 
3804     size += ensDatabaseentryCalculateMemsize(transcript->Displayreference);
3805 
3806     if (transcript->Description)
3807     {
3808         size += sizeof (AjOStr);
3809 
3810         size += ajStrGetRes(transcript->Description);
3811     }
3812 
3813     if (transcript->Biotype)
3814     {
3815         size += sizeof (AjOStr);
3816 
3817         size += ajStrGetRes(transcript->Biotype);
3818     }
3819 
3820     if (transcript->Stableidentifier)
3821     {
3822         size += sizeof (AjOStr);
3823 
3824         size += ajStrGetRes(transcript->Stableidentifier);
3825     }
3826 
3827     if (transcript->DateCreation)
3828     {
3829         size += sizeof (AjOStr);
3830 
3831         size += ajStrGetRes(transcript->DateCreation);
3832     }
3833 
3834     if (transcript->DateModification)
3835     {
3836         size += sizeof (AjOStr);
3837 
3838         size += ajStrGetRes(transcript->DateModification);
3839     }
3840 
3841     /* Summarise the AJAX List of alternative Ensembl Translation objects. */
3842 
3843     if (transcript->Alternativetranslations)
3844     {
3845         size += sizeof (AjOList);
3846 
3847         iter = ajListIterNewread(transcript->Alternativetranslations);
3848 
3849         while (!ajListIterDone(iter))
3850         {
3851             translation = (EnsPTranslation) ajListIterGet(iter);
3852 
3853             size += ensTranslationCalculateMemsize(translation);
3854         }
3855 
3856         ajListIterDel(&iter);
3857     }
3858 
3859     /* Summarise the AJAX List of Ensembl Attribute objects. */
3860 
3861     if (transcript->Attributes)
3862     {
3863         size += sizeof (AjOList);
3864 
3865         iter = ajListIterNewread(transcript->Attributes);
3866 
3867         while (!ajListIterDone(iter))
3868         {
3869             attribute = (EnsPAttribute) ajListIterGet(iter);
3870 
3871             size += ensAttributeCalculateMemsize(attribute);
3872         }
3873 
3874         ajListIterDel(&iter);
3875     }
3876 
3877     /* Summarise the AJAX List of Ensembl Database Entry objects. */
3878 
3879     if (transcript->Databaseentries)
3880     {
3881         size += sizeof (AjOList);
3882 
3883         iter = ajListIterNewread(transcript->Databaseentries);
3884 
3885         while (!ajListIterDone(iter))
3886         {
3887             dbe = (EnsPDatabaseentry) ajListIterGet(iter);
3888 
3889             size += ensDatabaseentryCalculateMemsize(dbe);
3890         }
3891 
3892         ajListIterDel(&iter);
3893     }
3894 
3895     /* Summarise the AJAX List of Ensembl Exon objects. */
3896 
3897     if (transcript->Exons)
3898     {
3899         size += sizeof (AjOList);
3900 
3901         iter = ajListIterNewread(transcript->Exons);
3902 
3903         while (!ajListIterDone(iter))
3904         {
3905             exon = (EnsPExon) ajListIterGet(iter);
3906 
3907             size += ensExonCalculateMemsize(exon);
3908         }
3909 
3910         ajListIterDel(&iter);
3911     }
3912 
3913     /* Summarise the AJAX List of Ensembl Intron Supporting Feature objects. */
3914 
3915     if (transcript->Intronsupportingevidences)
3916     {
3917         size += sizeof (AjOList);
3918 
3919         iter = ajListIterNewread(transcript->Intronsupportingevidences);
3920 
3921         while (!ajListIterDone(iter))
3922         {
3923             ise = (EnsPIntronsupportingevidence) ajListIterGet(iter);
3924 
3925             size += ensIntronsupportingevidenceCalculateMemsize(ise);
3926         }
3927 
3928         ajListIterDel(&iter);
3929     }
3930 
3931     /*
3932     ** Summarise the AJAX List of supporting
3933     ** Ensembl Base Align Feature objects.
3934     */
3935 
3936     if (transcript->Supportingfeatures)
3937     {
3938         size += sizeof (AjOList);
3939 
3940         iter = ajListIterNewread(transcript->Supportingfeatures);
3941 
3942         while (!ajListIterDone(iter))
3943         {
3944             baf = (EnsPBasealignfeature) ajListIterGet(iter);
3945 
3946             size += ensBasealignfeatureCalculateMemsize(baf);
3947         }
3948 
3949         ajListIterDel(&iter);
3950     }
3951 
3952     size += ensTranslationCalculateMemsize(transcript->Translation);
3953 
3954     if (transcript->Canonical)
3955         size += sizeof (AjBool);
3956 
3957     size += ensMapperCalculateMemsize(transcript->ExonCoordMapper);
3958 
3959     return size;
3960 }
3961 
3962 
3963 
3964 
3965 /* @func ensTranscriptCalculatePhaseStart *************************************
3966 **
3967 ** Calculate the start phase of an Ensembl Transcript,
3968 ** which is the start phase of the first Ensembl Exon object.
3969 **
3970 ** This function will load the Ensembl Exon objects in case they have not
3971 ** been loaded before.
3972 **
3973 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
3974 **
3975 ** @return [ajint] Start phase or -1
3976 **
3977 ** @release 6.4.0
3978 ** @@
3979 ******************************************************************************/
3980 
ensTranscriptCalculatePhaseStart(EnsPTranscript transcript)3981 ajint ensTranscriptCalculatePhaseStart(EnsPTranscript transcript)
3982 {
3983     const AjPList exons = NULL;
3984 
3985     EnsPExon exon = NULL;
3986 
3987     if (!transcript)
3988         return -1;
3989 
3990     exons = ensTranscriptLoadExons(transcript);
3991 
3992     ajListPeekFirst(exons, (void **) &exon);
3993 
3994     if (!exon)
3995         return -1;
3996 
3997     return ensExonGetPhaseStart(exon);
3998 }
3999 
4000 
4001 
4002 
4003 /* @func ensTranscriptCalculateSliceCodingEnd *********************************
4004 **
4005 ** Calculate the end position of the coding region in Slice coordinates.
4006 **
4007 ** @cc Bio::EnsEMBL::Transcript::coding_region_end
4008 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
4009 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
4010 **
4011 ** @return [ajint] Coding region end in Slice coordinates or 0
4012 **
4013 ** @release 6.4.0
4014 ** @@
4015 ******************************************************************************/
4016 
ensTranscriptCalculateSliceCodingEnd(EnsPTranscript transcript,EnsPTranslation translation)4017 ajint ensTranscriptCalculateSliceCodingEnd(
4018     EnsPTranscript transcript,
4019     EnsPTranslation translation)
4020 {
4021     ajint scend = 0;
4022 
4023     EnsPExon exon = NULL;
4024 
4025     EnsPFeature feature = NULL;
4026 
4027     if (!transcript)
4028         return 0;
4029 
4030     if (!translation)
4031         return 0;
4032 
4033     /* Calculate the Slice coding start from the Translation. */
4034 
4035     exon = ensTranslationGetStartexon(translation);
4036 
4037     feature = ensExonGetFeature(exon);
4038 
4039     if (ensFeatureGetStrand(feature) >= 0)
4040     {
4041         exon = ensTranslationGetEndexon(translation);
4042 
4043         feature = ensExonGetFeature(exon);
4044 
4045         scend = ensFeatureGetStart(feature)
4046             + (ensTranslationGetEnd(translation) - 1);
4047     }
4048     else
4049     {
4050         exon = ensTranslationGetStartexon(translation);
4051 
4052         feature = ensExonGetFeature(exon);
4053 
4054         scend = ensFeatureGetEnd(feature)
4055             - (ensTranslationGetStart(translation) - 1);
4056     }
4057 
4058     return scend;
4059 }
4060 
4061 
4062 
4063 
4064 /* @func ensTranscriptCalculateSliceCodingStart *******************************
4065 **
4066 ** Calculate the start position of the coding region in Slice coordinates.
4067 **
4068 ** @cc Bio::EnsEMBL::Transcript::coding_region_start
4069 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
4070 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
4071 **
4072 ** @return [ajint] Coding region start in Slice coordinates or 0
4073 **
4074 ** @release 6.4.0
4075 ** @@
4076 ******************************************************************************/
4077 
ensTranscriptCalculateSliceCodingStart(EnsPTranscript transcript,EnsPTranslation translation)4078 ajint ensTranscriptCalculateSliceCodingStart(
4079     EnsPTranscript transcript,
4080     EnsPTranslation translation)
4081 {
4082     ajint scstart = 0;
4083 
4084     EnsPExon exon = NULL;
4085 
4086     EnsPFeature feature = NULL;
4087 
4088     if (!transcript)
4089         return 0;
4090 
4091     if (!translation)
4092         return 0;
4093 
4094     /* Calculate the Slice coding start from the Translation. */
4095 
4096     exon = ensTranslationGetStartexon(translation);
4097 
4098     feature = ensExonGetFeature(exon);
4099 
4100     if (ensFeatureGetStrand(feature) >= 0)
4101     {
4102         exon = ensTranslationGetStartexon(translation);
4103 
4104         feature = ensExonGetFeature(exon);
4105 
4106         scstart = ensFeatureGetStart(feature)
4107             + (ensTranslationGetStart(translation) - 1);
4108     }
4109     else
4110     {
4111         exon = ensTranslationGetEndexon(translation);
4112 
4113         feature = ensExonGetFeature(exon);
4114 
4115         scstart = ensFeatureGetEnd(feature)
4116             - (ensTranslationGetEnd(translation) - 1);
4117     }
4118 
4119     return scstart;
4120 }
4121 
4122 
4123 
4124 
4125 /* @func ensTranscriptCalculateTranscriptCodingEnd ****************************
4126 **
4127 ** Calculate the end position of the coding region in Transcript coordinates.
4128 **
4129 ** @cc Bio::EnsEMBL::Transcript::cdna_coding_end
4130 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
4131 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
4132 **
4133 ** @return [ajuint] Coding region end in Transcript coordinates or 0U,
4134 ** if this Transcript has no Translation
4135 **
4136 ** @release 6.4.0
4137 ** @@
4138 ******************************************************************************/
4139 
ensTranscriptCalculateTranscriptCodingEnd(EnsPTranscript transcript,EnsPTranslation translation)4140 ajuint ensTranscriptCalculateTranscriptCodingEnd(
4141     EnsPTranscript transcript,
4142     EnsPTranslation translation)
4143 {
4144     ajuint tcend = 0U;
4145 
4146     AjBool debug = AJFALSE;
4147 
4148     AjIList iter = NULL;
4149 
4150     const AjPList exons = NULL;
4151     AjPList ses         = NULL;
4152 
4153     EnsPExon exon = NULL;
4154 
4155     EnsPFeature feature = NULL;
4156 
4157     EnsPSequenceedit se = NULL;
4158 
4159     debug = ajDebugTest("ensTranscriptCalculateTranscriptCodingEnd");
4160 
4161     if (debug)
4162     {
4163         ajDebug("ensTranscriptCalculateTranscriptCodingEnd\n"
4164                 "  transcript %p\n"
4165                 "  translation %p\n",
4166                 transcript,
4167                 translation);
4168 
4169         ensTranscriptTrace(transcript, 1);
4170 
4171         ensTranslationTrace(translation, 1);
4172     }
4173 
4174     if (!transcript)
4175         return 0U;
4176 
4177     if (!translation)
4178         return 0U;
4179 
4180     /*
4181     ** Calculate the coding start relative to the start of the
4182     ** Translation in Transcript coordinates.
4183     */
4184 
4185     exons = ensTranscriptLoadExons(transcript);
4186 
4187     iter = ajListIterNewread(exons);
4188 
4189     while (!ajListIterDone(iter))
4190     {
4191         exon = (EnsPExon) ajListIterGet(iter);
4192 
4193         if (debug)
4194             ajDebug("ensTranscriptCalculateTranscriptCodingEnd "
4195                     "exon %p (Identifier %u) end exon %p (Identifier %u)\n",
4196                     exon, ensExonGetIdentifier(exon),
4197                     ensTranslationGetEndexon(translation),
4198                     ensExonGetIdentifier(
4199                         ensTranslationGetEndexon(translation)));
4200 
4201         if (ensExonMatch(exon, ensTranslationGetEndexon(translation)))
4202         {
4203             /* Add the coding portion of the last coding Exon. */
4204 
4205             tcend += ensTranslationGetEnd(translation);
4206 
4207             break;
4208         }
4209         else
4210         {
4211             /* Add the entire length of this Exon. */
4212 
4213             feature = ensExonGetFeature(exon);
4214 
4215             tcend += ensFeatureCalculateLength(feature);
4216         }
4217     }
4218 
4219     ajListIterDel(&iter);
4220 
4221     /* Adjust Transcript coordinates if Sequence Edit objects are enabled. */
4222 
4223     if (transcript->Sequenceedits)
4224     {
4225         ses = ajListNew();
4226 
4227         ensTranscriptFetchAllSequenceedits(transcript, ses);
4228 
4229         /*
4230         ** Sort in reverse order to avoid adjustment of down-stream
4231         ** Sequence Edit objects.
4232         */
4233 
4234         ensListSequenceeditSortStartDescending(ses);
4235 
4236         while (ajListPop(ses, (void **) &se))
4237         {
4238             /*
4239             ** Use less than or equal to end + 1 so that the end of the
4240             ** CDS can be extended.
4241             */
4242 
4243             if (ensSequenceeditGetStart(se) <= tcend + 1)
4244                 tcend += ensSequenceeditCalculateDifference(se);
4245 
4246             ensSequenceeditDel(&se);
4247         }
4248 
4249         ajListFree(&ses);
4250     }
4251 
4252     return tcend;
4253 }
4254 
4255 
4256 
4257 
4258 /* @func ensTranscriptCalculateTranscriptCodingStart **************************
4259 **
4260 ** Calculate the start position of the coding region in Transcript coordinates.
4261 **
4262 ** @cc Bio::EnsEMBL::Transcript::cdna_coding_start
4263 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
4264 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
4265 **
4266 ** @return [ajuint] Coding region start in Transcript coordinates or 0U,
4267 ** if this Transcript has no Translation
4268 **
4269 ** @release 6.4.0
4270 ** @@
4271 ******************************************************************************/
4272 
ensTranscriptCalculateTranscriptCodingStart(EnsPTranscript transcript,EnsPTranslation translation)4273 ajuint ensTranscriptCalculateTranscriptCodingStart(
4274     EnsPTranscript transcript,
4275     EnsPTranslation translation)
4276 {
4277     ajuint tcstart = 0U;
4278 
4279     AjBool debug = AJFALSE;
4280 
4281     AjIList iter = NULL;
4282 
4283     const AjPList exons = NULL;
4284     AjPList ses         = NULL;
4285 
4286     EnsPExon exon = NULL;
4287 
4288     EnsPFeature feature = NULL;
4289 
4290     EnsPSequenceedit se = NULL;
4291 
4292     debug = ajDebugTest("ensTranscriptCalculateTranscriptCodingStart");
4293 
4294     if (debug)
4295     {
4296         ajDebug("ensTranscriptCalculateTranscriptCodingStart\n"
4297                 "  transcript %p\n"
4298                 "  translation %p\n",
4299                 transcript,
4300                 translation);
4301 
4302         ensTranscriptTrace(transcript, 1);
4303 
4304         ensTranslationTrace(translation, 1);
4305     }
4306 
4307     if (!transcript)
4308         return 0U;
4309 
4310     /*
4311     ** Calculate the coding start relative to the start of the
4312     ** Translation in Transcript coordinates.
4313     */
4314 
4315     exons = ensTranscriptLoadExons(transcript);
4316 
4317     iter = ajListIterNewread(exons);
4318 
4319     while (!ajListIterDone(iter))
4320     {
4321         exon = (EnsPExon) ajListIterGet(iter);
4322 
4323         if (debug)
4324             ajDebug("ensTranscriptCalculateTranscriptCodingStart "
4325                     "exon %p (Identifier %u) start exon %p (Identifier %u)\n",
4326                     exon, ensExonGetIdentifier(exon),
4327                     ensTranslationGetStartexon(translation),
4328                     ensExonGetIdentifier(
4329                         ensTranslationGetStartexon(translation)));
4330 
4331         if (ensExonMatch(exon, ensTranslationGetStartexon(translation)))
4332         {
4333             /* Add the UTR portion of the first coding Exon. */
4334 
4335             tcstart += ensTranslationGetStart(translation);
4336 
4337             break;
4338         }
4339         else
4340         {
4341             /* Add the entire length of this non-coding Exon. */
4342 
4343             feature = ensExonGetFeature(exon);
4344 
4345             tcstart += ensFeatureCalculateLength(feature);
4346         }
4347     }
4348 
4349     ajListIterDel(&iter);
4350 
4351     /* Adjust Transcript coordinates if Sequence Edit objects are enabled. */
4352 
4353     if (transcript->Sequenceedits)
4354     {
4355         ses = ajListNew();
4356 
4357         ensTranscriptFetchAllSequenceedits(transcript, ses);
4358 
4359         /*
4360         ** Sort in reverse order to avoid adjustment of down-stream
4361         ** Sequence Edit objects.
4362         */
4363 
4364         ensListSequenceeditSortStartDescending(ses);
4365 
4366         while (ajListPop(ses, (void **) &se))
4367         {
4368             if (ensSequenceeditGetStart(se) < tcstart)
4369                 tcstart += ensSequenceeditCalculateDifference(se);
4370 
4371             ensSequenceeditDel(&se);
4372         }
4373 
4374         ajListFree(&ses);
4375     }
4376 
4377     return tcstart;
4378 }
4379 
4380 
4381 
4382 
4383 /* @section matching **********************************************************
4384 **
4385 ** Functions for matching Ensembl Transcript objects
4386 **
4387 ** @fdata [EnsPTranscript]
4388 **
4389 ** @nam3rule Match      Test Ensembl Transcript objects for identity
4390 ** @nam3rule Overlap    Test Ensembl Transcript objects for overlap
4391 ** @nam3rule Similarity Test Ensembl Transcript objects for similarity
4392 **
4393 ** @argrule * transcript1 [EnsPTranscript] Ensembl Transcript
4394 ** @argrule * transcript2 [EnsPTranscript] Ensembl Transcript
4395 **
4396 ** @valrule * [AjBool] True on success
4397 **
4398 ** @fcategory use
4399 ******************************************************************************/
4400 
4401 
4402 
4403 
4404 /* @func ensTranscriptSimilarity **********************************************
4405 **
4406 ** Test Ensembl Transcript objects for similarity.
4407 **
4408 ** @cc Bio::EnsEMBL::Transcript::equals
4409 ** @param [u] transcript1 [EnsPTranscript] Ensembl Transcript
4410 ** @param [u] transcript2 [EnsPTranscript] Ensembl Transcript
4411 **
4412 ** @return [AjBool] ajTrue if the Ensembl Transcript objects are similar
4413 **
4414 ** @release 6.4.0
4415 ** @@
4416 ** NOTE: This function is similar to Bio::EnsEMBL::Transcript::equals, but not
4417 ** completely identical. The Bio::EnsEMBL::Exon objects are not sorted before
4418 ** comparison, as this would interfere with the internal AJAX List and their
4419 ** biological order in the Ensembl Transcript.
4420 ******************************************************************************/
4421 
ensTranscriptSimilarity(EnsPTranscript transcript1,EnsPTranscript transcript2)4422 AjBool ensTranscriptSimilarity(EnsPTranscript transcript1,
4423                                EnsPTranscript transcript2)
4424 {
4425     AjBool mismatch = AJFALSE;
4426     AjBool similarity = AJFALSE;
4427 
4428     AjIList iter1 = NULL;
4429     AjIList iter2 = NULL;
4430 
4431     const AjPList exons1 = NULL;
4432     const AjPList exons2 = NULL;
4433 
4434     EnsPExon exon1 = NULL;
4435     EnsPExon exon2 = NULL;
4436 
4437     if (!transcript1)
4438         return ajFalse;
4439 
4440     if (!transcript2)
4441         return ajFalse;
4442 
4443     if (transcript1 == transcript2)
4444         return ajTrue;
4445 
4446     if (!ensFeatureSimilarity(transcript1->Feature, transcript2->Feature))
4447         return ajFalse;
4448 
4449     if (!ajStrMatchCaseS(transcript1->Biotype, transcript2->Biotype))
4450         return ajFalse;
4451 
4452     if ((transcript1->Stableidentifier && transcript2->Stableidentifier) &&
4453         (!ajStrMatchCaseS(transcript1->Stableidentifier,
4454                           transcript2->Stableidentifier)))
4455         return ajFalse;
4456 
4457     exons1 = ensTranscriptLoadExons(transcript1);
4458     exons2 = ensTranscriptLoadExons(transcript2);
4459 
4460     if (ajListGetLength(exons1) != ajListGetLength(exons2))
4461         return ajFalse;
4462 
4463     iter1 = ajListIterNewread(exons1);
4464     iter2 = ajListIterNewread(exons2);
4465 
4466     while (!ajListIterDone(iter1))
4467     {
4468         exon1 = (EnsPExon) ajListIterGet(iter1);
4469 
4470         ajListIterRewind(iter2);
4471 
4472         similarity = ajFalse;
4473 
4474         while (!ajListIterDone(iter2))
4475         {
4476             exon2 = (EnsPExon) ajListIterGet(iter2);
4477 
4478             if (ensExonSimilarity(exon1, exon2))
4479             {
4480                 similarity = ajTrue;
4481                 break;
4482             }
4483         }
4484 
4485         if (similarity == ajFalse)
4486         {
4487             mismatch = ajTrue;
4488             break;
4489         }
4490     }
4491 
4492     ajListIterDel(&iter1);
4493     ajListIterDel(&iter2);
4494 
4495     if (mismatch == ajTrue)
4496         return ajFalse;
4497 
4498     return ajTrue;
4499 }
4500 
4501 
4502 
4503 
4504 /* @section map ***************************************************************
4505 **
4506 ** Functions for mapping Ensembl Transcript objects between
4507 ** Ensembl Coordinate System objects.
4508 **
4509 ** @fdata [EnsPTranscript]
4510 **
4511 ** @nam3rule Transfer Transfer an Ensembl Transcript
4512 ** @nam3rule Transform Transform an Ensembl Transcript
4513 **
4514 ** @argrule * transcript [EnsPTranscript] Ensembl Transcript
4515 ** @argrule Transfer slice [EnsPSlice] Ensembl Slice
4516 ** @argrule Transform csname [const AjPStr]
4517 ** Ensembl Coordinate System name
4518 ** @argrule Transform csversion [const AjPStr]
4519 ** Ensembl Coordinate System version
4520 **
4521 ** @valrule * [EnsPTranscript] Ensembl Transcript or NULL
4522 **
4523 ** @fcategory misc
4524 ******************************************************************************/
4525 
4526 
4527 
4528 
4529 /* @func ensTranscriptTransfer ************************************************
4530 **
4531 ** Transfer an Ensembl Transcript onto another Ensembl Slice.
4532 **
4533 ** @cc Bio::EnsEMBL::Transcript::transfer
4534 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
4535 ** @param [u] slice [EnsPSlice] Ensembl Slice
4536 ** @see ensFeatureTransfer
4537 **
4538 ** @return [EnsPTranscript] Ensembl Transcript or NULL
4539 **
4540 ** @release 6.2.0
4541 ** @@
4542 ******************************************************************************/
4543 
ensTranscriptTransfer(EnsPTranscript transcript,EnsPSlice slice)4544 EnsPTranscript ensTranscriptTransfer(EnsPTranscript transcript,
4545                                      EnsPSlice slice)
4546 {
4547     EnsPFeature newtf = NULL;
4548 
4549     EnsPTranscript newtranscript = NULL;
4550 
4551     if (ajDebugTest("ensTranscriptTransfer"))
4552         ajDebug("ensTranscriptTransfer\n"
4553                 "  transcript %p\n"
4554                 "  slice %p\n",
4555                 transcript,
4556                 slice);
4557 
4558     if (!transcript)
4559         return NULL;
4560 
4561     if (!slice)
4562         return NULL;
4563 
4564     if (!transcript->Feature)
4565         ajFatal("ensTranscriptTransfer cannot transfer an Ensembl Transcript "
4566                 "without an Ensembl Feature.\n");
4567 
4568     newtf = ensFeatureTransfer(transcript->Feature, slice);
4569 
4570     if (!newtf)
4571         return NULL;
4572 
4573     newtranscript = transcriptNewCpyFeatures(transcript);
4574 
4575     ensTranscriptSetFeature(newtranscript, newtf);
4576 
4577     ensFeatureDel(&newtf);
4578 
4579     return newtranscript;
4580 }
4581 
4582 
4583 
4584 
4585 /* @func ensTranscriptTransform ***********************************************
4586 **
4587 ** Transform an Ensembl Transcript into another Ensembl Coordinate System.
4588 **
4589 ** @cc Bio::EnsEMBL::Transcript::transform
4590 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
4591 ** @param [r] csname [const AjPStr] Ensembl Coordinate System name
4592 ** @param [r] csversion [const AjPStr] Ensembl Coordinate System version
4593 ** @see ensFeatureTransform
4594 **
4595 ** @return [EnsPTranscript] Ensembl Transcript or NULL
4596 **
4597 ** @release 6.2.0
4598 ** @@
4599 ******************************************************************************/
4600 
ensTranscriptTransform(EnsPTranscript transcript,const AjPStr csname,const AjPStr csversion)4601 EnsPTranscript ensTranscriptTransform(EnsPTranscript transcript,
4602                                       const AjPStr csname,
4603                                       const AjPStr csversion)
4604 {
4605     ajint lastnewstart  = 0;
4606     ajint lastnewstrand = 0;
4607     ajint lastoldstrand = 0;
4608     ajint minstart      = INT_MAX;
4609     ajint maxend        = INT_MIN;
4610 
4611     ajuint psslength = 0U;
4612 
4613     AjBool first       = AJFALSE;
4614     AjBool ignoreorder = AJFALSE;
4615     AjBool orderbroken = AJFALSE;
4616     AjBool error       = AJFALSE;
4617 
4618     AjIList iter1 = NULL;
4619     AjIList iter2 = NULL;
4620     AjPList pss   = NULL;
4621 
4622     EnsPBasealignfeature oldbaf = NULL;
4623     EnsPBasealignfeature newbaf = NULL;
4624 
4625     EnsPFeature newef = NULL;
4626     EnsPFeature oldef = NULL;
4627     EnsPFeature newtf = NULL;
4628 
4629     EnsPExon oldexon = NULL;
4630     EnsPExon newexon = NULL;
4631 
4632     EnsPProjectionsegment ps = NULL;
4633 
4634     const EnsPSeqregion     newsr = NULL;
4635     const EnsPSeqregion lastnewsr = NULL;
4636 
4637     EnsPTranscript newtranscript = NULL;
4638 
4639     EnsPTranslation translation = NULL;
4640 
4641     if (!transcript)
4642         return NULL;
4643 
4644     if (!csname)
4645         return NULL;
4646 
4647     newtf = ensFeatureTransform(transcript->Feature,
4648                                 csname,
4649                                 csversion,
4650                                 (EnsPSlice) NULL);
4651 
4652     if (!newtf)
4653     {
4654         /*
4655         ** If the Ensembl Transcript does not transform, test whether it
4656         ** projects, since its Ensembl Exon objects may transform well.
4657         */
4658 
4659         pss = ajListNew();
4660 
4661         ensFeatureProject(transcript->Feature, csname, csversion, pss);
4662 
4663         psslength = (ajuint) ajListGetLength(pss);
4664 
4665         while (ajListPop(pss, (void **) &ps))
4666             ensProjectionsegmentDel(&ps);
4667 
4668         ajListFree(&pss);
4669 
4670         /*
4671         ** If the AJAX List of Ensembl Projection Segment objects is empty,
4672         ** the Transcript did not project. If it projects, make sure
4673         ** all its Ensembl Exon objects are loaded.
4674         */
4675 
4676         if (psslength == 0)
4677             return NULL;
4678         else
4679             ensTranscriptLoadExons(transcript);
4680     }
4681 
4682     /*
4683     ** Copy the Ensembl Transcript object and also its internal
4684     ** Ensembl Feature class-based members.
4685     */
4686 
4687     newtranscript = transcriptNewCpyFeatures(transcript);
4688 
4689     if (newtranscript->Exons)
4690     {
4691         first = ajTrue;
4692 
4693         iter1 = ajListIterNew(newtranscript->Exons);
4694 
4695         while (!ajListIterDone(iter1))
4696         {
4697             /*
4698             ** We want to check, whether the transform preserved the
4699             ** 5 prime to 3 prime order. No complaints on trans-splicing.
4700             */
4701 
4702             oldexon = (EnsPExon) ajListIterGet(iter1);
4703 
4704             ajListIterRemove(iter1);
4705 
4706             newexon = ensExonTransform(oldexon, csname, csversion);
4707 
4708             if (!newexon)
4709             {
4710                 error = ajTrue;
4711 
4712                 break;
4713             }
4714 
4715             ajListIterInsert(iter1, (void *) newexon);
4716 
4717             /* Advance the AJAX List Iterator after the insert. */
4718 
4719             (void) ajListIterGet(iter1);
4720 
4721             if (!newtf)
4722             {
4723                 oldef = ensExonGetFeature(oldexon);
4724                 newef = ensExonGetFeature(newexon);
4725 
4726                 if (first)
4727                 {
4728                     minstart = ensFeatureGetStart(newef);
4729                     maxend   = ensFeatureGetEnd(newef);
4730 
4731                     first = ajFalse;
4732                 }
4733                 else
4734                 {
4735                     newsr = ensFeatureGetSeqregionObject(newef);
4736 
4737                     if (!ensSeqregionMatch(newsr, lastnewsr))
4738                     {
4739                         error = ajTrue;
4740 
4741                         break;
4742                     }
4743 
4744                     /*
4745                     ** Test for a trans-splicing event and ignore the Exon
4746                     ** order in those cases.
4747                     */
4748 
4749                     if (ensFeatureGetStrand(oldef) != lastoldstrand)
4750                         ignoreorder = ajTrue;
4751 
4752                     /* Check for correct Exon order. */
4753 
4754                     if ((lastnewstrand >= 0) &&
4755                         (ensFeatureGetStart(newef) < lastnewstart))
4756                         orderbroken = ajTrue;
4757 
4758                     if ((lastnewstrand < 0) &&
4759                         (ensFeatureGetStart(newef) > lastnewstart))
4760                         orderbroken = ajTrue;
4761 
4762                     /*
4763                     ** Additional check that if Ensembl Exon objects were on
4764                     ** the same strand previously, they should be again.
4765                     */
4766                     if ((lastoldstrand == ensFeatureGetStrand(oldef)) &&
4767                         !(lastnewstrand == ensFeatureGetStrand(newef)))
4768                     {
4769                         error = ajTrue;
4770 
4771                         break;
4772                     }
4773 
4774                     minstart = (ensFeatureGetStart(newef) < minstart)
4775                         ? ensFeatureGetStart(newef) : minstart;
4776 
4777                     maxend   = (ensFeatureGetEnd(newef) > maxend)
4778                         ? ensFeatureGetEnd(newef) : maxend;
4779                 }
4780 
4781                 lastnewsr     = ensFeatureGetSeqregionObject(newef);
4782                 lastnewstart  = ensFeatureGetStart(newef);
4783                 lastnewstrand = ensFeatureGetStrand(newef);
4784                 lastoldstrand = ensFeatureGetStrand(oldef);
4785             }
4786 
4787             if (newtranscript->Translation)
4788             {
4789                 if (ensExonMatch(
4790                         oldexon,
4791                         ensTranslationGetStartexon(newtranscript->Translation)))
4792                     ensTranslationSetStartexon(newtranscript->Translation,
4793                                                newexon);
4794 
4795                 if (ensExonMatch(
4796                         oldexon,
4797                         ensTranslationGetEndexon(newtranscript->Translation)))
4798                     ensTranslationSetEndexon(newtranscript->Translation,
4799                                              newexon);
4800             }
4801 
4802             if (newtranscript->Alternativetranslations)
4803             {
4804                 iter2 = ajListIterNew(newtranscript->Alternativetranslations);
4805 
4806                 while (!ajListIterDone(iter2))
4807                 {
4808                     translation = (EnsPTranslation) ajListIterGet(iter2);
4809 
4810                     if (ensExonMatch(
4811                             oldexon,
4812                             ensTranslationGetStartexon(translation)))
4813                         ensTranslationSetStartexon(translation, newexon);
4814 
4815                     if (ensExonMatch(
4816                             oldexon,
4817                             ensTranslationGetEndexon(translation)))
4818                         ensTranslationSetEndexon(translation, newexon);
4819                 }
4820 
4821                 ajListIterDel(&iter2);
4822             }
4823 
4824             ensExonDel(&oldexon);
4825         }
4826 
4827         ajListIterDel(&iter1);
4828 
4829         if (orderbroken && (!ignoreorder))
4830         {
4831             ajWarn("ensTranscriptTransform got Ensembl Exon objects out of "
4832                    "order in the transformation of Ensembl Transcript with "
4833                    "identifier %u.\n",
4834                    transcript->Identifier);
4835 
4836             error = ajTrue;
4837         }
4838 
4839         if (error)
4840         {
4841             ensFeatureDel(&newtf);
4842 
4843             ensTranscriptDel(&newtranscript);
4844 
4845             return NULL;
4846         }
4847     }
4848 
4849     if (!newtf)
4850     {
4851         ajListPeekFirst(newtranscript->Exons, (void **) &newexon);
4852 
4853         newef = ensExonGetFeature(newexon);
4854 
4855         newtf = ensFeatureNewIniS(ensFeatureGetAnalysis(transcript->Feature),
4856                                   ensFeatureGetSlice(newef),
4857                                   minstart,
4858                                   maxend,
4859                                   ensFeatureGetStrand(newef));
4860     }
4861 
4862     /*
4863     ** Set the Feature directly, since ensTranscriptSetFeature transfers all
4864     ** internal Ensembl Objects based on the Feature class onto the new
4865     ** Ensembl Feature Slice, which duplicates the work already done here.
4866     */
4867 
4868     ensFeatureDel(&newtranscript->Feature);
4869 
4870     newtranscript->Feature = newtf;
4871 
4872     /*
4873     ** Transfer all Ensembl Base Align Feature objects onto the new
4874     ** Ensembl Feature Slice.
4875     */
4876 
4877     if (newtranscript->Supportingfeatures)
4878     {
4879         iter1 = ajListIterNew(newtranscript->Supportingfeatures);
4880 
4881         while (!ajListIterDone(iter1))
4882         {
4883             oldbaf = (EnsPBasealignfeature) ajListIterGet(iter1);
4884 
4885             ajListIterRemove(iter1);
4886 
4887             newbaf = ensBasealignfeatureTransform(oldbaf, csname, csversion);
4888 
4889             if (!newbaf)
4890             {
4891                 ajDebug("ensTranscriptTransform could not transfer "
4892                         "Base Align Feature onto new Ensembl Feature Slice.");
4893 
4894                 ensBasealignfeatureTrace(oldbaf, 1);
4895             }
4896 
4897             ajListIterInsert(iter1, (void *) newbaf);
4898 
4899             /* Advance the AJAX List Iterator after the insert. */
4900 
4901             (void) ajListIterGet(iter1);
4902 
4903             ensBasealignfeatureDel(&oldbaf);
4904         }
4905 
4906         ajListIterDel(&iter1);
4907     }
4908 
4909     /* Clear internal members that depend on Ensembl Exon coordinates. */
4910 
4911     ensMapperClear(newtranscript->ExonCoordMapper);
4912 
4913     return newtranscript;
4914 }
4915 
4916 
4917 
4918 
4919 /* @section fetch *************************************************************
4920 **
4921 ** Functions for fetching information from an Ensembl Transcript object.
4922 **
4923 ** @fdata [EnsPTranscript]
4924 **
4925 ** @nam3rule Fetch Fetch Ensembl Transcript information
4926 ** @nam4rule All Fetch all objects
4927 ** @nam5rule Attributes Fetch all Ensembl Attribute objects
4928 ** @nam5rule Constitutiveexons Fetch all constitutive Ensembl Exon objects
4929 ** @nam5rule Databaseentries Fetch all Ensembl Database Entry objects
4930 ** @nam5rule Introns Fetch all Ensembl Intron objects
4931 ** @nam5rule Sequenceedits Fetch all Ensembl Sequence Edit objects
4932 ** @nam4rule Displayidentifier Fetch the display identifier
4933 ** @nam4rule Feature     Fetch the Ensembl Feature
4934 ** @nam4rule Gene        Fetch the Ensembl Gene
4935 ** @nam4rule Sequence    Fetch the sequence
4936 ** @nam5rule Coding      Fetch the coding sequence
4937 ** @nam5rule Transcript  Fetch the Ensembl Transcript (cDNA) sequence
4938 ** @nam5rule Utrfive     Fetch the five-prime untranslated region
4939 ** @nam5rule Utrthree    Fetch the three-prime untranslated region
4940 ** @nam6rule Seq         Fetch as AJAX Sequence object
4941 ** @nam6rule Str         Fetch as AJAX String object
4942 ** @nam5rule Translation Fetch the Ensembl Translation sequence
4943 ** @nam6rule Seq         Fetch as AJAX Sequence object
4944 ** @nam6rule Str         Fetch as AJAX String object
4945 **
4946 ** @argrule AllAttributes transcript [EnsPTranscript] Ensembl Transcript
4947 ** @argrule AllAttributes code [const AjPStr] Ensembl Attribute code
4948 ** @argrule AllAttributes attributes [AjPList]
4949 ** AJAX List of Ensembl Attribute objects
4950 ** @argrule AllConstitutiveexons transcript [EnsPTranscript] Ensembl Transcript
4951 ** @argrule AllConstitutiveexons exons [AjPList]
4952 ** AJAX List of Ensembl Exon objects
4953 ** @argrule AllDatabaseentries transcript [EnsPTranscript] Ensembl Transcript
4954 ** @argrule AllDatabaseentries name [const AjPStr]
4955 ** Ensembl External Database name
4956 ** @argrule AllDatabaseentries type [EnsEExternaldatabaseType]
4957 ** Ensembl External Database type
4958 ** @argrule AllDatabaseentries dbes [AjPList]
4959 ** AJAX List of Ensembl Database Entry objects
4960 ** @argrule AllIntrons transcript [EnsPTranscript] Ensembl Transcript
4961 ** @argrule AllIntrons introns [AjPList] AJAX List of Ensembl Intron objects
4962 ** @argrule AllSequenceedits transcript [EnsPTranscript] Ensembl Transcript
4963 ** @argrule AllSequenceedits ses [AjPList]
4964 ** AJAX List of Ensembl Sequence Edit objects
4965 ** @argrule Displayidentifier transcript [const EnsPTranscript]
4966 ** Ensembl Transcript
4967 ** @argrule Displayidentifier Pidentifier [AjPStr*] AJAX String address
4968 ** @argrule Feature transcript [EnsPTranscript] Ensembl Transcript
4969 ** @argrule Feature translation [EnsPTranslation] Ensembl Translation
4970 ** @argrule Feature Pfeature [EnsPFeature*] Ensembl Feature address
4971 ** @argrule Gene transcript [const EnsPTranscript] Ensembl Transcript
4972 ** @argrule Gene Pgene [EnsPGene*] Ensembl Gene address
4973 ** @argrule Sequence transcript [EnsPTranscript] Ensembl Transcript
4974 ** @argrule SequenceCoding translation [EnsPTranslation] Ensembl Translation
4975 ** @argrule SequenceTranslation translation [EnsPTranslation]
4976 ** Ensembl Translation
4977 ** @argrule SequenceUtrfive translation [EnsPTranslation]
4978 ** Ensembl Translation
4979 ** @argrule SequenceUtrthree translation [EnsPTranslation]
4980 ** Ensembl Translation
4981 ** @argrule Seq Psequence [AjPSeq*] AJAX Sequence address
4982 ** @argrule Str Psequence [AjPStr*] AJAX String address
4983 **
4984 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
4985 **
4986 ** @fcategory misc
4987 ******************************************************************************/
4988 
4989 
4990 
4991 
4992 /* @func ensTranscriptFetchAllAttributes **************************************
4993 **
4994 ** Fetch all Ensembl Attribute objects of an Ensembl Transcript and optionally
4995 ** filter via an Ensembl Attribute code. To get all Ensembl Attribute objects
4996 ** for this Ensembl Transcript, consider using ensTranscriptLoadAttributes.
4997 **
4998 ** The caller is responsible for deleting the Ensembl Attribute objects before
4999 ** deleting the AJAX List.
5000 **
5001 ** @cc Bio::EnsEMBL::Transcript::get_all_Attributes
5002 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5003 ** @param [rN] code [const AjPStr] Ensembl Attribute code
5004 ** @param [u] attributes [AjPList] AJAX List of Ensembl Attribute objects
5005 ** @see ensTranscriptLoadAttributes
5006 **
5007 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5008 **
5009 ** @release 6.2.0
5010 ** @@
5011 ******************************************************************************/
5012 
ensTranscriptFetchAllAttributes(EnsPTranscript transcript,const AjPStr code,AjPList attributes)5013 AjBool ensTranscriptFetchAllAttributes(EnsPTranscript transcript,
5014                                        const AjPStr code,
5015                                        AjPList attributes)
5016 {
5017     AjBool match = AJFALSE;
5018 
5019     AjIList iter = NULL;
5020     const AjPList list = NULL;
5021 
5022     EnsPAttribute attribute = NULL;
5023 
5024     if (!transcript)
5025         return ajFalse;
5026 
5027     if (!attributes)
5028         return ajFalse;
5029 
5030     list = ensTranscriptLoadAttributes(transcript);
5031 
5032     iter = ajListIterNewread(list);
5033 
5034     while (!ajListIterDone(iter))
5035     {
5036         attribute = (EnsPAttribute) ajListIterGet(iter);
5037 
5038         if (code)
5039         {
5040             if (ajStrMatchCaseS(code, ensAttributeGetCode(attribute)))
5041                 match = ajTrue;
5042             else
5043                 match = ajFalse;
5044         }
5045         else
5046             match = ajTrue;
5047 
5048         if (match)
5049             ajListPushAppend(attributes,
5050                              (void *) ensAttributeNewRef(attribute));
5051     }
5052 
5053     ajListIterDel(&iter);
5054 
5055     return ajTrue;
5056 }
5057 
5058 
5059 
5060 
5061 /* @func ensTranscriptFetchAllConstitutiveexons *******************************
5062 **
5063 ** Fetch all constitutive Ensembl Exon objects of an Ensembl Transcript.
5064 **
5065 ** The caller is responsible for deleting the Ensembl Exon objects before
5066 ** deleting the AJAX List.
5067 **
5068 ** @cc Bio::EnsEMBL::Transcript::get_all_constitutive_Exons
5069 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5070 ** @param [u] exons [AjPList] AJAX List of Ensembl Exon objects
5071 **
5072 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5073 **
5074 ** @release 6.4.0
5075 ** @@
5076 ******************************************************************************/
5077 
ensTranscriptFetchAllConstitutiveexons(EnsPTranscript transcript,AjPList exons)5078 AjBool ensTranscriptFetchAllConstitutiveexons(EnsPTranscript transcript,
5079                                               AjPList exons)
5080 {
5081     AjIList iter = NULL;
5082     const AjPList list = NULL;
5083 
5084     EnsPExon exon = NULL;
5085 
5086     if (!transcript)
5087         return ajFalse;
5088 
5089     if (!exons)
5090         return ajFalse;
5091 
5092     list = ensTranscriptLoadExons(transcript);
5093 
5094     iter = ajListIterNewread(list);
5095 
5096     while (!ajListIterDone(iter))
5097     {
5098         exon = (EnsPExon) ajListIterGet(iter);
5099 
5100         if (ensExonGetConstitutive(exon))
5101             ajListPushAppend(exons, (void *) ensExonNewRef(exon));
5102     }
5103 
5104     ajListIterDel(&iter);
5105 
5106     return ajTrue;
5107 }
5108 
5109 
5110 
5111 
5112 /* @func ensTranscriptFetchAllDatabaseentries *********************************
5113 **
5114 ** Fetch all Ensembl Database Entry objects of an Ensembl Transcript and
5115 ** optionally filter via an Ensembl External Database name or type. To get all
5116 ** Ensembl External Database objects for this Ensembl Transcript, consider
5117 ** using ensTranscriptGetExternalDatabaseentries.
5118 **
5119 ** The caller is responsible for deleting the Ensembl Database Entry objects
5120 ** before deleting the AJAX List.
5121 **
5122 ** @cc Bio::EnsEMBL::Transcript::get_all_DBEntries
5123 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5124 ** @param [rN] name [const AjPStr] Ensembl External Database name
5125 ** @param [uN] type [EnsEExternaldatabaseType] Ensembl External Database type
5126 ** @param [u] dbes [AjPList] AJAX List of Ensembl Database Entry object
5127 ** @see ensTranscriptLoadDatabaseentries
5128 **
5129 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5130 **
5131 ** @release 6.4.0
5132 ** @@
5133 ******************************************************************************/
5134 
ensTranscriptFetchAllDatabaseentries(EnsPTranscript transcript,const AjPStr name,EnsEExternaldatabaseType type,AjPList dbes)5135 AjBool ensTranscriptFetchAllDatabaseentries(EnsPTranscript transcript,
5136                                             const AjPStr name,
5137                                             EnsEExternaldatabaseType type,
5138                                             AjPList dbes)
5139 {
5140     AjBool namematch = AJFALSE;
5141     AjBool typematch = AJFALSE;
5142 
5143     AjIList iter = NULL;
5144     const AjPList list = NULL;
5145 
5146     EnsPDatabaseentry dbe = NULL;
5147 
5148     if (!transcript)
5149         return ajFalse;
5150 
5151     if (!dbes)
5152         return ajFalse;
5153 
5154     list = ensTranscriptLoadDatabaseentries(transcript);
5155 
5156     iter = ajListIterNewread(list);
5157 
5158     while (!ajListIterDone(iter))
5159     {
5160         dbe = (EnsPDatabaseentry) ajListIterGet(iter);
5161 
5162         if (name)
5163         {
5164             if (ajStrMatchCaseS(name, ensDatabaseentryGetDbName(dbe)))
5165                 namematch = ajTrue;
5166             else
5167                 namematch = ajFalse;
5168         }
5169         else
5170             namematch = ajTrue;
5171 
5172         if (type)
5173         {
5174             if (type == ensDatabaseentryGetType(dbe))
5175                 typematch = ajTrue;
5176             else
5177                 typematch = ajFalse;
5178         }
5179 
5180         else
5181             typematch = ajTrue;
5182 
5183         if (namematch && typematch)
5184             ajListPushAppend(dbes, (void *) ensDatabaseentryNewRef(dbe));
5185     }
5186 
5187     ajListIterDel(&iter);
5188 
5189     return ajTrue;
5190 }
5191 
5192 
5193 
5194 
5195 /* @func ensTranscriptFetchAllIntrons *****************************************
5196 **
5197 ** Fetch all Ensembl Intron objects of an Ensembl Transcript.
5198 **
5199 ** The caller is responsible for deleting the Ensembl Intron objects before
5200 ** deleting the AJAX List.
5201 **
5202 ** @cc Bio::EnsEMBL::Transcript::get_all_Introns
5203 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5204 ** @param [u] introns [AjPList] AJAX List of Ensembl Intron objects
5205 **
5206 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5207 **
5208 ** @release 6.2.0
5209 ** @@
5210 ******************************************************************************/
5211 
ensTranscriptFetchAllIntrons(EnsPTranscript transcript,AjPList introns)5212 AjBool ensTranscriptFetchAllIntrons(EnsPTranscript transcript,
5213                                     AjPList introns)
5214 {
5215     register ajuint i = 0U;
5216 
5217     const AjPList list = NULL;
5218 
5219     EnsPExon exon1 = NULL;
5220     EnsPExon exon2 = NULL;
5221 
5222     EnsPIntron intron = NULL;
5223 
5224     if (!transcript)
5225         return ajFalse;
5226 
5227     if (!introns)
5228         return ajFalse;
5229 
5230     list = ensTranscriptLoadExons(transcript);
5231 
5232     for (i = 0U; i < (ajListGetLength(list) - 1); i++)
5233     {
5234         ajListPeekNumber(list, i,     (void **) &exon1);
5235         ajListPeekNumber(list, i + 1, (void **) &exon2);
5236 
5237         intron = ensIntronNewIni(exon1, exon2, (EnsPAnalysis) NULL);
5238 
5239         ajListPushAppend(introns, (void *) intron);
5240     }
5241 
5242     return ajTrue;
5243 }
5244 
5245 
5246 
5247 
5248 /* @func ensTranscriptFetchAllSequenceedits ***********************************
5249 **
5250 ** Fetch all Ensembl Sequence Edit objects of an Ensembl Transcript.
5251 **
5252 ** The caller is responsible for deleting the Ensembl Sequence Edit objects
5253 ** before deleting the AJAX List.
5254 **
5255 ** @cc Bio::EnsEMBL::Transcript::get_all_SeqEdits
5256 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5257 ** @param [u] ses [AjPList] AJAX List of Ensembl Sequence Edit objects
5258 **
5259 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5260 **
5261 ** @release 6.4.0
5262 ** @@
5263 ** Ensembl Sequence Edit objects are Ensembl Attribute objects, which codes
5264 ** have to be defined in the
5265 ** static const char *const transcriptKSequenceeditCode[] array.
5266 ******************************************************************************/
5267 
ensTranscriptFetchAllSequenceedits(EnsPTranscript transcript,AjPList ses)5268 AjBool ensTranscriptFetchAllSequenceedits(EnsPTranscript transcript,
5269                                           AjPList ses)
5270 {
5271     register ajuint i = 0U;
5272 
5273     AjPList attributes = NULL;
5274 
5275     AjPStr code = NULL;
5276 
5277     EnsPAttribute at = NULL;
5278 
5279     EnsPSequenceedit se = NULL;
5280 
5281     if (!transcript)
5282         return ajFalse;
5283 
5284     if (!ses)
5285         return ajFalse;
5286 
5287     code = ajStrNew();
5288 
5289     attributes = ajListNew();
5290 
5291     for (i = 0U; transcriptKSequenceeditCode[i]; i++)
5292     {
5293         ajStrAssignC(&code, transcriptKSequenceeditCode[i]);
5294 
5295         ensTranscriptFetchAllAttributes(transcript, code, attributes);
5296     }
5297 
5298     while (ajListPop(attributes, (void **) &at))
5299     {
5300         se = ensSequenceeditNewAttribute(at);
5301 
5302         ajListPushAppend(ses, (void *) se);
5303 
5304         ensAttributeDel(&at);
5305     }
5306 
5307     ajListFree(&attributes);
5308 
5309     ajStrDel(&code);
5310 
5311     return ajTrue;
5312 }
5313 
5314 
5315 
5316 
5317 /* @func ensTranscriptFetchDisplayidentifier **********************************
5318 **
5319 ** Fetch the display identifier of an Ensembl Transcript.
5320 ** This will return the stable identifier, the SQL database-internal identifier
5321 ** or the Transcript memory address in this descending priority.
5322 ** The caller is responsible for deleting the AJAX String.
5323 **
5324 ** @cc Bio::EnsEMBL::Transcript::display_id
5325 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
5326 ** @param [wP] Pidentifier [AjPStr*] AJAX String address
5327 **
5328 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5329 **
5330 ** @release 6.4.0
5331 ** @@
5332 ******************************************************************************/
5333 
ensTranscriptFetchDisplayidentifier(const EnsPTranscript transcript,AjPStr * Pidentifier)5334 AjBool ensTranscriptFetchDisplayidentifier(const EnsPTranscript transcript,
5335                                            AjPStr *Pidentifier)
5336 {
5337     if (!transcript)
5338         return ajFalse;
5339 
5340     if (!Pidentifier)
5341         return ajFalse;
5342 
5343     if (transcript->Stableidentifier &&
5344         ajStrGetLen(transcript->Stableidentifier))
5345     {
5346         if (*Pidentifier)
5347             ajStrAssignS(Pidentifier, transcript->Stableidentifier);
5348         else
5349             *Pidentifier = ajStrNewS(transcript->Stableidentifier);
5350     }
5351     else if (transcript->Identifier)
5352     {
5353         if (*Pidentifier)
5354             *Pidentifier = ajFmtPrintS(Pidentifier,
5355                                        "%u", transcript->Identifier);
5356         else
5357             *Pidentifier = ajFmtStr("%u", transcript->Identifier);
5358     }
5359     else
5360     {
5361         if (*Pidentifier)
5362             *Pidentifier = ajFmtPrintS(Pidentifier, "%p", transcript);
5363         else
5364             *Pidentifier = ajFmtStr("%p", transcript);
5365     }
5366 
5367     return ajTrue;
5368 }
5369 
5370 
5371 
5372 
5373 /* @func ensTranscriptFetchFeatureUtrfive *************************************
5374 **
5375 ** Fetch an Ensembl Feature spanning the five prime untranslated region (UTR)
5376 ** of an Ensembl Translation of an Ensembl Transcript an Ensembl Feature.
5377 **
5378 ** The caller is responsible for deleting the Ensembl Feature.
5379 **
5380 ** @cc Bio::EnsEMBL::Transcript::five_prime_utr_Feature
5381 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5382 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
5383 ** @param [wP] Pfeature [EnsPFeature*] Ensembl Feature address
5384 **
5385 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5386 **
5387 ** @release 6.5.0
5388 ** @@
5389 ******************************************************************************/
5390 
ensTranscriptFetchFeatureUtrfive(EnsPTranscript transcript,EnsPTranslation translation,EnsPFeature * Pfeature)5391 AjBool ensTranscriptFetchFeatureUtrfive(EnsPTranscript transcript,
5392                                         EnsPTranslation translation,
5393                                         EnsPFeature *Pfeature)
5394 {
5395     ajint ftstart  = 0;
5396     ajint ftend    = 0;
5397 
5398     ajint slcstart = 0;
5399 
5400     EnsPFeature feature = NULL;
5401 
5402     if (!transcript)
5403         return ajFalse;
5404 
5405     if (!translation)
5406         return ajFalse;
5407 
5408     if (!Pfeature)
5409         return ajFalse;
5410 
5411     *Pfeature = NULL;
5412 
5413     feature = transcript->Feature;
5414 
5415     slcstart = ensTranscriptCalculateSliceCodingStart(transcript, translation);
5416 
5417     if (ensFeatureGetStrand(feature) >= 0)
5418     {
5419         ftstart = ensFeatureGetStart(feature);
5420         ftend   = slcstart - 1;
5421     }
5422     else
5423     {
5424         ftstart = slcstart + 1;
5425         ftend   = ensFeatureGetEnd(feature);
5426     }
5427 
5428     if (ftstart < ftend)
5429         *Pfeature = ensFeatureNewIniS(
5430             ensFeatureGetAnalysis(feature),
5431             ensFeatureGetSlice(feature),
5432             ftstart,
5433             ftend,
5434             ensFeatureGetStrand(feature));
5435 
5436     return ajTrue;
5437 }
5438 
5439 
5440 
5441 
5442 /* @func ensTranscriptFetchFeatureUtrthree ************************************
5443 **
5444 ** Fetch an Ensembl Feature spanning the three prime untranslated region (UTR)
5445 ** of an Ensembl Translation of an Ensembl Transcript an Ensembl Feature.
5446 **
5447 ** The caller is responsible for deleting the Ensembl Feature.
5448 **
5449 ** @cc Bio::EnsEMBL::Transcript::three_prime_utr_Feature
5450 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5451 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
5452 ** @param [wP] Pfeature [EnsPFeature*] Ensembl Feature address
5453 **
5454 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5455 **
5456 ** @release 6.5.0
5457 ** @@
5458 ******************************************************************************/
5459 
ensTranscriptFetchFeatureUtrthree(EnsPTranscript transcript,EnsPTranslation translation,EnsPFeature * Pfeature)5460 AjBool ensTranscriptFetchFeatureUtrthree(EnsPTranscript transcript,
5461                                          EnsPTranslation translation,
5462                                          EnsPFeature *Pfeature)
5463 {
5464     ajint ftstart  = 0;
5465     ajint ftend    = 0;
5466 
5467     ajint slcend = 0;
5468 
5469     EnsPFeature feature = NULL;
5470 
5471     if (!transcript)
5472         return ajFalse;
5473 
5474     if (!translation)
5475         return ajFalse;
5476 
5477     if (!Pfeature)
5478         return ajFalse;
5479 
5480     *Pfeature = NULL;
5481 
5482     feature = transcript->Feature;
5483 
5484     slcend = ensTranscriptCalculateSliceCodingEnd(transcript, translation);
5485 
5486     if (ensFeatureGetStrand(feature) >= 0)
5487     {
5488         ftstart = slcend + 1;
5489         ftend   = ensFeatureGetEnd(feature);
5490     }
5491     else
5492     {
5493         ftstart = ensFeatureGetStart(feature);
5494         ftend   = slcend - 1;
5495     }
5496 
5497     if (ftstart < ftend)
5498         *Pfeature = ensFeatureNewIniS(
5499             ensFeatureGetAnalysis(feature),
5500             ensFeatureGetSlice(feature),
5501             ftstart,
5502             ftend,
5503             ensFeatureGetStrand(feature));
5504 
5505     return ajTrue;
5506 }
5507 
5508 
5509 
5510 
5511 /* @func ensTranscriptFetchGene ***********************************************
5512 **
5513 ** Fetch the Ensembl Gene of an Ensembl Transcript.
5514 ** The caller is responsible for deleting the Ensembl Gene.
5515 **
5516 ** @cc Bio::EnsEMBL::Transcript::get_Gene
5517 ** @param [r] transcript [const EnsPTranscript] Ensembl Transcript
5518 ** @param [wP] Pgene [EnsPGene*] Ensembl Gene address
5519 **
5520 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5521 **
5522 ** @release 6.4.0
5523 ** @@
5524 ******************************************************************************/
5525 
ensTranscriptFetchGene(const EnsPTranscript transcript,EnsPGene * Pgene)5526 AjBool ensTranscriptFetchGene(const EnsPTranscript transcript,
5527                               EnsPGene *Pgene)
5528 {
5529     if (!transcript)
5530         return ajFalse;
5531 
5532     if (!Pgene)
5533         return ajFalse;
5534 
5535     *Pgene = NULL;
5536 
5537     return ensGeneadaptorFetchByTranscriptidentifier(
5538         ensRegistryGetGeneadaptor(
5539             ensTranscriptadaptorGetDatabaseadaptor(transcript->Adaptor)),
5540         transcript->Identifier,
5541         Pgene);
5542 }
5543 
5544 
5545 
5546 
5547 /* @func ensTranscriptFetchSequenceCodingStr **********************************
5548 **
5549 ** Fetch the coding (translatable) sequence portion of an Ensembl Transcript as
5550 ** AJAX String. The sequence is padded with 'N's according to the start phase
5551 ** of the first coding Exon.
5552 **
5553 ** The caller is responsible for deleting the AJAX String.
5554 **
5555 ** @cc Bio::EnsEMBL::Transcript::translateable_seq
5556 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5557 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
5558 ** @param [wP] Psequence [AjPStr*] AJAX String address
5559 **
5560 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5561 **
5562 ** @release 6.4.0
5563 ** @@
5564 ******************************************************************************/
5565 
ensTranscriptFetchSequenceCodingStr(EnsPTranscript transcript,EnsPTranslation translation,AjPStr * Psequence)5566 AjBool ensTranscriptFetchSequenceCodingStr(EnsPTranscript transcript,
5567                                            EnsPTranslation translation,
5568                                            AjPStr *Psequence)
5569 {
5570     ajint sphase = 0;
5571 
5572     ajuint cdsstart = 0U;
5573     ajuint cdsend   = 0U;
5574 
5575     AjPStr sequence = NULL;
5576 
5577     if (!transcript)
5578         return ajFalse;
5579 
5580     if (!Psequence)
5581         return ajFalse;
5582 
5583     if (*Psequence)
5584         ajStrAssignClear(Psequence);
5585     else
5586         *Psequence = ajStrNew();
5587 
5588     /*
5589     ** Return an empty string for non-coding Ensembl Transcript objects.
5590     ** The ensTranscriptLoadTranslation function will attempt to load the
5591     ** Translation from the database.
5592     */
5593 
5594     if (!translation)
5595     {
5596         ajDebug("ensTranscriptFetchSequenceCodingStr got a Transcript "
5597                 "without a Translation.\n");
5598 
5599         return ajTrue;
5600     }
5601 
5602     /* Calculate coding start and end coordinates. */
5603 
5604     cdsstart = ensTranscriptCalculateTranscriptCodingStart(transcript,
5605                                                            translation);
5606 
5607     if (!cdsstart)
5608     {
5609         ajDebug("ensTranscriptFetchSequenceCodingStr got a Transcript and "
5610                 "Translation pair with an invalid cdsstart %u.\n", cdsstart);
5611 
5612         return ajTrue;
5613     }
5614 
5615     cdsend = ensTranscriptCalculateTranscriptCodingEnd(transcript,
5616                                                        translation);
5617 
5618     if (!cdsend)
5619     {
5620         ajDebug("ensTranscriptFetchSequenceCodingStr got a Transcript and "
5621                 "Translation pair with an invalid cdsend %u.\n", cdsend);
5622 
5623         return ajTrue;
5624     }
5625 
5626     sphase = ensExonGetPhaseStart(ensTranslationGetStartexon(translation));
5627 
5628     if (sphase > 0)
5629         ajStrAppendCountK(Psequence, 'N', sphase);
5630 
5631     ensTranscriptFetchSequenceTranscriptStr(transcript, &sequence);
5632 
5633     ajStrAppendSubS(Psequence, sequence, cdsstart - 1, cdsend - 1);
5634 
5635     ajStrDel(&sequence);
5636 
5637     return ajTrue;
5638 }
5639 
5640 
5641 
5642 
5643 /* @func ensTranscriptFetchSequenceTranscriptSeq ******************************
5644 **
5645 ** Fetch the sequence of an Ensembl Transcript as AJAX Sequence.
5646 ** The caller is responsible for deleting the AJAX Sequence.
5647 **
5648 ** @cc Bio::EnsEMBL::Transcript:spliced_seq
5649 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5650 ** @param [wP] Psequence [AjPSeq*] AJAX Sequence address
5651 **
5652 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5653 **
5654 ** @release 6.4.0
5655 ** @@
5656 ******************************************************************************/
5657 
ensTranscriptFetchSequenceTranscriptSeq(EnsPTranscript transcript,AjPSeq * Psequence)5658 AjBool ensTranscriptFetchSequenceTranscriptSeq(EnsPTranscript transcript,
5659                                                AjPSeq *Psequence)
5660 {
5661     AjPStr name     = NULL;
5662     AjPStr sequence = NULL;
5663 
5664     if (!transcript)
5665         return ajFalse;
5666 
5667     if (!Psequence)
5668         return ajFalse;
5669 
5670     /*
5671     ** It is sligtly more efficient, if undefined AJAX String objects are
5672     ** directly allocated by the following functions to their final size.
5673     */
5674 
5675     ensTranscriptFetchDisplayidentifier(transcript, &name);
5676     ensTranscriptFetchSequenceTranscriptStr(transcript, &sequence);
5677 
5678     if (*Psequence)
5679     {
5680         ajSeqClear(*Psequence);
5681 
5682         ajSeqAssignNameS(*Psequence, name);
5683         ajSeqAssignSeqS(*Psequence, sequence);
5684     }
5685     else
5686         *Psequence = ajSeqNewNameS(sequence, name);
5687 
5688     ajSeqSetNuc(*Psequence);
5689 
5690     ajStrDel(&name);
5691     ajStrDel(&sequence);
5692 
5693     return ajTrue;
5694 }
5695 
5696 
5697 
5698 
5699 /* @func ensTranscriptFetchSequenceTranscriptStr ******************************
5700 **
5701 ** Fetch the spliced sequence of an Ensembl Transcript as AJAX String.
5702 **
5703 ** The sequence of all Ensembl Exon objects is concatenated and by default, all
5704 ** post-transcriptional Sequence Edit objects are applied, but can be disabled
5705 ** by setting ensTranscriptSetSequenceedits to ajFalse.
5706 **
5707 ** The caller is responsible for deleting the AJAX String.
5708 **
5709 ** @cc Bio::EnsEMBL::Transcript::spliced_seq
5710 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5711 ** @param [wP] Psequence [AjPStr*] AJAX String address
5712 ** @see ensTranscriptSetSequenceedits
5713 **
5714 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5715 **
5716 ** @release 6.4.0
5717 ** @@
5718 ******************************************************************************/
5719 
ensTranscriptFetchSequenceTranscriptStr(EnsPTranscript transcript,AjPStr * Psequence)5720 AjBool ensTranscriptFetchSequenceTranscriptStr(EnsPTranscript transcript,
5721                                                AjPStr *Psequence)
5722 {
5723     AjIList iter        = NULL;
5724     const AjPList exons = NULL;
5725     AjPList ses         = NULL;
5726 
5727     AjPStr sequence = NULL;
5728 
5729     EnsPExon exon = NULL;
5730 
5731     EnsPFeature feature = NULL;
5732 
5733     EnsPSequenceedit se = NULL;
5734 
5735     if (!transcript)
5736         return ajFalse;
5737 
5738     if (!Psequence)
5739         return ajFalse;
5740 
5741     if (*Psequence)
5742         ajStrAssignClear(Psequence);
5743     else
5744         *Psequence = ajStrNew();
5745 
5746     sequence = ajStrNew();
5747 
5748     exons = ensTranscriptLoadExons(transcript);
5749 
5750     iter = ajListIterNewread(exons);
5751 
5752     while (!ajListIterDone(iter))
5753     {
5754         exon = (EnsPExon) ajListIterGet(iter);
5755 
5756         ensExonFetchSequenceSliceStr(exon, &sequence);
5757 
5758         if (sequence && ajStrGetLen(sequence))
5759             ajStrAppendS(Psequence, sequence);
5760         else
5761         {
5762             ajDebug("ensTranscriptFetchSequenceTranscriptStr could not get "
5763                     "sequence for Exon %p. Transcript sequence may not be "
5764                     "correct.\n",
5765                     exon);
5766 
5767             ensExonTrace(exon, 1);
5768 
5769             feature = ensExonGetFeature(exon);
5770 
5771             ajStrAppendCountK(Psequence,
5772                               'N',
5773                               ensFeatureCalculateLength(feature));
5774         }
5775     }
5776 
5777     ajListIterDel(&iter);
5778 
5779     ajStrDel(&sequence);
5780 
5781     /* Apply post-transcriptional Sequence Edit objects if enabled. */
5782 
5783     if (transcript->Sequenceedits)
5784     {
5785         ses = ajListNew();
5786 
5787         ensTranscriptFetchAllSequenceedits(transcript, ses);
5788 
5789         /*
5790         ** Sort Sequence Edit objects in reverse order to avoid the
5791         ** complication of adjusting down-stream Sequence Edit coordinates.
5792         */
5793 
5794         ensListSequenceeditSortStartDescending(ses);
5795 
5796         while (ajListPop(ses, (void **) &se))
5797         {
5798             ensSequenceeditApplyString(se, 0, Psequence);
5799 
5800             ensSequenceeditDel(&se);
5801         }
5802 
5803         ajListFree(&ses);
5804     }
5805 
5806     return ajTrue;
5807 }
5808 
5809 
5810 
5811 
5812 /* @func ensTranscriptFetchSequenceTranslationSeq *****************************
5813 **
5814 ** Fetch the sequence of the Ensembl Translation of an
5815 ** Ensembl Transcript as AJAX Sequence.
5816 **
5817 ** The sequence is based on ensTranscriptFetchSequenceCodingStr and by
5818 ** default, all post-translational Sequence Edit objects are applied, but
5819 ** can be disabled by setting ensTranscriptSetSequenceedits to ajFalse.
5820 **
5821 ** The caller is responsible for deleting the AJAX Sequence.
5822 **
5823 ** @cc Bio::EnsEMBL::Transcript::translate
5824 ** @cc Bio::EnsEMBL::Translation::modify_translation
5825 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5826 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
5827 ** @param [wP] Psequence [AjPSeq*] AJAX Sequence address
5828 ** @see ensTranscriptFetchSequenceCodingStr
5829 **
5830 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5831 **
5832 ** @release 6.4.0
5833 ** @@
5834 ******************************************************************************/
5835 
ensTranscriptFetchSequenceTranslationSeq(EnsPTranscript transcript,EnsPTranslation translation,AjPSeq * Psequence)5836 AjBool ensTranscriptFetchSequenceTranslationSeq(EnsPTranscript transcript,
5837                                                 EnsPTranslation translation,
5838                                                 AjPSeq *Psequence)
5839 {
5840     AjPStr name     = NULL;
5841     AjPStr sequence = NULL;
5842 
5843     if (!transcript)
5844         return ajFalse;
5845 
5846     if (!translation)
5847         return ajTrue;
5848 
5849     if (!Psequence)
5850         return ajFalse;
5851 
5852     name     = ajStrNew();
5853     sequence = ajStrNew();
5854 
5855     ensTranslationFetchDisplayidentifier(translation, &name);
5856     ensTranscriptFetchSequenceTranslationStr(transcript,
5857                                              translation,
5858                                              &sequence);
5859 
5860     if (*Psequence)
5861     {
5862         ajSeqClear(*Psequence);
5863 
5864         ajSeqAssignNameS(*Psequence, name);
5865         ajSeqAssignSeqS(*Psequence, sequence);
5866     }
5867     else
5868         *Psequence = ajSeqNewNameS(sequence, name);
5869 
5870     ajSeqSetProt(*Psequence);
5871 
5872     ajStrDel(&name);
5873     ajStrDel(&sequence);
5874 
5875     return ajTrue;
5876 }
5877 
5878 
5879 
5880 
5881 /* @func ensTranscriptFetchSequenceTranslationStr *****************************
5882 **
5883 ** Fetch the sequence of the Ensembl Translation of an
5884 ** Ensembl Transcript as AJAX String.
5885 **
5886 ** The sequence is based on ensTranscriptFetchSequenceCodingStr and by
5887 ** default, all post-translational Sequence Edit objects are applied,
5888 ** but can be disabled by setting ensTranscriptSetSequenceedits to ajFalse.
5889 **
5890 ** The caller is responsible for deleting the AJAX String.
5891 **
5892 ** @cc Bio::EnsEMBL::Transcript::translate
5893 ** @cc Bio::EnsEMBL::Translation::modify_translation
5894 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
5895 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
5896 ** @param [wP] Psequence [AjPStr*] AJAX String address
5897 ** @see ensTranscriptFetchSequenceCodingStr
5898 **
5899 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
5900 **
5901 ** @release 6.4.0
5902 ** @@
5903 ******************************************************************************/
5904 
ensTranscriptFetchSequenceTranslationStr(EnsPTranscript transcript,EnsPTranslation translation,AjPStr * Psequence)5905 AjBool ensTranscriptFetchSequenceTranslationStr(EnsPTranscript transcript,
5906                                                 EnsPTranslation translation,
5907                                                 AjPStr *Psequence)
5908 {
5909     AjPList ses = NULL;
5910 
5911     AjPStr cdna = NULL;
5912 
5913     const AjPTrn trn = NULL;
5914 
5915     EnsPSequenceedit se = NULL;
5916 
5917     EnsPSlice slice = NULL;
5918 
5919     if (ajDebugTest("ensTranscriptFetchSequenceTranslationStr"))
5920         ajDebug("ensTranscriptFetchSequenceTranslationStr\n"
5921                 "  transcript %p\n"
5922                 "  translation %p\n"
5923                 "  Psequence %p\n",
5924                 transcript,
5925                 translation,
5926                 Psequence);
5927 
5928     if (!transcript)
5929         return ajFalse;
5930 
5931     if (!Psequence)
5932         return ajFalse;
5933 
5934     if (*Psequence)
5935         ajStrAssignClear(Psequence);
5936     else
5937         *Psequence = ajStrNew();
5938 
5939     /*
5940     ** Return an empty string for non-coding Ensembl Transcript objects.
5941     ** The ensTranscriptLoadTranslation function will attempt to load the
5942     ** Translation from the database.
5943     */
5944 
5945     if (!translation)
5946     {
5947         ajDebug("ensTranscriptFetchSequenceTranslationStr got a Transcript "
5948                 "without a Translation.\n");
5949 
5950         return ajTrue;
5951     }
5952 
5953     cdna = ajStrNew();
5954 
5955     ensTranscriptFetchSequenceCodingStr(transcript, translation, &cdna);
5956 
5957     if (ajStrGetLen(cdna) < 1)
5958         return ajTrue;
5959 
5960     slice = ensFeatureGetSlice(transcript->Feature);
5961 
5962     trn = ensSliceGetTranslation(slice);
5963 
5964     ajTrnSeqS(trn, cdna, Psequence);
5965 
5966     ajStrDel(&cdna);
5967 
5968     /*
5969     ** Remove the final stop codon from the mRNA if it is present, so that the
5970     ** resulting peptides do not end with a '*'. If a terminal stop codon is
5971     ** desired, call ensTranscriptFetchSequenceCodingStr and translate it
5972     ** directly.
5973     ** NOTE: This test is simpler and hopefully more efficient than the one
5974     ** in the Perl API, which tests for a termination codon in a
5975     ** codon table-specifc manner and removes the last triplet from the cDNA.
5976     ** NOTE: This implementation does not use the 'complete5' and 'complete3'
5977     ** Sequence Region Attribute objects to modify the translated sequence.
5978     ** The initiator codon should be correctly translated by ajTrnSeqS based
5979     ** on the codon table and the stop codon, if present, is removed above.
5980     */
5981 
5982     if (ajStrGetCharLast(*Psequence) == '*')
5983         ajStrCutEnd(Psequence, 1);
5984 
5985     /* Apply post-translational Sequence Edit objects if enabled. */
5986 
5987     if (transcript->Sequenceedits)
5988     {
5989         ses = ajListNew();
5990 
5991         ensTranslationFetchAllSequenceedits(translation, ses);
5992 
5993         /*
5994         ** Sort Sequence Edit objects in reverse order to avoid the
5995         ** complication of adjusting down-stream Sequence Edit coordinates.
5996         */
5997 
5998         ensListSequenceeditSortStartDescending(ses);
5999 
6000         while (ajListPop(ses, (void **) &se))
6001         {
6002             ensSequenceeditApplyString(se, 0, Psequence);
6003 
6004             ensSequenceeditDel(&se);
6005         }
6006 
6007         ajListFree(&ses);
6008     }
6009 
6010     return ajTrue;
6011 }
6012 
6013 
6014 
6015 
6016 /* @func ensTranscriptFetchSequenceUtrfiveStr *********************************
6017 **
6018 ** Fetch the sequence of the five prime untranslated region of an
6019 ** Ensembl Translation of an Ensembl Transcript as AJAX String.
6020 **
6021 ** The caller is responsible for deleting the AJAX String.
6022 **
6023 ** @cc Bio::EnsEMBL::Transcript::five_prime_utr
6024 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
6025 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
6026 ** @param [wP] Psequence [AjPStr*] AJAX String address
6027 **
6028 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
6029 **
6030 ** @release 6.5.0
6031 ** @@
6032 ******************************************************************************/
6033 
ensTranscriptFetchSequenceUtrfiveStr(EnsPTranscript transcript,EnsPTranslation translation,AjPStr * Psequence)6034 AjBool ensTranscriptFetchSequenceUtrfiveStr(EnsPTranscript transcript,
6035                                             EnsPTranslation translation,
6036                                             AjPStr *Psequence)
6037 {
6038     ajuint trcstart = 0U;
6039 
6040     AjPStr sequence = NULL;
6041 
6042     if (!transcript)
6043         return ajFalse;
6044 
6045     if (!translation)
6046         return ajFalse;
6047 
6048     if (!Psequence)
6049         return ajFalse;
6050 
6051     if (*Psequence)
6052         ajStrAssignClear(Psequence);
6053 
6054     ensTranscriptFetchSequenceTranscriptStr(transcript, &sequence);
6055 
6056     trcstart = ensTranscriptCalculateTranscriptCodingStart(transcript,
6057                                                            translation);
6058 
6059     ajStrAssignSubS(Psequence, sequence, 0, trcstart - 1);
6060 
6061     ajStrDel(&sequence);
6062 
6063     return ajTrue;
6064 }
6065 
6066 
6067 
6068 
6069 /* @func ensTranscriptFetchSequenceUtrthreeStr ********************************
6070 **
6071 ** Fetch the sequence of the three prime untranslated region of an
6072 ** Ensembl Translation of an Ensembl Transcript as AJAX String.
6073 **
6074 ** The caller is responsible for deleting the AJAX String.
6075 **
6076 ** @cc Bio::EnsEMBL::Transcript::three_prime_utr
6077 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
6078 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
6079 ** @param [wP] Psequence [AjPStr*] AJAX String address
6080 **
6081 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
6082 **
6083 ** @release 6.5.0
6084 ** @@
6085 ******************************************************************************/
6086 
ensTranscriptFetchSequenceUtrthreeStr(EnsPTranscript transcript,EnsPTranslation translation,AjPStr * Psequence)6087 AjBool ensTranscriptFetchSequenceUtrthreeStr(EnsPTranscript transcript,
6088                                              EnsPTranslation translation,
6089                                              AjPStr *Psequence)
6090 {
6091     ajuint trcend = 0U;
6092 
6093     AjPStr sequence = NULL;
6094 
6095     if (!transcript)
6096         return ajFalse;
6097 
6098     if (!translation)
6099         return ajFalse;
6100 
6101     if (!Psequence)
6102         return ajFalse;
6103 
6104     if (*Psequence)
6105         ajStrAssignClear(Psequence);
6106 
6107     ensTranscriptFetchSequenceTranscriptStr(transcript, &sequence);
6108 
6109     trcend = ensTranscriptCalculateTranscriptCodingEnd(transcript,
6110                                                        translation);
6111 
6112     ajStrAssignSubS(Psequence, sequence, trcend + 1, ajStrGetLen(sequence));
6113 
6114     ajStrDel(&sequence);
6115 
6116     return ajTrue;
6117 }
6118 
6119 
6120 
6121 
6122 /* @section mapper ************************************************************
6123 **
6124 ** Ensembl Transcript Mapper functions.
6125 **
6126 ** @fdata [EnsPTranscript]
6127 **
6128 ** @cc Bio::EnsEMBL::TranscriptMapper
6129 ** @cc CVS Revision: 1.19
6130 ** @cc CVS Tag: branch-ensembl-68
6131 **
6132 ** @nam3rule Mapper Ensembl Transcript Mapper functions
6133 ** @nam4rule Init          Initialise an Ensembl Transcript Mapper
6134 ** @nam4rule Coding        Map from coding coordinates
6135 ** @nam4rule Slice         Map from Ensembl Slice coordinates
6136 ** @nam5rule Tocoding      Map to coding coordinates
6137 ** @nam5rule Totranscript  Map to transcript coordinates
6138 ** @nam5rule Totranslation Map to translation coordinates
6139 ** @nam4rule Transcript    Map from Ensembl Transcript coordinates
6140 ** @nam5rule Toslice       Map to Ensembl Slice coordinates
6141 ** @nam4rule Translation   Map from Ensembl Translation coordinates
6142 ** @nam5rule Toslice       Map to Ensembl Slice coordinates
6143 **
6144 ** @argrule * transcript [EnsPTranscript] Ensembl Transcript
6145 ** @argrule Init force [AjBool] force re-initialisation
6146 ** @argrule Coding  translation [EnsPTranslation] Ensembl Translation
6147 ** @argrule Tocoding translation [EnsPTranslation] Ensembl Translation
6148 ** @argrule Totranslation translation [EnsPTranslation] Ensembl Translation
6149 ** @argrule Translation translation [EnsPTranslation] Ensembl Translation
6150 ** @argrule Slice start  [ajint] Ensembl Slice start coordinate
6151 ** @argrule Slice end    [ajint] Ensembl Slice end coordinate
6152 ** @argrule Slice strand [ajint] Ensembl Slice strand information
6153 ** @argrule Slice mrs [AjPList] AJAX List of Ensembl Mapper Result objects
6154 ** @argrule CodingToslice start [ajint] Transcript start coordinate
6155 ** @argrule CodingToslice end   [ajint] Transcript end coordinate
6156 ** @argrule CodingToslice mrs   [AjPList] AJAX List of
6157 **                                            Ensembl Mapper Result objects
6158 ** @argrule TranscriptToslice start [ajuint] Transcript start coordinate
6159 ** @argrule TranscriptToslice end   [ajuint] Transcript end coordinate
6160 ** @argrule TranscriptToslice mrs   [AjPList] AJAX List of
6161 **                                            Ensembl Mapper Result objects
6162 ** @argrule TranslationToslice start [ajuint] Translation start coordinate
6163 ** @argrule TranslationToslice end   [ajuint] Translation end coordinate
6164 ** @argrule TranslationToslice mrs   [AjPList] AJAX List of
6165 **                                             Ensembl Mapper Result objects
6166 **
6167 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
6168 **
6169 ** @fcategory new
6170 ******************************************************************************/
6171 
6172 
6173 
6174 
6175 /* @func ensTranscriptMapperCodingToslice *************************************
6176 **
6177 ** Map coding sequence coordinates of an Ensembl Transcript into
6178 ** Slice (genome) coordinates.
6179 **
6180 ** @cc Bio::EnsEMBL::TranscriptMapper::cds2genomic
6181 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
6182 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
6183 ** @param [r] start  [ajint] Ensembl Slice start coordinate
6184 ** @param [r] end    [ajint] Ensembl Slice end coordinate
6185 ** @param [u] mrs    [AjPList] AJAX List of Ensembl Mapper Results
6186 **
6187 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
6188 **
6189 ** @release 6.5.0
6190 ** @@
6191 ******************************************************************************/
6192 
ensTranscriptMapperCodingToslice(EnsPTranscript transcript,EnsPTranslation translation,ajint start,ajint end,AjPList mrs)6193 AjBool ensTranscriptMapperCodingToslice(EnsPTranscript transcript,
6194                                         EnsPTranslation translation,
6195                                         ajint start,
6196                                         ajint end,
6197                                         AjPList mrs)
6198 {
6199     ajuint tcs = 0U;
6200 
6201     if (!transcript)
6202         return ajFalse;
6203 
6204     if (!mrs)
6205         return ajFalse;
6206 
6207     tcs = ensTranscriptCalculateTranscriptCodingStart(transcript, translation);
6208 
6209     /* Move start end into translate cDNA coordinates now. */
6210 
6211     return ensTranscriptMapperTranscriptToslice(transcript,
6212                                                 start + tcs - 1,
6213                                                 end   + tcs - 1,
6214                                                 mrs);
6215 }
6216 
6217 
6218 
6219 
6220 /* @func ensTranscriptMapperInit **********************************************
6221 **
6222 ** Initialise or re-initialise an Ensembl Transcript Mapper of an
6223 ** Ensembl Transcript.
6224 **
6225 ** If the force parameter is set to ajTrue the Ensembl Transcript Mapper will
6226 ** be re-initialised regardless whetner it has been initialised before,
6227 ** i.e. if it already contains Ensembl Mapper Pair objects.
6228 **
6229 ** @cc Bio::EnsEMBL::TranscriptMapper::new
6230 ** @cc Bio::EnsEMBL::TranscriptMapper::_load_mapper
6231 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
6232 ** @param [r] force [AjBool] force re-initialisation
6233 **
6234 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
6235 **
6236 ** @release 6.2.0
6237 ** @@
6238 ** Initialises a Transcript Mapper object which can be used to perform
6239 ** various coordinate transformations relating to Ensembl Transcript objects.
6240 ** Since the Transcript Mapper uses the Transcript state at the time of
6241 ** initialisation to perform the conversions, it must be re-initialised if the
6242 ** underlying Transcript is altered.
6243 ** All 'Genomic' coordinates in the Perl API are in fact relative to the
6244 ** Slice on which the particular Transcript is annotated.
6245 ******************************************************************************/
6246 
ensTranscriptMapperInit(EnsPTranscript transcript,AjBool force)6247 AjBool ensTranscriptMapperInit(EnsPTranscript transcript, AjBool force)
6248 {
6249     ajuint srid = 0U;
6250 
6251     /* Current and previous Feature (Exon) Slice coordinates */
6252 
6253     ajint curftrstart  = 0;
6254     ajint curftrend    = 0;
6255     ajint curftrstrand = 0;
6256 
6257     ajint prvftrstart = 0;
6258     ajint prvftrend   = 0;
6259 
6260     /* Current and previous Transcript (cDNA) coordinates */
6261 
6262     ajuint curtrcstart = 0U;
6263     ajuint curtrcend   = 0U;
6264 
6265     ajuint prvtrcstart  = 0U;
6266     ajuint prvtrcend    = 0U;
6267     ajuint prvtrclength = 0U;
6268 
6269     ajuint editshift = 0U;
6270 
6271     AjIList iter        = NULL;
6272     const AjPList exons = NULL;
6273     AjPList ses         = NULL;
6274 
6275     AjPStr src = NULL;
6276     AjPStr trg = NULL;
6277 
6278     EnsPCoordsystem cs = NULL;
6279 
6280     EnsPExon exon = NULL;
6281 
6282     EnsPFeature feature = NULL;
6283 
6284     EnsPSequenceedit se = NULL;
6285 
6286     EnsPSlice slice = NULL;
6287 
6288     if (ajDebugTest("ensTranscriptMapperInit"))
6289         ajDebug("ensTranscriptMapperInit\n"
6290                 "  transcript %p\n",
6291                 transcript);
6292 
6293     if (!transcript)
6294         return ajFalse;
6295 
6296     if (transcript->ExonCoordMapper)
6297     {
6298         if (force == ajTrue)
6299             ensMapperClear(transcript->ExonCoordMapper);
6300 
6301         if (ensMapperGetCount(transcript->ExonCoordMapper) > 0)
6302             return ajTrue;
6303     }
6304     else
6305     {
6306         src = ajStrNewC("transcript");
6307         trg = ajStrNewC("slice");
6308 
6309         cs = ensSliceGetCoordsystemObject(
6310             ensFeatureGetSlice(transcript->Feature));
6311 
6312         transcript->ExonCoordMapper = ensMapperNewIni(src, trg, cs, cs);
6313 
6314         ajStrDel(&src);
6315         ajStrDel(&trg);
6316     }
6317 
6318     /* Get the Sequence Region Identifier for this Transcript. */
6319 
6320     feature = ensTranscriptGetFeature(transcript);
6321 
6322     slice = ensFeatureGetSlice(feature);
6323 
6324     srid = ensSliceGetSeqregionIdentifier(slice);
6325 
6326     /* Get all Ensembl Exon objects of this Ensembl Transcript. */
6327 
6328     exons = ensTranscriptLoadExons(transcript);
6329 
6330     /* Load Mapper Bio::EnsEMBL::TranscriptMapper::_load_mapper */
6331 
6332     ses = ajListNew();
6333 
6334     if (transcript->Sequenceedits)
6335     {
6336         ensTranscriptFetchAllSequenceedits(transcript, ses);
6337 
6338         ensListSequenceeditSortStartAscending(ses);
6339     }
6340 
6341     iter = ajListIterNewread(exons);
6342 
6343     while (!ajListIterDone(iter))
6344     {
6345         exon = (EnsPExon) ajListIterGet(iter);
6346 
6347         feature = ensExonGetFeature(exon);
6348 
6349         curftrstart  = ensFeatureGetStart(feature);
6350         curftrend    = ensFeatureGetEnd(feature);
6351         curftrstrand = ensFeatureGetStrand(feature);
6352 
6353         curtrcstart = curtrcend   + 1;
6354         curtrcend   = curtrcstart + ensFeatureCalculateLength(feature) - 1;
6355 
6356         /*
6357         ** Add deletions and insertions into Mapper Pair objects when
6358         ** Sequence Edit objects are applied and ignore mismatches,
6359         ** i.e. treat them as matches.
6360         */
6361 
6362         if (transcript->Sequenceedits)
6363         {
6364             while (ajListPeekFirst(ses, (void **) &se) &&
6365                    (ensSequenceeditGetStart(se) + editshift <= curtrcend))
6366             {
6367                 if (ensSequenceeditCalculateDifference(se))
6368                 {
6369                     /*
6370                     ** Break the Mapper Pair into two parts, finish the
6371                     ** first Mapper Pair just before the Sequence Edit.
6372                     */
6373 
6374                     prvtrcend    = ensSequenceeditGetStart(se) + editshift - 1;
6375                     prvtrcstart  = curtrcstart;
6376                     prvtrclength = prvtrcend - prvtrcstart + 1;
6377 
6378                     if (curftrstrand >= 0)
6379                     {
6380                         prvftrstart = curftrstart;
6381                         prvftrend   = curftrstart + prvtrclength - 1;
6382                     }
6383                     else
6384                     {
6385                         prvftrstart = curftrend - prvtrclength + 1;
6386                         prvftrend   = curftrend;
6387                     }
6388 
6389                     /*
6390                     ** Only create a Mapper Pair if this is not a boundary
6391                     ** case. Set the Ensembl Transcript identifier as source
6392                     ** object identifier and the Sequence Region identifier
6393                     ** of the Slice on which this Transcript is annotated
6394                     ** as the target object identifier.
6395                     */
6396 
6397                     if (prvtrclength > 0)
6398                         ensMapperAddCoordinates(transcript->ExonCoordMapper,
6399                                                 transcript->Identifier,
6400                                                 prvtrcstart,
6401                                                 prvtrcend,
6402                                                 curftrstrand,
6403                                                 srid,
6404                                                 prvftrstart,
6405                                                 prvftrend);
6406 
6407                     curtrcstart = prvtrcend + 1;
6408 
6409                     if (curftrstrand >= 0)
6410                         curftrstart = prvftrend   + 1;
6411                     else
6412                         curftrend   = prvftrstart - 1;
6413 
6414                     curtrcend += ensSequenceeditCalculateDifference(se);
6415 
6416                     if (ensSequenceeditCalculateDifference(se) >= 0)
6417                     {
6418                         /*
6419                         ** Positive length difference means insertion into
6420                         ** Transcript.
6421                         ** Shift Transcript coordinates along.
6422                         */
6423 
6424                         curtrcstart += ensSequenceeditCalculateDifference(se);
6425                     }
6426                     else
6427                     {
6428                         /*
6429                         ** Negative length difference means deletion from
6430                         ** Transcript and insertion into Slice.
6431                         ** Shift Slice coordinates along.
6432                         */
6433 
6434                         if (curftrstrand >= 0)
6435                             curftrstart
6436                                 -= ensSequenceeditCalculateDifference(se);
6437                         else
6438                             curftrend
6439                                 += ensSequenceeditCalculateDifference(se);
6440                     }
6441 
6442                     editshift += ensSequenceeditCalculateDifference(se);
6443                 }
6444 
6445                 /* At this stage remove the Sequence Edit from the List. */
6446 
6447                 ajListPop(ses, (void **) &se);
6448 
6449                 ensSequenceeditDel(&se);
6450             }
6451         }
6452 
6453         /*
6454         ** Set the Transcript identifier as the source object identifier and
6455         ** the Sequence Region identifier of the Slice on which this Transcript
6456         ** is annotated as the target object identifier.
6457         */
6458 
6459         if ((curtrcend - curtrcstart + 1) > 0)
6460             ensMapperAddCoordinates(transcript->ExonCoordMapper,
6461                                     transcript->Identifier,
6462                                     curtrcstart,
6463                                     curtrcend,
6464                                     curftrstrand,
6465                                     srid,
6466                                     curftrstart,
6467                                     curftrend);
6468     }
6469 
6470     ajListIterDel(&iter);
6471 
6472     /*
6473     ** Delete any remaining Sequence Edit objects before deleting the
6474     ** AJAX List.
6475     */
6476 
6477     while (ajListPop(ses, (void **) &se))
6478         ensSequenceeditDel(&se);
6479 
6480     ajListFree(&ses);
6481 
6482     return ajTrue;
6483 }
6484 
6485 
6486 
6487 
6488 /* @func ensTranscriptMapperSliceTocoding *************************************
6489 **
6490 ** Map Slice (genome) coordinates of an Ensembl Transcript into coding
6491 ** sequence coordinates.
6492 **
6493 ** @cc Bio::EnsEMBL::TranscriptMapper::genomic2cds
6494 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
6495 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
6496 ** @param [r] start  [ajint] Ensembl Slice start coordinate
6497 ** @param [r] end    [ajint] Ensembl Slice end coordinate
6498 ** @param [r] strand [ajint] Ensembl Slice strand information
6499 ** @param [u] mrs    [AjPList] AJAX List of Ensembl Mapper Results
6500 **
6501 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
6502 **
6503 ** @release 6.4.0
6504 ** @@
6505 ******************************************************************************/
6506 
ensTranscriptMapperSliceTocoding(EnsPTranscript transcript,EnsPTranslation translation,ajint start,ajint end,ajint strand,AjPList mrs)6507 AjBool ensTranscriptMapperSliceTocoding(EnsPTranscript transcript,
6508                                         EnsPTranslation translation,
6509                                         ajint start,
6510                                         ajint end,
6511                                         ajint strand,
6512                                         AjPList mrs)
6513 {
6514     ajuint cdsstart = 0U;
6515     ajuint cdsend   = 0U;
6516     ajuint tcstart  = 0U;
6517     ajuint tcend    = 0U;
6518 
6519     AjPList result = NULL;
6520 
6521     EnsPMapperresult mr     = NULL;
6522     EnsPMapperresult gcmr   = NULL;
6523     EnsPMapperresult endgap = NULL;
6524 
6525     if (!transcript)
6526         return ajFalse;
6527 
6528     if (!mrs)
6529     {
6530         ajDebug("ensTranscriptMapperSliceTocoding "
6531                 "requires an AJAX List of Ensembl Mapper Results.\n");
6532 
6533         return ajFalse;
6534     }
6535 
6536     if (start > (end + 1))
6537         ajFatal("ensTranscriptMapperSliceTocoding requires start %d to be "
6538                 "less than end %d + 1.\n", start, end);
6539 
6540     /*
6541     ** For non-coding Ensembl Transcript objects return an
6542     ** Ensembl Mapper Result of type ensEMapperresultTypeGap,
6543     ** as there is no coding sequence.
6544     */
6545 
6546     if (!translation)
6547     {
6548         mr = ensMapperresultNewGap(start, end, 0);
6549 
6550         ajListPushAppend(mrs, (void *) mr);
6551 
6552         return ajTrue;
6553     }
6554 
6555     tcstart = ensTranscriptCalculateTranscriptCodingStart(transcript,
6556                                                           translation);
6557 
6558     tcend   = ensTranscriptCalculateTranscriptCodingEnd(transcript,
6559                                                         translation);
6560 
6561     result = ajListNew();
6562 
6563     ensTranscriptMapperSliceTotranscript(transcript,
6564                                          start,
6565                                          end,
6566                                          strand,
6567                                          result);
6568 
6569     while (ajListPop(result, (void **) &gcmr))
6570     {
6571         if (ensMapperresultGetType(gcmr) == ensEMapperresultTypeGap)
6572             ajListPushAppend(mrs, (void *) gcmr);
6573         else
6574         {
6575             if ((ensMapperresultGetCoordinateStrand(gcmr) < 0) ||
6576                 (ensMapperresultGetCoordinateEnd(gcmr)    < (ajint) tcstart) ||
6577                 (ensMapperresultGetCoordinateStart(gcmr)  > (ajint) tcend))
6578             {
6579                 /* All gap - does not map to peptide. */
6580 
6581                 mr = ensMapperresultNewGap(start, end, 0);
6582 
6583                 ajListPushAppend(mrs, (void *) mr);
6584             }
6585             else
6586             {
6587                 /* We know area is at least partially overlapping CDS. */
6588 
6589                 cdsstart = ensMapperresultGetCoordinateStart(gcmr)
6590                     - tcstart + 1;
6591 
6592                 cdsend   = ensMapperresultGetCoordinateEnd(gcmr)
6593                     - tcstart + 1;
6594 
6595                 if (ensMapperresultGetCoordinateStart(gcmr) < (ajint) tcstart)
6596                 {
6597                     /* Start coordinate is in the 5' UTR. */
6598 
6599                     mr = ensMapperresultNewGap(
6600                         ensMapperresultGetCoordinateStart(gcmr),
6601                         tcstart - 1,
6602                         0);
6603 
6604                     ajListPushAppend(mrs, (void *) mr);
6605 
6606                     /* Start is now relative to start of CDS. */
6607 
6608                     cdsstart = 1;
6609                 }
6610 
6611                 endgap = NULL;
6612 
6613                 if (ensMapperresultGetCoordinateEnd(gcmr) > (ajint) tcend)
6614                 {
6615                     /* End coordinate is in the 3' UTR. */
6616 
6617                     endgap = ensMapperresultNewGap(
6618                         tcend + 1,
6619                         ensMapperresultGetCoordinateEnd(gcmr),
6620                         0);
6621 
6622                     /* Adjust end coordinate relative to CDS start. */
6623 
6624                     cdsend = tcend - tcstart + 1;
6625                 }
6626 
6627                 /*
6628                 ** Start and end are now entirely in CDS and relative
6629                 ** to CDS start.
6630                 */
6631 
6632                 mr = ensMapperresultNewCoordinate(
6633                     ensMapperresultGetObjectidentifier(gcmr),
6634                     cdsstart,
6635                     cdsend,
6636                     ensMapperresultGetCoordinateStrand(gcmr),
6637                     ensMapperresultGetCoordsystem(gcmr),
6638                     0);
6639 
6640                 ajListPushAppend(mrs, (void *) mr);
6641 
6642                 if (endgap)
6643                     ajListPushAppend(mrs, (void *) endgap);
6644             }
6645 
6646             ensMapperresultDel(&gcmr);
6647         }
6648     }
6649 
6650     ajListFree(&result);
6651 
6652     return ajTrue;
6653 }
6654 
6655 
6656 
6657 
6658 /* @func ensTranscriptMapperSliceTotranscript *********************************
6659 **
6660 ** Map Slice (genome) coordinates of an Ensembl Transcript into
6661 ** Transcript (cDNA) coordinates.
6662 **
6663 ** @cc Bio::EnsEMBL::TranscriptMapper::genomic2cdna
6664 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
6665 ** @param [r] start [ajint] Ensembl Slice start coordinate
6666 ** @param [r] end [ajint] Ensembl Slice end coordinate
6667 ** @param [r] strand [ajint] Ensembl Slice strand information
6668 ** @param [u] mrs [AjPList] AJAX List of Ensembl Mapper Results
6669 **
6670 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
6671 **
6672 ** @release 6.4.0
6673 ** @@
6674 ** Converts Slice coordinates to Transcript coordinates. The return value is an
6675 ** AJAX List of Mapper Result coordinates and gaps. Gaps represent intronic
6676 ** or upstream/downstream regions which do not comprise this transcript's
6677 ** cDNA. Mapper Result Coordinate objects represent Slice regions which map
6678 ** to Ensembl Exon objects (UTRs included).
6679 ******************************************************************************/
6680 
ensTranscriptMapperSliceTotranscript(EnsPTranscript transcript,ajint start,ajint end,ajint strand,AjPList mrs)6681 AjBool ensTranscriptMapperSliceTotranscript(EnsPTranscript transcript,
6682                                             ajint start,
6683                                             ajint end,
6684                                             ajint strand,
6685                                             AjPList mrs)
6686 {
6687     ajuint srid = 0U;
6688 
6689     AjPStr src = NULL;
6690 
6691     EnsPSlice slice = NULL;
6692 
6693     if (!transcript)
6694         return ajFalse;
6695 
6696     if (!mrs)
6697     {
6698         ajDebug("ensTranscriptMapperSliceTotranscript "
6699                 "requires an AJAX List of Ensembl Mapper Results.\n");
6700 
6701         return ajFalse;
6702     }
6703 
6704     ensTranscriptMapperInit(transcript, ajFalse);
6705 
6706     slice = ensFeatureGetSlice(transcript->Feature);
6707 
6708     srid = ensSliceGetSeqregionIdentifier(slice);
6709 
6710     src = ajStrNewC("slice");
6711 
6712     ensMapperMap(transcript->ExonCoordMapper,
6713                  srid,
6714                  start,
6715                  end,
6716                  strand,
6717                  src,
6718                  mrs);
6719 
6720     ajStrDel(&src);
6721 
6722     return ajTrue;
6723 }
6724 
6725 
6726 
6727 
6728 /* @func ensTranscriptMapperSliceTotranslation ********************************
6729 **
6730 ** Map Slice (genome) coordinates of an Ensembl Transcript into
6731 ** Translation (peptide) coordinates.
6732 **
6733 ** @cc Bio::EnsEMBL::TranscriptMapper::genomic2pep
6734 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
6735 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
6736 ** @param [r] start [ajint] Ensembl Slice start coordinate
6737 ** @param [r] end [ajint] Ensembl Slice end coordinate
6738 ** @param [r] strand [ajint] Ensembl Slice strand information
6739 ** @param [u] mrs [AjPList] AJAX List of Ensembl Mapper Results
6740 **
6741 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
6742 **
6743 ** @release 6.4.0
6744 ** @@
6745 ******************************************************************************/
6746 
ensTranscriptMapperSliceTotranslation(EnsPTranscript transcript,EnsPTranslation translation,ajint start,ajint end,ajint strand,AjPList mrs)6747 AjBool ensTranscriptMapperSliceTotranslation(EnsPTranscript transcript,
6748                                              EnsPTranslation translation,
6749                                              ajint start,
6750                                              ajint end,
6751                                              ajint strand,
6752                                              AjPList mrs)
6753 {
6754     ajint tlstart = 0;
6755     ajint tlend   = 0;
6756     ajint shift   = 0;
6757 
6758     AjPList result = NULL;
6759 
6760     EnsPMapperresult mr   = NULL;
6761     EnsPMapperresult gcmr = NULL;
6762 
6763     if (!transcript)
6764         return ajFalse;
6765 
6766     if (!mrs)
6767     {
6768         ajDebug("ensTranscriptMapperSliceTotranslation "
6769                 "requires an AJAX List of Ensembl Mapper Results.\n");
6770 
6771         return ajFalse;
6772     }
6773 
6774     result = ajListNew();
6775 
6776     ensTranscriptMapperSliceTocoding(transcript,
6777                                      translation,
6778                                      start,
6779                                      end,
6780                                      strand,
6781                                      result);
6782 
6783     /* Take possible N padding at beginning of CDS. */
6784 
6785     shift = ensTranscriptCalculatePhaseStart(transcript);
6786     shift = (shift >= 0) ? shift : 0;
6787 
6788     while (ajListPop(result, (void **) &gcmr))
6789     {
6790         if (ensMapperresultGetType(gcmr) == ensEMapperresultTypeGap)
6791             ajListPushAppend(mrs, (void *) gcmr);
6792         else
6793         {
6794             /*
6795             ** Start and end coordinates are now entirely in CDS and
6796             ** relative to CDS start.
6797             ** Convert to peptide coordinates.
6798             */
6799 
6800             tlstart = (ensMapperresultGetCoordinateStart(gcmr) + shift + 2)
6801                 / 3;
6802 
6803             tlend =   (ensMapperresultGetCoordinateEnd(gcmr)   + shift + 2)
6804                 / 3;
6805 
6806             mr = ensMapperresultNewCoordinate(
6807                 ensMapperresultGetObjectidentifier(gcmr),
6808                 tlstart,
6809                 tlend,
6810                 ensMapperresultGetCoordinateStrand(gcmr),
6811                 ensMapperresultGetCoordsystem(gcmr),
6812                 0);
6813 
6814             ajListPushAppend(mrs, (void *) mr);
6815 
6816             ensMapperresultDel(&gcmr);
6817         }
6818     }
6819 
6820     ajListFree(&result);
6821 
6822     return ajTrue;
6823 }
6824 
6825 
6826 
6827 
6828 /* @func ensTranscriptMapperTranscriptToslice *********************************
6829 **
6830 ** Map Transcript (cDNA) coordinates of an Ensembl Transcript into Slice
6831 ** (genome) coordinates.
6832 **
6833 ** @cc Bio::EnsEMBL::TranscriptMapper::cdna2genomic
6834 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
6835 ** @param [r] start [ajuint] Ensembl Transcript start coordinate
6836 ** @param [r] end [ajuint] Ensembl Transcript end coordinate
6837 ** @param [u] mrs [AjPList] AJAX List of Ensembl Mapper Results
6838 **
6839 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
6840 **
6841 ** @release 6.4.0
6842 ** @@
6843 ******************************************************************************/
6844 
ensTranscriptMapperTranscriptToslice(EnsPTranscript transcript,ajuint start,ajuint end,AjPList mrs)6845 AjBool ensTranscriptMapperTranscriptToslice(EnsPTranscript transcript,
6846                                             ajuint start,
6847                                             ajuint end,
6848                                             AjPList mrs)
6849 {
6850     AjPStr src = NULL;
6851 
6852     if (!transcript)
6853         return ajFalse;
6854 
6855     if (!mrs)
6856     {
6857         ajDebug("ensTranscriptMapperTranscriptToslice "
6858                 "requires an AJAX List of Ensembl Mapper Results.\n");
6859 
6860         return ajFalse;
6861     }
6862 
6863     ensTranscriptMapperInit(transcript, ajFalse);
6864 
6865     src = ajStrNewC("transcript");
6866 
6867     ensMapperMap(transcript->ExonCoordMapper,
6868                  transcript->Identifier,
6869                  start,
6870                  end,
6871                  1,
6872                  src,
6873                  mrs);
6874 
6875     ajStrDel(&src);
6876 
6877     return ajTrue;
6878 }
6879 
6880 
6881 
6882 
6883 /* @func ensTranscriptMapperTranslationToslice ********************************
6884 **
6885 ** Map Translation (Peptide) coordinates of an Ensembl Transcript into Slice
6886 ** (genome) coordinates.
6887 **
6888 ** @cc Bio::EnsEMBL::TranscriptMapper::pep2genomic
6889 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
6890 ** @param [uN] translation [EnsPTranslation] Ensembl Translation
6891 ** @param [r] start [ajuint] Ensembl Translation start coordinate
6892 ** @param [r] end [ajuint] Ensembl Translation end coordinate
6893 ** @param [u] mrs [AjPList] AJAX List of Ensembl Mapper Results
6894 **
6895 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
6896 **
6897 ** @release 6.4.0
6898 ** @@
6899 ** Converts Translation coordinates into Slice coordinates. The Mapper Result
6900 ** Coordinates returned are relative to the same slice that the Transcript
6901 ** used to initialise this Transcript Mapper was on.
6902 ******************************************************************************/
6903 
ensTranscriptMapperTranslationToslice(EnsPTranscript transcript,EnsPTranslation translation,ajuint start,ajuint end,AjPList mrs)6904 AjBool ensTranscriptMapperTranslationToslice(EnsPTranscript transcript,
6905                                              EnsPTranslation translation,
6906                                              ajuint start,
6907                                              ajuint end,
6908                                              AjPList mrs)
6909 {
6910     ajint tcstart = 0;
6911     ajint shift   = 0;
6912 
6913     if (!transcript)
6914         return ajFalse;
6915 
6916     if (!mrs)
6917     {
6918         ajDebug("ensTranscriptMapperTranslationToslice "
6919                 "requires an AJAX List of Ensembl Mapper Results.\n");
6920 
6921         return ajFalse;
6922     }
6923 
6924     tcstart = ensTranscriptCalculateTranscriptCodingStart(transcript,
6925                                                           translation);
6926 
6927     /* Take possible N-padding at the beginning of the CDS into account. */
6928 
6929     shift = ensTranscriptCalculatePhaseStart(transcript);
6930     shift = (shift >= 0) ? shift : 0;
6931 
6932     /* Move start and end into cDNA coordinates. */
6933 
6934     start = 3 * start - 2 + (tcstart - 1) - shift;
6935     end   = 3 * end       + (tcstart - 1) - shift;
6936 
6937     return ensTranscriptMapperTranscriptToslice(transcript, start, end, mrs);
6938 }
6939 
6940 
6941 
6942 
6943 /* @datasection [EnsETranscriptStatus] Ensembl Transcript Status **************
6944 **
6945 ** @nam2rule Transcript Functions for manipulating
6946 ** Ensembl Transcript objects
6947 ** @nam3rule TranscriptStatus Functions for manipulating
6948 ** Ensembl Transcript Status enumerations
6949 **
6950 ******************************************************************************/
6951 
6952 
6953 
6954 
6955 /* @section Misc **************************************************************
6956 **
6957 ** Functions for returning an Ensembl Transcript Status enumeration.
6958 **
6959 ** @fdata [EnsETranscriptStatus]
6960 **
6961 ** @nam4rule From Ensembl Transcript Status query
6962 ** @nam5rule Str  AJAX String object query
6963 **
6964 ** @argrule  Str  status  [const AjPStr] Status string
6965 **
6966 ** @valrule * [EnsETranscriptStatus]
6967 ** Ensembl Transcript Status enumeration or ensETranscriptStatusNULL
6968 **
6969 ** @fcategory misc
6970 ******************************************************************************/
6971 
6972 
6973 
6974 
6975 /* @func ensTranscriptStatusFromStr *******************************************
6976 **
6977 ** Return an Ensembl Transcript Status enumeration from an AJAX String.
6978 **
6979 ** @param [r] status [const AjPStr] Status string
6980 **
6981 ** @return [EnsETranscriptStatus]
6982 ** Ensembl Transcript Status enumeration or ensETranscriptStatusNULL
6983 **
6984 ** @release 6.2.0
6985 ** @@
6986 ******************************************************************************/
6987 
ensTranscriptStatusFromStr(const AjPStr status)6988 EnsETranscriptStatus ensTranscriptStatusFromStr(const AjPStr status)
6989 {
6990     register EnsETranscriptStatus i = ensETranscriptStatusNULL;
6991 
6992     EnsETranscriptStatus estatus = ensETranscriptStatusNULL;
6993 
6994     for (i = ensETranscriptStatusNULL;
6995          transcriptKStatus[i];
6996          i++)
6997         if (ajStrMatchC(status, transcriptKStatus[i]))
6998             estatus = i;
6999 
7000     if (!estatus)
7001         ajDebug("ensTranscriptStatusFromStr encountered "
7002                 "unexpected string '%S'.\n", status);
7003 
7004     return estatus;
7005 }
7006 
7007 
7008 
7009 
7010 /* @section Cast **************************************************************
7011 **
7012 ** Functions for returning attributes of an
7013 ** Ensembl Transcript Status enumeration.
7014 **
7015 ** @fdata [EnsETranscriptStatus]
7016 **
7017 ** @nam4rule To   Return Ensembl Transcript Status enumeration
7018 ** @nam5rule Char Return C character string value
7019 **
7020 ** @argrule To status [EnsETranscriptStatus]
7021 ** Ensembl Transcript Status enumeration
7022 **
7023 ** @valrule Char [const char*] Status
7024 **
7025 ** @fcategory cast
7026 ******************************************************************************/
7027 
7028 
7029 
7030 
7031 /* @func ensTranscriptStatusToChar ********************************************
7032 **
7033 ** Cast an Ensembl Transcript Status enumeration into a C-type (char *) string.
7034 **
7035 ** @param [u] status [EnsETranscriptStatus]
7036 ** Ensembl Transcript Status enumeration
7037 **
7038 ** @return [const char*]
7039 ** Ensembl Transcript status C-type (char *) string
7040 **
7041 ** @release 6.2.0
7042 ** @@
7043 ******************************************************************************/
7044 
ensTranscriptStatusToChar(EnsETranscriptStatus status)7045 const char* ensTranscriptStatusToChar(EnsETranscriptStatus status)
7046 {
7047     register EnsETranscriptStatus i = ensETranscriptStatusNULL;
7048 
7049     for (i = ensETranscriptStatusNULL;
7050          transcriptKStatus[i] && (i < status);
7051          i++);
7052 
7053     if (!transcriptKStatus[i])
7054         ajDebug("ensTranscriptStatusToChar "
7055                 "encountered an out of boundary error on "
7056                 "Ensembl Transcript Status "
7057                 "enumeration %d.\n",
7058                 status);
7059 
7060     return transcriptKStatus[i];
7061 }
7062 
7063 
7064 
7065 
7066 /* @datasection [AjPList] AJAX List *******************************************
7067 **
7068 ** @nam2rule List Functions for manipulating AJAX List objects
7069 **
7070 ******************************************************************************/
7071 
7072 
7073 
7074 
7075 /* @funcstatic listTranscriptCompareEndAscending ******************************
7076 **
7077 ** AJAX List of Ensembl Transcript objects comparison function to sort by
7078 ** Ensembl Feature end member in ascending order.
7079 **
7080 ** @param [r] item1 [const void*] Ensembl Transcript address 1
7081 ** @param [r] item2 [const void*] Ensembl Transcript address 2
7082 ** @see ajListSort
7083 **
7084 ** @return [int] The comparison function returns an integer less than,
7085 **               equal to, or greater than zero if the first argument is
7086 **               considered to be respectively less than, equal to, or
7087 **               greater than the second.
7088 **
7089 ** @release 6.4.0
7090 ** @@
7091 ******************************************************************************/
7092 
listTranscriptCompareEndAscending(const void * item1,const void * item2)7093 static int listTranscriptCompareEndAscending(
7094     const void *item1,
7095     const void *item2)
7096 {
7097     EnsPTranscript transcript1 = *(EnsOTranscript *const *) item1;
7098     EnsPTranscript transcript2 = *(EnsOTranscript *const *) item2;
7099 
7100 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
7101     if (ajDebugTest("listTranscriptCompareEndAscending"))
7102         ajDebug("listTranscriptCompareEndAscending\n"
7103                 "  transcript1 %p\n"
7104                 "  transcript2 %p\n",
7105                 transcript1,
7106                 transcript2);
7107 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
7108 
7109     /* Sort empty values towards the end of the AJAX List. */
7110 
7111     if (transcript1 && (!transcript2))
7112         return -1;
7113 
7114     if ((!transcript1) && (!transcript2))
7115         return 0;
7116 
7117     if ((!transcript1) && transcript2)
7118         return +1;
7119 
7120     return ensFeatureCompareEndAscending(transcript1->Feature,
7121                                          transcript2->Feature);
7122 }
7123 
7124 
7125 
7126 
7127 /* @funcstatic listTranscriptCompareEndDescending *****************************
7128 **
7129 ** AJAX List of Ensembl Transcript objects comparison function to sort by
7130 ** Ensembl Feature end member in descending order.
7131 **
7132 ** @param [r] item1 [const void*] Ensembl Transcript address 1
7133 ** @param [r] item2 [const void*] Ensembl Transcript address 2
7134 ** @see ajListSort
7135 **
7136 ** @return [int] The comparison function returns an integer less than,
7137 **               equal to, or greater than zero if the first argument is
7138 **               considered to be respectively less than, equal to, or
7139 **               greater than the second.
7140 **
7141 ** @release 6.4.0
7142 ** @@
7143 ******************************************************************************/
7144 
listTranscriptCompareEndDescending(const void * item1,const void * item2)7145 static int listTranscriptCompareEndDescending(
7146     const void *item1,
7147     const void *item2)
7148 {
7149     EnsPTranscript transcript1 = *(EnsOTranscript *const *) item1;
7150     EnsPTranscript transcript2 = *(EnsOTranscript *const *) item2;
7151 
7152 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
7153     if (ajDebugTest("listTranscriptCompareEndDescending"))
7154         ajDebug("listTranscriptCompareEndDescending\n"
7155                 "  transcript1 %p\n"
7156                 "  transcript2 %p\n",
7157                 transcript1,
7158                 transcript2);
7159 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
7160 
7161     /* Sort empty values towards the end of the AJAX List. */
7162 
7163     if (transcript1 && (!transcript2))
7164         return -1;
7165 
7166     if ((!transcript1) && (!transcript2))
7167         return 0;
7168 
7169     if ((!transcript1) && transcript2)
7170         return +1;
7171 
7172     return ensFeatureCompareEndDescending(transcript1->Feature,
7173                                           transcript2->Feature);
7174 }
7175 
7176 
7177 
7178 
7179 /* @funcstatic listTranscriptCompareIdentifierAscending ***********************
7180 **
7181 ** AJAX List of Ensembl Transcript objects comparison function to sort by
7182 ** identifier in ascending order.
7183 **
7184 ** @param [r] item1 [const void*] Ensembl Transcript address 1
7185 ** @param [r] item2 [const void*] Ensembl Transcript address 2
7186 ** @see ajListSort
7187 **
7188 ** @return [int] The comparison function returns an integer less than,
7189 **               equal to, or greater than zero if the first argument is
7190 **               considered to be respectively less than, equal to, or
7191 **               greater than the second.
7192 **
7193 ** @release 6.4.0
7194 ** @@
7195 ******************************************************************************/
7196 
listTranscriptCompareIdentifierAscending(const void * item1,const void * item2)7197 static int listTranscriptCompareIdentifierAscending(
7198     const void *item1,
7199     const void *item2)
7200 {
7201     EnsPTranscript transcript1 = *(EnsOTranscript *const *) item1;
7202     EnsPTranscript transcript2 = *(EnsOTranscript *const *) item2;
7203 
7204 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
7205     if (ajDebugTest("listTranscriptCompareIdentifierAscending"))
7206         ajDebug("listTranscriptCompareIdentifierAscending\n"
7207                 "  transcript1 %p\n"
7208                 "  transcript2 %p\n",
7209                 transcript1,
7210                 transcript2);
7211 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
7212 
7213     /* Sort empty values towards the end of the AJAX List. */
7214 
7215     if (transcript1 && (!transcript2))
7216         return -1;
7217 
7218     if ((!transcript1) && (!transcript2))
7219         return 0;
7220 
7221     if ((!transcript1) && transcript2)
7222         return +1;
7223 
7224     if (transcript1->Identifier < transcript2->Identifier)
7225         return -1;
7226 
7227     if (transcript1->Identifier > transcript2->Identifier)
7228         return +1;
7229 
7230     return 0;
7231 }
7232 
7233 
7234 
7235 
7236 /* @funcstatic listTranscriptCompareStartAscending ****************************
7237 **
7238 ** AJAX List of Ensembl Transcript objects comparison function to sort by
7239 ** Ensembl Feature start member in ascending order.
7240 **
7241 ** @param [r] item1 [const void*] Ensembl Transcript address 1
7242 ** @param [r] item2 [const void*] Ensembl Transcript address 2
7243 ** @see ajListSort
7244 **
7245 ** @return [int] The comparison function returns an integer less than,
7246 **               equal to, or greater than zero if the first argument is
7247 **               considered to be respectively less than, equal to, or
7248 **               greater than the second.
7249 **
7250 ** @release 6.4.0
7251 ** @@
7252 ******************************************************************************/
7253 
listTranscriptCompareStartAscending(const void * item1,const void * item2)7254 static int listTranscriptCompareStartAscending(
7255     const void *item1,
7256     const void *item2)
7257 {
7258     EnsPTranscript transcript1 = *(EnsOTranscript *const *) item1;
7259     EnsPTranscript transcript2 = *(EnsOTranscript *const *) item2;
7260 
7261 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
7262     if (ajDebugTest("listTranscriptCompareStartAscending"))
7263         ajDebug("listTranscriptCompareStartAscending\n"
7264                 "  transcript1 %p\n"
7265                 "  transcript2 %p\n",
7266                 transcript1,
7267                 transcript2);
7268 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
7269 
7270     /* Sort empty values towards the end of the AJAX List. */
7271 
7272     if (transcript1 && (!transcript2))
7273         return -1;
7274 
7275     if ((!transcript1) && (!transcript2))
7276         return 0;
7277 
7278     if ((!transcript1) && transcript2)
7279         return +1;
7280 
7281     return ensFeatureCompareStartAscending(transcript1->Feature,
7282                                            transcript2->Feature);
7283 }
7284 
7285 
7286 
7287 
7288 /* @funcstatic listTranscriptCompareStartDescending ***************************
7289 **
7290 ** AJAX List of Ensembl Transcript objects comparison function to sort by
7291 ** Ensembl Feature start member in descending order.
7292 **
7293 ** @param [r] item1 [const void*] Ensembl Transcript address 1
7294 ** @param [r] item2 [const void*] Ensembl Transcript address 2
7295 ** @see ajListSort
7296 **
7297 ** @return [int] The comparison function returns an integer less than,
7298 **               equal to, or greater than zero if the first argument is
7299 **               considered to be respectively less than, equal to, or
7300 **               greater than the second.
7301 **
7302 ** @release 6.4.0
7303 ** @@
7304 ******************************************************************************/
7305 
listTranscriptCompareStartDescending(const void * item1,const void * item2)7306 static int listTranscriptCompareStartDescending(
7307     const void *item1,
7308     const void *item2)
7309 {
7310     EnsPTranscript transcript1 = *(EnsOTranscript *const *) item1;
7311     EnsPTranscript transcript2 = *(EnsOTranscript *const *) item2;
7312 
7313 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
7314     if (ajDebugTest("listTranscriptCompareStartDescending"))
7315         ajDebug("listTranscriptCompareStartDescending\n"
7316                 "  transcript1 %p\n"
7317                 "  transcript2 %p\n",
7318                 transcript1,
7319                 transcript2);
7320 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
7321 
7322     /* Sort empty values towards the end of the AJAX List. */
7323 
7324     if (transcript1 && (!transcript2))
7325         return -1;
7326 
7327     if ((!transcript1) && (!transcript2))
7328         return 0;
7329 
7330     if ((!transcript1) && transcript2)
7331         return +1;
7332 
7333     return ensFeatureCompareStartDescending(transcript1->Feature,
7334                                             transcript2->Feature);
7335 }
7336 
7337 
7338 
7339 
7340 /* @section list **************************************************************
7341 **
7342 ** Functions for manipulating AJAX List objects.
7343 **
7344 ** @fdata [AjPList]
7345 **
7346 ** @nam3rule Transcript Functions for manipulating AJAX List objects of
7347 ** Ensembl Transcript objects
7348 ** @nam4rule Sort       Sort functions
7349 ** @nam5rule End        Sort by Ensembl Feature end member
7350 ** @nam5rule Identifier Sort by identifier member
7351 ** @nam5rule Start      Sort by Ensembl Feature start member
7352 ** @nam6rule Ascending  Sort in ascending order
7353 ** @nam6rule Descending Sort in descending order
7354 **
7355 ** @argrule * transcripts [AjPList]
7356 ** AJAX List of Ensembl Transcript objects
7357 **
7358 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
7359 **
7360 ** @fcategory misc
7361 ******************************************************************************/
7362 
7363 
7364 
7365 
7366 /* @func ensListTranscriptSortEndAscending ************************************
7367 **
7368 ** Sort an AJAX List of Ensembl Transcript objects by their
7369 ** Ensembl Feature end member in ascending order.
7370 **
7371 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
7372 **
7373 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
7374 **
7375 ** @release 6.4.0
7376 ** @@
7377 ******************************************************************************/
7378 
ensListTranscriptSortEndAscending(AjPList transcripts)7379 AjBool ensListTranscriptSortEndAscending(AjPList transcripts)
7380 {
7381     if (!transcripts)
7382         return ajFalse;
7383 
7384     ajListSortTwoThree(transcripts,
7385                        &listTranscriptCompareEndAscending,
7386                        &listTranscriptCompareStartAscending,
7387                        &listTranscriptCompareIdentifierAscending);
7388 
7389     return ajTrue;
7390 }
7391 
7392 
7393 
7394 
7395 /* @func ensListTranscriptSortEndDescending ***********************************
7396 **
7397 ** Sort an AJAX List of Ensembl Transcript objects by their
7398 ** Ensembl Feature end member in descending order.
7399 **
7400 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
7401 **
7402 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
7403 **
7404 ** @release 6.4.0
7405 ** @@
7406 ******************************************************************************/
7407 
ensListTranscriptSortEndDescending(AjPList transcripts)7408 AjBool ensListTranscriptSortEndDescending(AjPList transcripts)
7409 {
7410     if (!transcripts)
7411         return ajFalse;
7412 
7413     ajListSortTwoThree(transcripts,
7414                        &listTranscriptCompareEndDescending,
7415                        &listTranscriptCompareStartDescending,
7416                        &listTranscriptCompareIdentifierAscending);
7417 
7418     return ajTrue;
7419 }
7420 
7421 
7422 
7423 
7424 /* @func ensListTranscriptSortIdentifierAscending *****************************
7425 **
7426 ** Sort an AJAX List of Ensembl Transcript objects by their
7427 ** identifier member in ascending order.
7428 **
7429 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
7430 **
7431 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
7432 **
7433 ** @release 6.4.0
7434 ** @@
7435 ******************************************************************************/
7436 
ensListTranscriptSortIdentifierAscending(AjPList transcripts)7437 AjBool ensListTranscriptSortIdentifierAscending(AjPList transcripts)
7438 {
7439     if (!transcripts)
7440         return ajFalse;
7441 
7442     ajListSort(transcripts, &listTranscriptCompareIdentifierAscending);
7443 
7444     return ajTrue;
7445 }
7446 
7447 
7448 
7449 
7450 /* @func ensListTranscriptSortStartAscending **********************************
7451 **
7452 ** Sort an AJAX List of Ensembl Transcript objects by their
7453 ** Ensembl Feature start member in ascending order.
7454 **
7455 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
7456 **
7457 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
7458 **
7459 ** @release 6.4.0
7460 ** @@
7461 ******************************************************************************/
7462 
ensListTranscriptSortStartAscending(AjPList transcripts)7463 AjBool ensListTranscriptSortStartAscending(AjPList transcripts)
7464 {
7465     if (!transcripts)
7466         return ajFalse;
7467 
7468     ajListSortTwoThree(transcripts,
7469                        &listTranscriptCompareStartAscending,
7470                        &listTranscriptCompareEndAscending,
7471                        &listTranscriptCompareIdentifierAscending);
7472 
7473     return ajTrue;
7474 }
7475 
7476 
7477 
7478 
7479 /* @func ensListTranscriptSortStartDescending *********************************
7480 **
7481 ** Sort an AJAX List of Ensembl Transcript objects by their
7482 ** Ensembl Feature start member in descending order.
7483 **
7484 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
7485 **
7486 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
7487 **
7488 ** @release 6.4.0
7489 ** @@
7490 ******************************************************************************/
7491 
ensListTranscriptSortStartDescending(AjPList transcripts)7492 AjBool ensListTranscriptSortStartDescending(AjPList transcripts)
7493 {
7494     if (!transcripts)
7495         return ajFalse;
7496 
7497     ajListSortTwoThree(transcripts,
7498                        &listTranscriptCompareStartDescending,
7499                        &listTranscriptCompareEndDescending,
7500                        &listTranscriptCompareIdentifierAscending);
7501 
7502     return ajTrue;
7503 }
7504 
7505 
7506 
7507 
7508 /* @datasection [AjPSeq] AJAX Sequence ****************************************
7509 **
7510 ** @nam2rule Sequence Functions for manipulating AJAX Sequence objects
7511 **
7512 ******************************************************************************/
7513 
7514 
7515 
7516 
7517 /* @section add ***************************************************************
7518 **
7519 ** Functions for manipulating AJAX Sequence objects.
7520 **
7521 ** @fdata [AjPSeq]
7522 **
7523 ** @nam3rule Add Add to an AJAX Sequence
7524 ** @nam4rule Feature Add an AJAX Feature
7525 ** @nam5rule Transcript Convert an Ensembl Transcript into an AJAX Feature
7526 **
7527 ** @argrule * seq [AjPSeq] AJAX Sequence
7528 ** @argrule Transcript transcript [EnsPTranscript] Ensembl Transcript
7529 ** @argrule Transcript Pfeature [AjPFeature*] AJAX Feature address
7530 **
7531 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
7532 **
7533 ** @fcategory misc
7534 ******************************************************************************/
7535 
7536 
7537 
7538 
7539 /* @func ensSequenceAddFeatureTranscript **************************************
7540 **
7541 ** Convert an Ensembl Transcript into an AJAX Feature and add it to the
7542 ** AJAX Feature Table of an AJAX Sequence. Also convert and add all
7543 ** Ensembl Exon objects associated with the Ensembl Transcript.
7544 **
7545 ** @param [u] seq [AjPSeq] AJAX Sequence
7546 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
7547 ** @param [wP] Pfeature [AjPFeature*] AJAX Feature address
7548 **
7549 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
7550 **
7551 ** @release 6.5.0
7552 ** @@
7553 ******************************************************************************/
7554 
ensSequenceAddFeatureTranscript(AjPSeq seq,EnsPTranscript transcript,AjPFeature * Pfeature)7555 AjBool ensSequenceAddFeatureTranscript(AjPSeq seq,
7556                                        EnsPTranscript transcript,
7557                                        AjPFeature *Pfeature)
7558 {
7559     ajint rank = 0;
7560 
7561     AjPFeature feature = NULL;
7562 
7563     AjIList iter = NULL;
7564     const AjPList exons = NULL;
7565 
7566     AjPStr label = NULL;
7567     AjPStr type  = NULL;
7568 
7569     EnsPDatabaseadaptor dba = NULL;
7570 
7571     EnsPDatabaseentry dbe = NULL;
7572 
7573     EnsPExon exon = NULL;
7574 
7575     EnsPSlice slice      = NULL;
7576     EnsPSliceadaptor sla = NULL;
7577 
7578     EnsPTranscript newtranscript = NULL;
7579 
7580     if (!seq)
7581         return ajFalse;
7582 
7583     if (!transcript)
7584         return ajFalse;
7585 
7586     if (!Pfeature)
7587         return ajFalse;
7588 
7589     *Pfeature = NULL;
7590 
7591     /*
7592     ** NOTE: An AJAX Sequence accessor function returning the
7593     ** AJAX Feature Table in modifiable form is missing.
7594     */
7595 
7596     if (!seq->Fttable)
7597         return ajFalse;
7598 
7599     /*
7600     ** Get the Ensembl Slice covering the AJAX Sequence object and transfer
7601     ** the Ensembl Exon object onto it.
7602     */
7603 
7604     dba = ensTranscriptadaptorGetDatabaseadaptor(transcript->Adaptor);
7605 
7606     sla = ensRegistryGetSliceadaptor(dba);
7607 
7608     ensSliceadaptorFetchByName(sla, ajSeqGetNameS(seq), &slice);
7609 
7610     if (!slice)
7611     {
7612         ajDebug("ensSeqAddFeatureTranscript could not fetch an "
7613                 "Ensembl Slice for AJAX Sequence name '%S'.\n",
7614                 ajSeqGetNameS(seq));
7615 
7616         return ajFalse;
7617     }
7618 
7619     newtranscript = ensTranscriptTransfer(transcript, slice);
7620 
7621     if (!newtranscript)
7622     {
7623         ajDebug("ensSeqAddFeatureTranscript could not transfer "
7624                 "Ensembl Transcript %p onto "
7625                 "Ensembl Slice %p.\n", transcript, slice);
7626 
7627         ensTranscriptTrace(transcript, 1);
7628         ensSliceTrace(slice, 1);
7629 
7630         ensSliceDel(&slice);
7631 
7632         return ajFalse;
7633     }
7634 
7635     /* Convert the Ensembl Transcript into a parent AJAX Feature. */
7636 
7637     /* FIXME: This needs to take biotypes into account. */
7638     type = ajStrNewC("mRNA");
7639 
7640     *Pfeature = ajFeatNewNucFlags(
7641         seq->Fttable,
7642         ensAnalysisGetName(ensFeatureGetAnalysis(newtranscript->Feature)),
7643         type,
7644         ensFeatureGetStart(newtranscript->Feature),
7645         ensFeatureGetEnd(newtranscript->Feature),
7646         0.0F, /* Score */
7647         ensFeatureCalculateStrand(newtranscript->Feature),
7648         0, /* Frame */
7649         0, /* Exon number */
7650         0, /* Start 2 */
7651         0, /* End 2 */
7652         (AjPStr) NULL, /* Remote Identifier */
7653         (AjPStr) NULL, /* Label */
7654         AJFEATFLAG_MULTIPLE);
7655 
7656     ensTranscriptFetchDisplayidentifier(newtranscript, &label);
7657 
7658     ajFeatTagAddCS(*Pfeature,
7659                    "standard_name",
7660                    label);
7661 
7662     dbe = ensTranscriptGetDisplayreference(newtranscript);
7663 
7664     if (dbe)
7665         ajFeatTagAddCS(*Pfeature,
7666                        "locus_tag",
7667                        ensDatabaseentryGetDisplayidentifier(dbe));
7668 
7669     /* Add sub-AJAX Feature objects on the basis of Ensembl Exon objects. */
7670 
7671     exons = ensTranscriptLoadExons(newtranscript);
7672 
7673     iter = ajListIterNewread(exons);
7674 
7675     while (!ajListIterDone(iter))
7676     {
7677         exon = (EnsPExon) ajListIterGet(iter);
7678 
7679         rank++;
7680 
7681         feature = ajFeatNewNucFlagsSub(
7682             seq->Fttable,
7683             *Pfeature,
7684             ensAnalysisGetName(ensFeatureGetAnalysis(newtranscript->Feature)),
7685             type,
7686             ensFeatureGetStart(ensExonGetFeature(exon)),
7687             ensFeatureGetEnd(ensExonGetFeature(exon)),
7688             0.0F,
7689             ensFeatureCalculateStrand(ensExonGetFeature(exon)),
7690             ensExonCalculateFrame(exon), /* Frame */
7691             rank, /* Exon */
7692             0, /* Start 2 */
7693             0, /* End 2 */
7694             (AjPStr) NULL, /* Remote identifier */
7695             (AjPStr) NULL, /* Label */
7696             0);
7697 
7698         ensSequenceAddFeatureExon(seq, exon, rank, &feature);
7699     }
7700 
7701     ajListIterDel(&iter);
7702 
7703     ajStrDel(&label);
7704     ajStrDel(&type);
7705 
7706     ensTranscriptDel(&newtranscript);
7707 
7708     ensSliceDel(&slice);
7709 
7710     return ajTrue;
7711 }
7712 
7713 
7714 
7715 
7716 /* @datasection [EnsPTranscriptadaptor] Ensembl Transcript Adaptor ************
7717 **
7718 ** @nam2rule Transcriptadaptor Functions for manipulating
7719 ** Ensembl Transcript Adaptor objects
7720 **
7721 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor
7722 ** @cc CVS Revision: 1.149
7723 ** @cc CVS Tag: branch-ensembl-68
7724 **
7725 ******************************************************************************/
7726 
7727 
7728 
7729 
7730 /* @funcstatic transcriptadaptorFetchAllbyStatement ***************************
7731 **
7732 ** Fetch all Ensembl Transcript objects via an SQL statement.
7733 **
7734 ** @param [u] ba [EnsPBaseadaptor] Ensembl Base Adaptor
7735 ** @param [r] statement [const AjPStr] SQL statement
7736 ** @param [uN] am [EnsPAssemblymapper] Ensembl Assembly Mapper
7737 ** @param [uN] slice [EnsPSlice] Ensembl Slice
7738 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
7739 **
7740 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
7741 **
7742 ** @release 6.4.0
7743 ** @@
7744 ******************************************************************************/
7745 
transcriptadaptorFetchAllbyStatement(EnsPBaseadaptor ba,const AjPStr statement,EnsPAssemblymapper am,EnsPSlice slice,AjPList transcripts)7746 static AjBool transcriptadaptorFetchAllbyStatement(
7747     EnsPBaseadaptor ba,
7748     const AjPStr statement,
7749     EnsPAssemblymapper am,
7750     EnsPSlice slice,
7751     AjPList transcripts)
7752 {
7753     ajuint identifier = 0U;
7754     ajuint analysisid = 0U;
7755     ajuint erid       = 0U;
7756     ajuint geneid     = 0U;
7757     ajuint edbid      = 0U;
7758 
7759     ajuint srid     = 0U;
7760     ajuint srstart  = 0U;
7761     ajuint srend    = 0U;
7762     ajint  srstrand = 0;
7763 
7764     ajuint version = 0U;
7765 
7766     AjBool current = AJFALSE;
7767 
7768     AjPSqlstatement sqls = NULL;
7769     AjISqlrow sqli       = NULL;
7770     AjPSqlrow sqlr       = NULL;
7771 
7772     AjPStr description   = NULL;
7773     AjPStr biotype       = NULL;
7774     AjPStr status        = NULL;
7775     AjPStr stableid      = NULL;
7776     AjPStr cdate         = NULL;
7777     AjPStr mdate         = NULL;
7778     AjPStr erprimaryid   = NULL;
7779     AjPStr erdisplayid   = NULL;
7780     AjPStr erversion     = NULL;
7781     AjPStr erdescription = NULL;
7782     AjPStr erinfotype    = NULL;
7783     AjPStr erinfotext    = NULL;
7784 
7785     EnsETranscriptStatus estatus =
7786         ensETranscriptStatusNULL;
7787 
7788     EnsEExternalreferenceInfotype erit = ensEExternalreferenceInfotypeNULL;
7789 
7790     EnsPDatabaseadaptor dba = NULL;
7791 
7792     EnsPDatabaseentry dbe = NULL;
7793 
7794     EnsPFeature feature = NULL;
7795 
7796     EnsPExternaldatabase edb         = NULL;
7797     EnsPExternaldatabaseadaptor edba = NULL;
7798 
7799     EnsPTranscript transcript = NULL;
7800     EnsPTranscriptadaptor tca  = NULL;
7801 
7802     if (ajDebugTest("transcriptadaptorFetchAllbyStatement"))
7803         ajDebug("transcriptadaptorFetchAllbyStatement\n"
7804                 "  ba %p\n"
7805                 "  statement %p\n"
7806                 "  am %p\n"
7807                 "  slice %p\n"
7808                 "  transcripts %p\n",
7809                 ba,
7810                 statement,
7811                 am,
7812                 slice,
7813                 transcripts);
7814 
7815     if (!ba)
7816         return ajFalse;
7817 
7818     if (!statement)
7819         return ajFalse;
7820 
7821     if (!transcripts)
7822         return ajFalse;
7823 
7824     dba = ensBaseadaptorGetDatabaseadaptor(ba);
7825 
7826     edba = ensRegistryGetExternaldatabaseadaptor(dba);
7827     tca  = ensRegistryGetTranscriptadaptor(dba);
7828 
7829     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
7830 
7831     sqli = ajSqlrowiterNew(sqls);
7832 
7833     while (!ajSqlrowiterDone(sqli))
7834     {
7835         identifier  = 0U;
7836         srid        = 0U;
7837         srstart     = 0U;
7838         srend       = 0U;
7839         srstrand    = 0;
7840         analysisid  = 0U;
7841         erid        = 0U;
7842         description = ajStrNew();
7843         biotype     = ajStrNew();
7844         status      = ajStrNew();
7845         current     = ajFalse;
7846         geneid      = 0U;
7847         stableid    = ajStrNew();
7848         version     = 0U;
7849         cdate       = ajStrNew();
7850         mdate       = ajStrNew();
7851         edbid       = 0U;
7852         erprimaryid = ajStrNew();
7853         erdisplayid = ajStrNew();
7854         erversion   = ajStrNew();
7855 
7856         erdescription = ajStrNew();
7857         erinfotype    = ajStrNew();
7858         erinfotext    = ajStrNew();
7859 
7860         estatus = ensETranscriptStatusNULL;
7861         erit    = ensEExternalreferenceInfotypeNULL;
7862 
7863         sqlr = ajSqlrowiterGet(sqli);
7864 
7865         ajSqlcolumnToUint(sqlr, &identifier);
7866         ajSqlcolumnToUint(sqlr, &srid);
7867         ajSqlcolumnToUint(sqlr, &srstart);
7868         ajSqlcolumnToUint(sqlr, &srend);
7869         ajSqlcolumnToInt(sqlr, &srstrand);
7870         ajSqlcolumnToUint(sqlr, &analysisid);
7871         ajSqlcolumnToUint(sqlr, &erid);
7872         ajSqlcolumnToStr(sqlr, &description);
7873         ajSqlcolumnToStr(sqlr, &biotype);
7874         ajSqlcolumnToStr(sqlr, &status);
7875         ajSqlcolumnToBool(sqlr, &current);
7876         ajSqlcolumnToUint(sqlr, &geneid);
7877         ajSqlcolumnToStr(sqlr, &stableid);
7878         ajSqlcolumnToUint(sqlr, &version);
7879         ajSqlcolumnToStr(sqlr, &cdate);
7880         ajSqlcolumnToStr(sqlr, &mdate);
7881         ajSqlcolumnToUint(sqlr, &edbid);
7882         ajSqlcolumnToStr(sqlr, &erprimaryid);
7883         ajSqlcolumnToStr(sqlr, &erdisplayid);
7884         ajSqlcolumnToStr(sqlr, &erversion);
7885         ajSqlcolumnToStr(sqlr, &erdescription);
7886         ajSqlcolumnToStr(sqlr, &erinfotype);
7887         ajSqlcolumnToStr(sqlr, &erinfotext);
7888 
7889         ensBaseadaptorRetrieveFeature(ba,
7890                                       analysisid,
7891                                       srid,
7892                                       srstart,
7893                                       srend,
7894                                       srstrand,
7895                                       am,
7896                                       slice,
7897                                       &feature);
7898 
7899         if (!feature)
7900         {
7901             ajStrDel(&description);
7902             ajStrDel(&biotype);
7903             ajStrDel(&status);
7904             ajStrDel(&stableid);
7905             ajStrDel(&cdate);
7906             ajStrDel(&mdate);
7907             ajStrDel(&erprimaryid);
7908             ajStrDel(&erdisplayid);
7909             ajStrDel(&erversion);
7910             ajStrDel(&erdescription);
7911             ajStrDel(&erinfotype);
7912             ajStrDel(&erinfotext);
7913 
7914             continue;
7915         }
7916 
7917         if (erid)
7918         {
7919             ensExternaldatabaseadaptorFetchByIdentifier(edba, edbid, &edb);
7920 
7921             erit = ensExternalreferenceInfotypeFromStr(erinfotype);
7922 
7923             if (!erit)
7924                 ajDebug("transcriptadaptorFetchAllbyStatement encountered "
7925                         "unexpected string '%S' in the "
7926                         "'xref.infotype' field.\n", erinfotype);
7927 
7928             dbe = ensDatabaseentryNewIni(
7929                 (EnsPDatabaseentryadaptor) NULL,
7930                 erid,
7931                 (EnsPAnalysis) NULL,
7932                 edb,
7933                 erprimaryid,
7934                 erdisplayid,
7935                 erversion,
7936                 erdescription,
7937                 (AjPStr) NULL,
7938                 erinfotext,
7939                 erit,
7940                 ensEExternalreferenceObjectypeTranscript,
7941                 identifier);
7942 
7943             ensExternaldatabaseDel(&edb);
7944         }
7945         else
7946             dbe = NULL;
7947 
7948         /* Set the Transcript status. */
7949 
7950         estatus = ensTranscriptStatusFromStr(status);
7951 
7952         if (!estatus)
7953             ajFatal("transcriptadaptorFetchAllbyStatement encountered "
7954                     "unexpected string '%S' in the "
7955                     "'transcript.status' field.\n", status);
7956 
7957         /* Finally, create a new Ensembl Transcript. */
7958 
7959         transcript = ensTranscriptNewIni(tca,
7960                                          identifier,
7961                                          feature,
7962                                          dbe,
7963                                          description,
7964                                          biotype,
7965                                          estatus,
7966                                          current,
7967                                          stableid,
7968                                          version,
7969                                          cdate,
7970                                          mdate,
7971                                          (AjPList) NULL);
7972 
7973         ajListPushAppend(transcripts, (void *) transcript);
7974 
7975         ensFeatureDel(&feature);
7976 
7977         ensDatabaseentryDel(&dbe);
7978 
7979         ajStrDel(&description);
7980         ajStrDel(&biotype);
7981         ajStrDel(&status);
7982         ajStrDel(&stableid);
7983         ajStrDel(&cdate);
7984         ajStrDel(&mdate);
7985         ajStrDel(&erprimaryid);
7986         ajStrDel(&erdisplayid);
7987         ajStrDel(&erversion);
7988         ajStrDel(&erdescription);
7989         ajStrDel(&erinfotype);
7990         ajStrDel(&erinfotext);
7991     }
7992 
7993     ajSqlrowiterDel(&sqli);
7994 
7995     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
7996 
7997     return ajTrue;
7998 }
7999 
8000 
8001 
8002 
8003 /* @section constructors ******************************************************
8004 **
8005 ** All constructors return a new Ensembl Transcript Adaptor by pointer.
8006 ** It is the responsibility of the user to first destroy any previous
8007 ** Transcript Adaptor. The target pointer does not need to be initialised to
8008 ** NULL, but it is good programming practice to do so anyway.
8009 **
8010 ** @fdata [EnsPTranscriptadaptor]
8011 **
8012 ** @nam3rule New Constructor
8013 **
8014 ** @argrule New dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
8015 **
8016 ** @valrule * [EnsPTranscriptadaptor] Ensembl Transcript Adaptor or NULL
8017 **
8018 ** @fcategory new
8019 ******************************************************************************/
8020 
8021 
8022 
8023 
8024 /* @func ensTranscriptadaptorNew **********************************************
8025 **
8026 ** Default constructor for an Ensembl Transcript Adaptor.
8027 **
8028 ** Ensembl Object Adaptors are singleton objects in the sense that a single
8029 ** instance of an Ensembl Object Adaptor connected to a particular database is
8030 ** sufficient to instantiate any number of Ensembl Objects from the database.
8031 ** Each Ensembl Object will have a weak reference to the Object Adaptor that
8032 ** instantiated it. Therefore, Ensembl Object Adaptors should not be
8033 ** instantiated directly, but rather obtained from the Ensembl Registry,
8034 ** which will in turn call this function if neccessary.
8035 **
8036 ** @see ensRegistryGetDatabaseadaptor
8037 ** @see ensRegistryGetTranscriptadaptor
8038 **
8039 ** @param [u] dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
8040 **
8041 ** @return [EnsPTranscriptadaptor] Ensembl Transcript Adaptor or NULL
8042 **
8043 ** @release 6.2.0
8044 ** @@
8045 ******************************************************************************/
8046 
ensTranscriptadaptorNew(EnsPDatabaseadaptor dba)8047 EnsPTranscriptadaptor ensTranscriptadaptorNew(
8048     EnsPDatabaseadaptor dba)
8049 {
8050     return ensFeatureadaptorNew(
8051         dba,
8052         transcriptadaptorKTablenames,
8053         transcriptadaptorKColumnnames,
8054         transcriptadaptorKLeftjoins,
8055         (const char *) NULL,
8056         (const char *) NULL,
8057         &transcriptadaptorFetchAllbyStatement,
8058         (void *(*)(const void *)) NULL,
8059         (void *(*)(void *)) &ensTranscriptNewRef,
8060         (AjBool (*)(const void *)) NULL,
8061         (void (*)(void **)) &ensTranscriptDel,
8062         (size_t (*)(const void *)) &ensTranscriptCalculateMemsize,
8063         (EnsPFeature (*)(const void *)) &ensTranscriptGetFeature,
8064         "Transcript");
8065 }
8066 
8067 
8068 
8069 
8070 /* @section destructors *******************************************************
8071 **
8072 ** Destruction destroys all internal data structures and frees the memory
8073 ** allocated for an Ensembl Transcript Adaptor object.
8074 **
8075 ** @fdata [EnsPTranscriptadaptor]
8076 **
8077 ** @nam3rule Del Destroy (free) an Ensembl Transcript Adaptor
8078 **
8079 ** @argrule * Ptca [EnsPTranscriptadaptor*] Ensembl Transcript Adaptor address
8080 **
8081 ** @valrule * [void]
8082 **
8083 ** @fcategory delete
8084 ******************************************************************************/
8085 
8086 
8087 
8088 
8089 /* @func ensTranscriptadaptorDel **********************************************
8090 **
8091 ** Default destructor for an Ensembl Transcript Adaptor.
8092 **
8093 ** Ensembl Object Adaptors are singleton objects that are registered in the
8094 ** Ensembl Registry and weakly referenced by Ensembl Objects that have been
8095 ** instantiated by it. Therefore, Ensembl Object Adaptors should never be
8096 ** destroyed directly. Upon exit, the Ensembl Registry will call this function
8097 ** if required.
8098 **
8099 ** @param [d] Ptca [EnsPTranscriptadaptor*] Ensembl Transcript Adaptor address
8100 **
8101 ** @return [void]
8102 **
8103 ** @release 6.2.0
8104 ** @@
8105 ******************************************************************************/
8106 
ensTranscriptadaptorDel(EnsPTranscriptadaptor * Ptca)8107 void ensTranscriptadaptorDel(EnsPTranscriptadaptor *Ptca)
8108 {
8109     ensFeatureadaptorDel(Ptca);
8110 
8111     return;
8112 }
8113 
8114 
8115 
8116 
8117 /* @section member retrieval **************************************************
8118 **
8119 ** Functions for returning members of an Ensembl Transcript Adaptor object.
8120 **
8121 ** @fdata [EnsPTranscriptadaptor]
8122 **
8123 ** @nam3rule Get Return Ensembl Transcript Adaptor attribute(s)
8124 ** @nam4rule Baseadaptor Return the Ensembl Base Adaptor
8125 ** @nam4rule Databaseadaptor Return the Ensembl Database Adaptor
8126 ** @nam4rule Featureadaptor Return the Ensembl Feature Adaptor
8127 **
8128 ** @argrule * tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8129 **
8130 ** @valrule Baseadaptor [EnsPBaseadaptor]
8131 ** Ensembl Base Adaptor or NULL
8132 ** @valrule Databaseadaptor [EnsPDatabaseadaptor]
8133 ** Ensembl Database Adaptor or NULL
8134 ** @valrule Featureadaptor [EnsPFeatureadaptor]
8135 ** Ensembl Feature Adaptor or NULL
8136 **
8137 ** @fcategory use
8138 ******************************************************************************/
8139 
8140 
8141 
8142 
8143 /* @func ensTranscriptadaptorGetBaseadaptor ***********************************
8144 **
8145 ** Get the Ensembl Base Adaptor member of an Ensembl Transcript Adaptor.
8146 **
8147 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8148 **
8149 ** @return [EnsPBaseadaptor] Ensembl Base Adaptor or NULL
8150 **
8151 ** @release 6.5.0
8152 ** @@
8153 ******************************************************************************/
8154 
ensTranscriptadaptorGetBaseadaptor(EnsPTranscriptadaptor tca)8155 EnsPBaseadaptor ensTranscriptadaptorGetBaseadaptor(
8156     EnsPTranscriptadaptor tca)
8157 {
8158     return ensFeatureadaptorGetBaseadaptor(
8159         ensTranscriptadaptorGetFeatureadaptor(tca));
8160 }
8161 
8162 
8163 
8164 
8165 /* @func ensTranscriptadaptorGetDatabaseadaptor *******************************
8166 **
8167 ** Get the Ensembl Database Adaptor member of an Ensembl Transcript Adaptor.
8168 **
8169 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8170 **
8171 ** @return [EnsPDatabaseadaptor] Ensembl Database Adaptor or NULL
8172 **
8173 ** @release 6.2.0
8174 ** @@
8175 ******************************************************************************/
8176 
ensTranscriptadaptorGetDatabaseadaptor(EnsPTranscriptadaptor tca)8177 EnsPDatabaseadaptor ensTranscriptadaptorGetDatabaseadaptor(
8178     EnsPTranscriptadaptor tca)
8179 {
8180     return ensFeatureadaptorGetDatabaseadaptor(
8181         ensTranscriptadaptorGetFeatureadaptor(tca));
8182 }
8183 
8184 
8185 
8186 
8187 /* @func ensTranscriptadaptorGetFeatureadaptor ********************************
8188 **
8189 ** Get the Ensembl Feature Adaptor member of an Ensembl Transcript Adaptor.
8190 **
8191 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8192 **
8193 ** @return [EnsPFeatureadaptor] Ensembl Feature Adaptor or NULL
8194 **
8195 ** @release 6.2.0
8196 ** @@
8197 ******************************************************************************/
8198 
ensTranscriptadaptorGetFeatureadaptor(EnsPTranscriptadaptor tca)8199 EnsPFeatureadaptor ensTranscriptadaptorGetFeatureadaptor(
8200     EnsPTranscriptadaptor tca)
8201 {
8202     return tca;
8203 }
8204 
8205 
8206 
8207 
8208 /* @section canonical object retrieval ****************************************
8209 **
8210 ** Functions for fetching Ensembl Transcript objects from an
8211 ** Ensembl SQL database.
8212 **
8213 ** @fdata [EnsPTranscriptadaptor]
8214 **
8215 ** @nam3rule Fetch Fetch Ensembl Transcript object(s)
8216 ** @nam4rule All   Fetch all Ensembl Transcript objects
8217 ** @nam4rule Allby Fetch all Ensembl Transcript objects matching a criterion
8218 ** @nam5rule Biotype
8219 ** Fetch all by a biological type
8220 ** @nam5rule Exonidentifier
8221 ** Fetch all by an Ensembl Exon identifier
8222 ** @nam5rule Exonstableidentifier
8223 ** Fetch all by an Ensembl Exon stable identifier
8224 ** @nam5rule Externaldatabasename
8225 ** Fetch all by an Ensembl External Database name
8226 ** @nam5rule Externalname
8227 ** Fetch all by an Ensembl Database Entry name
8228 ** @nam5rule Gene Fetch all by an Ensembl Gene
8229 ** @nam5rule Identifiers Fetch all by an AJAX Table
8230 ** @nam5rule Slice Fetch all by an Ensembl Slice
8231 ** @nam5rule Stableidentifier Fetch all by a stable identifier
8232 ** @nam4rule By Fetch one Ensembl Transcript object matching a criterion
8233 ** @nam5rule Displaylabel Fetch by display label
8234 ** @nam5rule Identifier Fetch by SQL database-internal identifier
8235 ** @nam5rule Stableidentifier Fetch by a stable identifier
8236 ** @nam5rule Translationidentifier
8237 ** Fetch by an Ensembl Translation identifier
8238 ** @nam5rule Translationstableidentifier
8239 ** Fetch by an Ensembl Translation stable identifier
8240 **
8241 ** @argrule * tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8242 ** @argrule All transcripts [AjPList] AJAX List of Ensembl Transcript objects
8243 ** @argrule AllbyBiotype biotype [const AjPStr]
8244 ** Biological type
8245 ** @argrule AllbyBiotype transcripts [AjPList]
8246 ** AJAX List of Ensembl Transcript objects
8247 ** @argrule AllbyExonidentifier identifier [ajuint]
8248 ** Ensembl Exon identifier
8249 ** @argrule AllbyExonidentifier transcripts [AjPList]
8250 ** AJAX List of Ensembl Transcript objects
8251 ** @argrule AllbyExonstableidentifier stableid [const AjPStr]
8252 ** Ensembl Exon stable identifier
8253 ** @argrule AllbyExonstableidentifier transcripts [AjPList]
8254 ** AJAX List of Ensembl Transcript objects
8255 ** @argrule AllbyExternaldatabasename dbname [const AjPStr]
8256 ** Ensembl External Database name
8257 ** @argrule AllbyExternaldatabasename transcripts [AjPList]
8258 ** AJAX List of Ensembl Transcript objects
8259 ** @argrule AllbyExternalname name [const AjPStr]
8260 ** Ensembl Database Entry name
8261 ** @argrule AllbyExternalname dbname [const AjPStr]
8262 ** Ensembl External Database name
8263 ** @argrule AllbyExternalname override [AjBool]
8264 ** Override optimisation of '_' SQL any
8265 ** @argrule AllbyExternalname transcripts [AjPList]
8266 ** AJAX List of Ensembl Transcript objects
8267 ** @argrule AllbyGene gene [EnsPGene] Ensembl Gene
8268 ** @argrule AllbyGene transcripts [AjPList]
8269 ** AJAX List of Ensembl Transcript objects
8270 ** @argrule AllbyIdentifiers transcripts [AjPTable]
8271 ** AJAX Table of Ensembl Transcript objects
8272 ** @argrule AllbySlice slice [EnsPSlice] Ensembl Slice
8273 ** @argrule AllbySlice anname [const AjPStr] Ensembl Analysis name
8274 ** @argrule AllbySlice constraint [const AjPStr] SQL constraint
8275 ** @argrule AllbySlice loadexons [AjBool] Load Ensembl Exon objects
8276 ** @argrule AllbySlice transcripts [AjPList]
8277 ** AJAX List of Ensembl Transcript objects
8278 ** @argrule AllbyStableidentifier stableid [const AjPStr] Stable identifier
8279 ** @argrule AllbyStableidentifier transcripts [AjPList]
8280 ** AJAX List of Ensembl Transcript objects
8281 ** @argrule ByDisplaylabel label [const AjPStr] Display label
8282 ** @argrule ByIdentifier identifier [ajuint] SQL database-internal identifier
8283 ** @argrule ByStableidentifier stableid [const AjPStr] Stable identifier
8284 ** @argrule ByStableidentifier version [ajuint] Version
8285 ** @argrule ByTranslationidentifier identifier [ajuint]
8286 ** Ensembl Translation identifier
8287 ** @argrule ByTranslationstableidentifier stableid [const AjPStr]
8288 ** Ensembl Translation stable identifier
8289 ** @argrule By Ptranscript [EnsPTranscript*]
8290 ** Ensembl Transcript address
8291 **
8292 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
8293 **
8294 ** @fcategory use
8295 ******************************************************************************/
8296 
8297 
8298 
8299 
8300 /* @func ensTranscriptadaptorFetchAll *****************************************
8301 **
8302 ** Fetch all Ensembl Transcript objects.
8303 **
8304 ** The caller is responsible for deleting the Ensembl Transcript objects before
8305 ** deleting the AJAX List.
8306 **
8307 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_all
8308 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8309 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
8310 **
8311 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
8312 **
8313 ** @release 6.2.0
8314 ** @@
8315 ******************************************************************************/
8316 
ensTranscriptadaptorFetchAll(EnsPTranscriptadaptor tca,AjPList transcripts)8317 AjBool ensTranscriptadaptorFetchAll(
8318     EnsPTranscriptadaptor tca,
8319     AjPList transcripts)
8320 {
8321     AjBool result = AJFALSE;
8322 
8323     AjPStr constraint = NULL;
8324 
8325     if (!tca)
8326         return ajFalse;
8327 
8328     if (!transcripts)
8329         return ajFalse;
8330 
8331     constraint = ajStrNewC(
8332         "transcript.biotype != 'LRG_gene' "
8333         "AND "
8334         "transcript.is_current = 1");
8335 
8336     result = ensBaseadaptorFetchAllbyConstraint(
8337         ensTranscriptadaptorGetBaseadaptor(tca),
8338         constraint,
8339         (EnsPAssemblymapper) NULL,
8340         (EnsPSlice) NULL,
8341         transcripts);
8342 
8343     ajStrDel(&constraint);
8344 
8345     return result;
8346 }
8347 
8348 
8349 
8350 
8351 /* @func ensTranscriptadaptorFetchAllbyBiotype ********************************
8352 **
8353 ** Fetch all Ensembl Transcript objects via a biotype.
8354 **
8355 ** The caller is responsible for deleting the Ensembl Transcript objects
8356 ** before deleting the AJAX List.
8357 **
8358 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_all_by_biotype
8359 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8360 ** @param [r] biotype [const AjPStr] Biotype
8361 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
8362 **
8363 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
8364 **
8365 ** @release 6.5.0
8366 ** @@
8367 ******************************************************************************/
8368 
ensTranscriptadaptorFetchAllbyBiotype(EnsPTranscriptadaptor tca,const AjPStr biotype,AjPList transcripts)8369 AjBool ensTranscriptadaptorFetchAllbyBiotype(
8370     EnsPTranscriptadaptor tca,
8371     const AjPStr biotype,
8372     AjPList transcripts)
8373 {
8374     char *txtbiotype = NULL;
8375 
8376     AjBool result = AJFALSE;
8377 
8378     AjPStr constraint = NULL;
8379 
8380     EnsPBaseadaptor ba = NULL;
8381 
8382     if (!tca)
8383         return ajFalse;
8384 
8385     if (!biotype)
8386         return ajFalse;
8387 
8388     if (!transcripts)
8389         return ajFalse;
8390 
8391     ba = ensTranscriptadaptorGetBaseadaptor(tca);
8392 
8393     ensBaseadaptorEscapeC(ba, &txtbiotype, biotype);
8394 
8395     constraint = ajFmtStr(
8396         "transcript.is_current = 1 "
8397         "AND "
8398         "transcript.biotype = '%s'",
8399         txtbiotype);
8400 
8401     ajCharDel(&txtbiotype);
8402 
8403     result = ensBaseadaptorFetchAllbyConstraint(
8404         ba,
8405         constraint,
8406         (EnsPAssemblymapper) NULL,
8407         (EnsPSlice) NULL,
8408         transcripts);
8409 
8410     ajStrDel(&constraint);
8411 
8412     return result;
8413 }
8414 
8415 
8416 
8417 
8418 /* @func ensTranscriptadaptorFetchAllbyExonidentifier *************************
8419 **
8420 ** Fetch an Ensembl Transcript via an Ensembl Exon identifier.
8421 ** The caller is responsible for deleting the Ensembl Transcript.
8422 **
8423 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_all_by_exon_id
8424 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8425 ** @param [r] identifier [ajuint] Ensembl Exon identifier
8426 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
8427 **
8428 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
8429 **
8430 ** @release 6.4.0
8431 ** @@
8432 ******************************************************************************/
8433 
ensTranscriptadaptorFetchAllbyExonidentifier(EnsPTranscriptadaptor tca,ajuint identifier,AjPList transcripts)8434 AjBool ensTranscriptadaptorFetchAllbyExonidentifier(
8435     EnsPTranscriptadaptor tca,
8436     ajuint identifier,
8437     AjPList transcripts)
8438 {
8439     ajuint trid = 0U;
8440 
8441     AjPSqlstatement sqls = NULL;
8442     AjISqlrow sqli       = NULL;
8443     AjPSqlrow sqlr       = NULL;
8444 
8445     AjPStr statement = NULL;
8446 
8447     EnsPBaseadaptor ba = NULL;
8448 
8449     EnsPDatabaseadaptor dba = NULL;
8450 
8451     EnsPTranscript transcript = NULL;
8452 
8453     if (!tca)
8454         return ajFalse;
8455 
8456     if (!identifier)
8457         return ajFalse;
8458 
8459     if (!transcripts)
8460         return ajFalse;
8461 
8462     ba  = ensTranscriptadaptorGetBaseadaptor(tca);
8463     dba = ensTranscriptadaptorGetDatabaseadaptor(tca);
8464 
8465     statement = ajFmtStr(
8466         "SELECT "
8467         "transcript.transcript_id "
8468         "FROM "
8469         "exon_transcript, "
8470         "transcript "
8471         "WHERE "
8472         "exon_transcript.exon_id = %u "
8473         "AND "
8474         "exon_transcript.transcript_id = transcript.transcript_id "
8475         "AND "
8476         "transcript.is_current = 1",
8477         identifier);
8478 
8479     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
8480 
8481     sqli = ajSqlrowiterNew(sqls);
8482 
8483     while (!ajSqlrowiterDone(sqli))
8484     {
8485         trid = 0;
8486 
8487         sqlr = ajSqlrowiterGet(sqli);
8488 
8489         ajSqlcolumnToUint(sqlr, &trid);
8490 
8491         ensBaseadaptorFetchByIdentifier(ba, trid, (void **) &transcript);
8492 
8493         if (transcript)
8494             ajListPushAppend(transcripts, (void *) transcript);
8495     }
8496 
8497     ajSqlrowiterDel(&sqli);
8498 
8499     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
8500 
8501     ajStrDel(&statement);
8502 
8503     return ajTrue;
8504 }
8505 
8506 
8507 
8508 
8509 /* @func ensTranscriptadaptorFetchAllbyExonstableidentifier *******************
8510 **
8511 ** Fetch all Ensembl Transcript objects via an Ensembl Exon stable identifier.
8512 ** The caller is responsible for deleting the Ensembl Transcript objects
8513 ** before deleting the AJAX List.
8514 **
8515 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_all_by_exon_stable_id
8516 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8517 ** @param [r] stableid [const AjPStr] Ensembl Exon stable identifier
8518 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
8519 **
8520 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
8521 **
8522 ** @release 6.4.0
8523 ** @@
8524 ******************************************************************************/
8525 
ensTranscriptadaptorFetchAllbyExonstableidentifier(EnsPTranscriptadaptor tca,const AjPStr stableid,AjPList transcripts)8526 AjBool ensTranscriptadaptorFetchAllbyExonstableidentifier(
8527     EnsPTranscriptadaptor tca,
8528     const AjPStr stableid,
8529     AjPList transcripts)
8530 {
8531     char *txtstableid = NULL;
8532 
8533     ajuint trid = 0U;
8534 
8535     AjPSqlstatement sqls = NULL;
8536     AjISqlrow sqli       = NULL;
8537     AjPSqlrow sqlr       = NULL;
8538 
8539     AjPStr statement = NULL;
8540 
8541     EnsPBaseadaptor ba = NULL;
8542 
8543     EnsPDatabaseadaptor dba = NULL;
8544 
8545     EnsPTranscript transcript = NULL;
8546 
8547     if (!tca)
8548         return ajFalse;
8549 
8550     if (!stableid && !ajStrGetLen(stableid))
8551         return ajFalse;
8552 
8553     if (!transcripts)
8554         return ajFalse;
8555 
8556     ba  = ensTranscriptadaptorGetBaseadaptor(tca);
8557     dba = ensTranscriptadaptorGetDatabaseadaptor(tca);
8558 
8559     ensBaseadaptorEscapeC(ba, &txtstableid, stableid);
8560 
8561     statement = ajFmtStr(
8562         "SELECT "
8563         "transcript.transcript_id "
8564         "FROM "
8565         "exon, "
8566         "exon_transcript, "
8567         "transcript "
8568         "WHERE "
8569         "exon.stable_id = '%s' "
8570         "AND "
8571         "exon.exon_id = exon_transcript.exon_id "
8572         "AND "
8573         "exon_transcript.transcript_id = transcript.transcript_id "
8574         "AND "
8575         "transcript.is_current = 1",
8576         txtstableid);
8577 
8578     ajCharDel(&txtstableid);
8579 
8580     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
8581 
8582     sqli = ajSqlrowiterNew(sqls);
8583 
8584     while (!ajSqlrowiterDone(sqli))
8585     {
8586         trid = 0U;
8587         transcript = NULL;
8588 
8589         sqlr = ajSqlrowiterGet(sqli);
8590 
8591         ajSqlcolumnToUint(sqlr, &trid);
8592 
8593         ensBaseadaptorFetchByIdentifier(ba, trid, (void **) &transcript);
8594 
8595         if (transcript)
8596             ajListPushAppend(transcripts, (void *) transcript);
8597     }
8598 
8599     ajSqlrowiterDel(&sqli);
8600 
8601     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
8602 
8603     ajStrDel(&statement);
8604 
8605     return ajTrue;
8606 }
8607 
8608 
8609 
8610 
8611 /* @func ensTranscriptadaptorFetchAllbyExternaldatabasename *******************
8612 **
8613 ** Fetch all Ensembl Transcript objects via an Ensembl External Database name.
8614 **
8615 ** The caller is responsible for deleting the Ensembl Transcript objects
8616 ** before deleting the AJAX List.
8617 **
8618 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8619 ** @param [r] dbname [const AjPStr] Ensembl External Database name
8620 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
8621 **
8622 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
8623 **
8624 ** @release 6.6.0
8625 ** @@
8626 ** NOTE: The Ensembl Core API has no implementation of
8627 ** Bio::EnsEMBL::DBSQL::DBEntryAdaptor::list_transcript_ids_by_external_dbid
8628 ******************************************************************************/
8629 
ensTranscriptadaptorFetchAllbyExternaldatabasename(EnsPTranscriptadaptor tca,const AjPStr dbname,AjPList transcripts)8630 AjBool ensTranscriptadaptorFetchAllbyExternaldatabasename(
8631     EnsPTranscriptadaptor tca,
8632     const AjPStr dbname,
8633     AjPList transcripts)
8634 {
8635     AjBool result = AJFALSE;
8636 
8637     AjPTable table = NULL;
8638 
8639     if (!tca)
8640         return ajFalse;
8641 
8642     if (!dbname)
8643         return ajFalse;
8644 
8645     if (!transcripts)
8646         return ajFalse;
8647 
8648     table = ajTableuintNew(0U);
8649 
8650     ajTableSetDestroyvalue(table, (void (*)(void **)) &ensTranscriptDel);
8651 
8652     result = ensDatabaseentryadaptorRetrieveAllTranscriptidentifiersByExternaldatabasename(
8653         ensRegistryGetDatabaseentryadaptor(
8654             ensTranscriptadaptorGetDatabaseadaptor(tca)),
8655         dbname,
8656         table);
8657 
8658     result = ensTranscriptadaptorFetchAllbyIdentifiers(tca, table);
8659 
8660     ensTableuintToList(table, transcripts);
8661 
8662     ajTableFree(&table);
8663 
8664     return result;
8665 }
8666 
8667 
8668 
8669 
8670 /* @func ensTranscriptadaptorFetchAllbyExternalname ***************************
8671 **
8672 ** Fetch all Ensembl Transcript objects via an Ensembl Database Entry name and
8673 ** Ensembl External Database name.
8674 **
8675 ** The caller is responsible for deleting the Ensembl Transcript objects
8676 ** before deleting the AJAX List.
8677 **
8678 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_all_by_external_name
8679 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8680 ** @param [r] name [const AjPStr] Ensembl Database Entry name
8681 ** @param [rN] dbname [const AjPStr] Ensembl External Database name
8682 ** @param [r] override [AjBool] Override optimisation of '_' SQL any
8683 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
8684 **
8685 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
8686 **
8687 ** @release 6.6.0
8688 ** @@
8689 ******************************************************************************/
8690 
ensTranscriptadaptorFetchAllbyExternalname(EnsPTranscriptadaptor tca,const AjPStr name,const AjPStr dbname,AjBool override,AjPList transcripts)8691 AjBool ensTranscriptadaptorFetchAllbyExternalname(
8692     EnsPTranscriptadaptor tca,
8693     const AjPStr name,
8694     const AjPStr dbname,
8695     AjBool override,
8696     AjPList transcripts)
8697 {
8698     AjBool result = AJFALSE;
8699 
8700     AjPTable table = NULL;
8701 
8702     if (!tca)
8703         return ajFalse;
8704 
8705     if (!name)
8706         return ajFalse;
8707 
8708     if (!transcripts)
8709         return ajFalse;
8710 
8711     table = ajTableuintNew(0U);
8712 
8713     ajTableSetDestroyvalue(table, (void (*)(void **)) &ensTranscriptDel);
8714 
8715     result = ensDatabaseentryadaptorRetrieveAllTranscriptidentifiersByExternalname(
8716         ensRegistryGetDatabaseentryadaptor(
8717             ensTranscriptadaptorGetDatabaseadaptor(tca)),
8718         name,
8719         dbname,
8720         override,
8721         table);
8722 
8723     result = ensTranscriptadaptorFetchAllbyIdentifiers(tca, table);
8724 
8725     ensTableuintToList(table, transcripts);
8726 
8727     ajTableFree(&table);
8728 
8729     return result;
8730 }
8731 
8732 
8733 
8734 
8735 /* @func ensTranscriptadaptorFetchAllbyGene ***********************************
8736 **
8737 ** Fetch all Ensembl Transcript objects via an Ensembl Gene.
8738 **
8739 ** The caller is responsible for deleting the Ensembl Transcript objects before
8740 ** deleting the AJAX List.
8741 **
8742 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_all_by_Gene
8743 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8744 ** @param [u] gene [EnsPGene] Ensembl Gene
8745 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
8746 **
8747 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
8748 **
8749 ** @release 6.4.0
8750 ** @@
8751 ******************************************************************************/
8752 
ensTranscriptadaptorFetchAllbyGene(EnsPTranscriptadaptor tca,EnsPGene gene,AjPList transcripts)8753 AjBool ensTranscriptadaptorFetchAllbyGene(
8754     EnsPTranscriptadaptor tca,
8755     EnsPGene gene,
8756     AjPList transcripts)
8757 {
8758     AjBool circular = AJFALSE;
8759 
8760     AjPList list = NULL;
8761 
8762     AjPStr constraint = NULL;
8763 
8764     EnsPDatabaseadaptor dba = NULL;
8765 
8766     EnsPFeature gfeature = NULL;
8767 
8768     EnsPSlice gslice     = NULL;
8769     EnsPSlice tslice     = NULL;
8770     EnsPSliceadaptor sla = NULL;
8771 
8772     EnsPTranscript transcript    = NULL;
8773     EnsPTranscript newtranscript = NULL;
8774 
8775     if (!tca)
8776         return ajFalse;
8777 
8778     if (!gene)
8779         return ajFalse;
8780 
8781     if (!transcripts)
8782         return ajFalse;
8783 
8784     /*
8785     ** Use the fetch_all_by_Slice_constraint method because it
8786     ** handles the difficult Haps/PARs and coordinate remapping.
8787     **
8788     ** Get a Slice that entirely overlaps the gene. This is because we
8789     ** want all Transcript objects to be fetched, not just ones overlapping
8790     ** the Slice the Gene is on, as the Gene may only partially overlap the
8791     ** Slice. For speed reasons, only use a different Slice if necessary
8792     ** though.
8793     */
8794 
8795     dba = ensTranscriptadaptorGetDatabaseadaptor(tca);
8796 
8797     if (!dba)
8798     {
8799         ajWarn("ensTranscriptadaptorFetchAllbyGene cannot fetch "
8800                "Ensembl Transcript objects without an "
8801                "Ensembl Database Adaptor defined in the "
8802                "Ensembl Transcript Adaptor.\n");
8803 
8804         return ajFalse;
8805     }
8806 
8807     gfeature = ensGeneGetFeature(gene);
8808 
8809     if (!gfeature)
8810     {
8811         ajWarn("ensTranscriptadaptorFetchAllbyGene cannot fetch "
8812                "Ensembl Transcript objects without an "
8813                "Ensembl Feature defined in the Ensembl Gene.\n");
8814 
8815         return ajFalse;
8816     }
8817 
8818     gslice = ensFeatureGetSlice(gfeature);
8819 
8820     if (!gslice)
8821     {
8822         ajWarn("ensTranscriptadaptorFetchAllbyGene cannot fetch "
8823                "Ensembl Transcript objects without an Ensembl Slice defined "
8824                "in the Ensembl Feature of the Ensembl Gene.\n");
8825 
8826         return ajFalse;
8827     }
8828 
8829     if (!ensSliceIsCircular(gslice, &circular))
8830         return ajFalse;
8831 
8832     if ((ensFeatureGetStart(gfeature) < 1) ||
8833         (ensFeatureGetEnd(gfeature) > (ajint) ensSliceCalculateLength(gslice)))
8834     {
8835         if (circular == ajTrue)
8836             tslice = ensSliceNewRef(gslice);
8837         else
8838         {
8839             sla = ensRegistryGetSliceadaptor(dba);
8840 
8841             ensSliceadaptorFetchByFeature(sla, gfeature, 0, &tslice);
8842         }
8843     }
8844     else
8845         tslice = ensSliceNewRef(gslice);
8846 
8847     constraint = ajFmtStr(
8848         "transcript.gene_id = %u",
8849         ensGeneGetIdentifier(gene));
8850 
8851     list = ajListNew();
8852 
8853     ensFeatureadaptorFetchAllbySlice(tca,
8854                                      tslice,
8855                                      constraint,
8856                                      (const AjPStr) NULL,
8857                                      list);
8858 
8859     while (ajListPop(list, (void **) &transcript))
8860     {
8861         if (ensGeneGetCanonicaltranscriptidentifier(gene) ==
8862             ensTranscriptGetIdentifier(transcript))
8863             ensTranscriptSetCanonical(transcript, ajTrue);
8864 
8865         if (ensSliceMatch(gslice, tslice))
8866             ajListPushAppend(transcripts, (void *) transcript);
8867         else
8868         {
8869             newtranscript = ensTranscriptTransfer(transcript, tslice);
8870 
8871             ajListPushAppend(transcripts, (void *) newtranscript);
8872 
8873             ensTranscriptDel(&transcript);
8874         }
8875     }
8876 
8877     ajListFree(&list);
8878 
8879     ajStrDel(&constraint);
8880 
8881     ensSliceDel(&tslice);
8882 
8883     return ajTrue;
8884 }
8885 
8886 
8887 
8888 
8889 /* @func ensTranscriptadaptorFetchAllbyIdentifiers ****************************
8890 **
8891 ** Fetch all Ensembl Transcript objects by an AJAX Table of
8892 ** AJAX unsigned integer key data and assign them as value data.
8893 **
8894 ** The caller is responsible for deleting the AJAX unsigned integer key and
8895 ** Ensembl Transcript value data before deleting the AJAX Table.
8896 **
8897 ** @cc Bio::EnsEMBL::DBSQL::BaseAdaptor::fetch_all_by_dbID_list
8898 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8899 ** @param [u] transcripts [AjPTable]
8900 ** AJAX Table of
8901 ** AJAX unsigned integer key data and
8902 ** Ensembl Transcript value data
8903 **
8904 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
8905 **
8906 ** @release 6.4.0
8907 ** @@
8908 ******************************************************************************/
8909 
ensTranscriptadaptorFetchAllbyIdentifiers(EnsPTranscriptadaptor tca,AjPTable transcripts)8910 AjBool ensTranscriptadaptorFetchAllbyIdentifiers(
8911     EnsPTranscriptadaptor tca,
8912     AjPTable transcripts)
8913 {
8914     return ensBaseadaptorFetchAllbyIdentifiers(
8915         ensTranscriptadaptorGetBaseadaptor(tca),
8916         (EnsPSlice) NULL,
8917         (ajuint (*)(const void *)) &ensTranscriptGetIdentifier,
8918         transcripts);
8919 }
8920 
8921 
8922 
8923 
8924 /* @funcstatic transcriptadaptorListTranscriptExonRankValdel ******************
8925 **
8926 ** An ajTableSetDestroyvalue "valdel" function to clear AJAX Table value data.
8927 ** This function removes and deletes Exon Transcript Rank objects
8928 ** from an AJAX List object, before deleting the AJAX List object.
8929 **
8930 ** @param [d] Pvalue [void**] AJAX List address
8931 ** @see ajTableSetDestroyvalue
8932 **
8933 ** @return [void]
8934 **
8935 ** @release 6.4.0
8936 ** @@
8937 ******************************************************************************/
8938 
transcriptadaptorListTranscriptExonRankValdel(void ** Pvalue)8939 static void transcriptadaptorListTranscriptExonRankValdel(void **Pvalue)
8940 {
8941     TranscriptPExonRank trex = NULL;
8942 
8943     if (!Pvalue)
8944         return;
8945 
8946     if (!*Pvalue)
8947         return;
8948 
8949     while (ajListPop(*((AjPList *) Pvalue), (void **) &trex))
8950         transcriptExonRankDel(&trex);
8951 
8952     ajListFree((AjPList *) Pvalue);
8953 
8954     return;
8955 }
8956 
8957 
8958 
8959 
8960 /* @func ensTranscriptadaptorFetchAllbySlice **********************************
8961 **
8962 ** Fetch all Ensembl Transcript objects via an Ensembl Slice.
8963 **
8964 ** The caller is responsible for deleting the Ensembl Transcript objects before
8965 ** deleting the AJAX List.
8966 **
8967 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_all_by_Slice
8968 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
8969 ** @param [u] slice [EnsPSlice] Ensembl Slice
8970 ** @param [rN] anname [const AjPStr] Ensembl Analysis name
8971 ** @param [rN] constraint [const AjPStr] SQL constraint
8972 ** @param [r] loadexons [AjBool] Load Ensembl Exon objects
8973 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
8974 **
8975 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
8976 **
8977 ** @release 6.4.0
8978 ** @@
8979 ******************************************************************************/
8980 
ensTranscriptadaptorFetchAllbySlice(EnsPTranscriptadaptor tca,EnsPSlice slice,const AjPStr anname,const AjPStr constraint,AjBool loadexons,AjPList transcripts)8981 AjBool ensTranscriptadaptorFetchAllbySlice(
8982     EnsPTranscriptadaptor tca,
8983     EnsPSlice slice,
8984     const AjPStr anname,
8985     const AjPStr constraint,
8986     AjBool loadexons,
8987     AjPList transcripts)
8988 {
8989     void **keyarray = NULL;
8990 
8991     ajint start = INT_MAX;
8992     ajint end   = INT_MIN;
8993     ajint rank  = 0;
8994 
8995     register ajuint i = 0U;
8996 
8997     ajuint exid = 0U;
8998     ajuint trid = 0U;
8999 
9000     ajuint *Pidentifier = NULL;
9001 
9002     AjIList iter  = NULL;
9003     AjPList exons = NULL;
9004     AjPList list  = NULL;
9005 
9006     AjPSqlstatement sqls = NULL;
9007     AjISqlrow sqli       = NULL;
9008     AjPSqlrow sqlr       = NULL;
9009 
9010     AjPStr statement    = NULL;
9011     AjPStr trconstraint = NULL;
9012     AjPStr csv          = NULL;
9013 
9014     AjPTable extable = NULL;
9015     AjPTable trtable = NULL;
9016 
9017     EnsPDatabaseadaptor dba = NULL;
9018 
9019     EnsPExon exon      = NULL;
9020     EnsPExon newexon   = NULL;
9021     EnsPExonadaptor ea = NULL;
9022 
9023     EnsPFeature feature = NULL;
9024 
9025     EnsPSlice newslice   = NULL;
9026     EnsPSliceadaptor sla = NULL;
9027 
9028     EnsPTranscript transcript = NULL;
9029 
9030     EnsPTranslationadaptor tla = NULL;
9031 
9032     TranscriptPExonRank trex = NULL;
9033 
9034     if (!tca)
9035         return ajFalse;
9036 
9037     if (!slice)
9038         return ajFalse;
9039 
9040     if (!transcripts)
9041         return ajFalse;
9042 
9043     if (constraint && ajStrGetLen(constraint))
9044         trconstraint = ajFmtStr("transcript.is_current = 1 AND %S",
9045                                 constraint);
9046     else
9047         trconstraint = ajStrNewC("transcript.is_current = 1");
9048 
9049     ensFeatureadaptorFetchAllbySlice(tca,
9050                                      slice,
9051                                      trconstraint,
9052                                      anname,
9053                                      transcripts);
9054 
9055     ajStrDel(&trconstraint);
9056 
9057     /* If there is no or just one Ensembl Transcript, still do lazy-loading. */
9058 
9059     if ((!loadexons) || (ajListGetLength(transcripts) == 0))
9060         return ajTrue;
9061 
9062     /*
9063     ** Preload all Ensembl Exon objects now, instead of lazy loading later,
9064     ** which is faster than one SQL query per Transcript.
9065     ** First check if the Ensembl Exon objects are already preloaded.
9066     ** TODO: This should test all Ensembl Exon objects.
9067     */
9068 
9069     ajListPeekFirst(transcripts, (void **) &transcript);
9070 
9071     if (transcript->Exons)
9072         return ajTrue;
9073 
9074     dba = ensTranscriptadaptorGetDatabaseadaptor(tca);
9075 
9076     ea  = ensRegistryGetExonadaptor(dba);
9077     sla = ensRegistryGetSliceadaptor(dba);
9078     tla = ensRegistryGetTranslationadaptor(dba);
9079 
9080     /*
9081     ** Get the extent of the region spanned by Ensembl Transcript objects,
9082     ** prepare a comma-separared list of Ensembl Transcript identifier
9083     ** instances and put Ensembl Transcript objects into an AJAX Table
9084     ** indexed by their identifier.
9085     */
9086 
9087     csv = ajStrNew();
9088 
9089     trtable = ajTableuintNew(0U);
9090 
9091     ajTableSetDestroyvalue(trtable, (void (*)(void **)) &ensTranscriptDel);
9092 
9093     iter = ajListIterNew(transcripts);
9094 
9095     while (!ajListIterDone(iter))
9096     {
9097         transcript = (EnsPTranscript) ajListIterGet(iter);
9098 
9099         trid = ensTranscriptGetIdentifier(transcript);
9100 
9101         feature = ensTranscriptGetFeature(transcript);
9102 
9103         start = (ensFeatureGetSeqregionStart(feature) < start) ?
9104             ensFeatureGetSeqregionStart(feature) : start;
9105 
9106         end = (ensFeatureGetSeqregionEnd(feature) > end) ?
9107             ensFeatureGetSeqregionEnd(feature) : end;
9108 
9109         ajFmtPrintAppS(&csv, "%u, ", trid);
9110 
9111         /*
9112         ** Put all Ensembl Transcript objects into an AJAX Table indexed by
9113         ** their identifier.
9114         */
9115 
9116         if (ajTableMatchV(trtable, (const void *) &trid))
9117             ajDebug("ensTranscriptadaptorFetchAllbySlice got duplicate "
9118                     "Ensembl Transcript with identifier %u.\n", trid);
9119         else
9120         {
9121             AJNEW0(Pidentifier);
9122 
9123             *Pidentifier = trid;
9124 
9125             ajTablePut(trtable,
9126                        (void *) Pidentifier,
9127                        (void *) ensTranscriptNewRef(transcript));
9128         }
9129     }
9130 
9131     ajListIterDel(&iter);
9132 
9133     /* Remove the last comma and space from the comma-separated values. */
9134 
9135     ajStrCutEnd(&csv, 2);
9136 
9137     if ((start >= ensSliceGetStart(slice)) && (end <= ensSliceGetEnd(slice)))
9138         newslice = ensSliceNewRef(slice);
9139     else
9140         ensSliceadaptorFetchBySlice(sla,
9141                                     slice,
9142                                     start,
9143                                     end,
9144                                     ensSliceGetStrand(slice),
9145                                     &newslice);
9146 
9147     /*
9148     ** Associate Ensembl Exon identifiers with Ensembl Transcript objects and
9149     ** Ensembl Exon ranks.
9150     */
9151 
9152     statement = ajFmtStr(
9153         "SELECT "
9154         "exon_transcript.transcript_id, "
9155         "exon_transcript.exon_id, "
9156         "exon_transcript.rank "
9157         "FROM "
9158         "exon_transcript "
9159         "WHERE "
9160         "exon_transcript.transcript_id IN (%S)",
9161         csv);
9162 
9163     ajStrAssignClear(&csv);
9164 
9165     extable = ajTableuintNew(0U);
9166 
9167     ajTableSetDestroyvalue(
9168         extable,
9169         (void (*)(void **)) &transcriptadaptorListTranscriptExonRankValdel);
9170 
9171     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
9172 
9173     sqli = ajSqlrowiterNew(sqls);
9174 
9175     while (!ajSqlrowiterDone(sqli))
9176     {
9177         trid = 0U;
9178         exid = 0U;
9179         rank = 0;
9180 
9181         sqlr = ajSqlrowiterGet(sqli);
9182 
9183         ajSqlcolumnToUint(sqlr, &trid);
9184         ajSqlcolumnToUint(sqlr, &exid);
9185         ajSqlcolumnToInt(sqlr, &rank);
9186 
9187         list = (AjPList) ajTableFetchmodV(extable, (const void *) &exid);
9188 
9189         if (!list)
9190         {
9191             AJNEW0(Pidentifier);
9192 
9193             *Pidentifier = exid;
9194 
9195             list = ajListNew();
9196 
9197             ajTablePut(extable, (void *) Pidentifier, (void *) list);
9198         }
9199 
9200         ajListPushAppend(list, (void *) transcriptExonRankNew(trid, rank));
9201     }
9202 
9203     ajSqlrowiterDel(&sqli);
9204 
9205     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
9206 
9207     ajStrDel(&statement);
9208 
9209     /* Get all Ensembl Exon identifiers as comma-separated values. */
9210 
9211     ajTableToarrayKeys(extable, &keyarray);
9212 
9213     for (i = 0U; keyarray[i]; i++)
9214         ajFmtPrintAppS(&csv, "%u, ", *((ajuint *) keyarray[i]));
9215 
9216     AJFREE(keyarray);
9217 
9218     /* Remove the last comma and space from the comma-separated values. */
9219 
9220     ajStrCutEnd(&csv, 2);
9221 
9222     trconstraint = ajFmtStr("exon.exon_id IN (%S)", csv);
9223 
9224     ajStrDel(&csv);
9225 
9226     exons = ajListNew();
9227 
9228     ensExonadaptorFetchAllbySlice(ea, newslice, trconstraint, exons);
9229 
9230     ajStrDel(&trconstraint);
9231 
9232     /*
9233     ** Transfer Ensembl Exon objects onto the Ensembl Transcript Slice and add
9234     ** them to Ensembl Transcript objects.
9235     */
9236 
9237     while (ajListPop(exons, (void **) &exon))
9238     {
9239         newexon = ensExonTransfer(exon, newslice);
9240 
9241         if (!newexon)
9242             ajFatal("ensTranscriptAdaptorFetchAllbySlice could not transfer "
9243                     "Exon onto new Slice.\n");
9244 
9245         exid = ensExonGetIdentifier(newexon);
9246 
9247         list = (AjPList) ajTableFetchmodV(extable, (const void *) &exid);
9248 
9249         iter = ajListIterNew(list);
9250 
9251         while (!ajListIterDone(iter))
9252         {
9253             trex = (TranscriptPExonRank) ajListIterGet(iter);
9254 
9255             transcript = (EnsPTranscript) ajTableFetchmodV(
9256                 trtable,
9257                 (const void *) &trex->Transcriptidentifier);
9258 
9259             ensTranscriptAddExon(transcript, newexon, trex->Rank);
9260         }
9261 
9262         ajListIterDel(&iter);
9263 
9264         ensExonDel(&newexon);
9265         ensExonDel(&exon);
9266     }
9267 
9268     ajListFree(&exons);
9269 
9270     ensTranslationadaptorFetchAllbyTranscriptsTable(tla, trtable);
9271 
9272     /*
9273     ** Clear and delete the AJAX Table of
9274     ** AJAX unsigned integer key and
9275     ** Ensembl Transcript value data.
9276     */
9277 
9278     ajTableDel(&trtable);
9279 
9280     /*
9281     ** Clear and detete the AJAX Table of
9282     ** AJAX unsigned integer key and
9283     ** AJAX List value data.
9284     ** Also delete the transcriptExonRank objects from the AJAX List objects.
9285     */
9286 
9287     ajTableDel(&extable);
9288 
9289     ensSliceDel(&newslice);
9290 
9291     return ajTrue;
9292 }
9293 
9294 
9295 
9296 
9297 /* @func ensTranscriptadaptorFetchAllbyStableidentifier ***********************
9298 **
9299 ** Fetch all Ensembl Transcript versions via a stable identifier.
9300 **
9301 ** The caller is responsible for deleting the Ensembl Transcript objects before
9302 ** deleting the AJAX List.
9303 **
9304 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_all_versions_by_stable_id
9305 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
9306 ** @param [r] stableid [const AjPStr] Stable identifier
9307 ** @param [u] transcripts [AjPList] AJAX List of Ensembl Transcript objects
9308 **
9309 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
9310 **
9311 ** @release 6.4.0
9312 ** @@
9313 ******************************************************************************/
9314 
ensTranscriptadaptorFetchAllbyStableidentifier(EnsPTranscriptadaptor tca,const AjPStr stableid,AjPList transcripts)9315 AjBool ensTranscriptadaptorFetchAllbyStableidentifier(
9316     EnsPTranscriptadaptor tca,
9317     const AjPStr stableid,
9318     AjPList transcripts)
9319 {
9320     char *txtstableid = NULL;
9321 
9322     AjBool result = AJFALSE;
9323 
9324     AjPStr constraint = NULL;
9325 
9326     EnsPBaseadaptor ba = NULL;
9327 
9328     if (!tca)
9329         return ajFalse;
9330 
9331     if (!stableid)
9332         return ajFalse;
9333 
9334     if (!transcripts)
9335         return ajFalse;
9336 
9337     ba = ensTranscriptadaptorGetBaseadaptor(tca);
9338 
9339     ensBaseadaptorEscapeC(ba, &txtstableid, stableid);
9340 
9341     constraint = ajFmtStr("transcript.stable_id = '%s'",
9342                           txtstableid);
9343 
9344     ajCharDel(&txtstableid);
9345 
9346     result = ensBaseadaptorFetchAllbyConstraint(
9347         ba,
9348         constraint,
9349         (EnsPAssemblymapper) NULL,
9350         (EnsPSlice) NULL,
9351         transcripts);
9352 
9353     ajStrDel(&constraint);
9354 
9355     return result;
9356 }
9357 
9358 
9359 
9360 
9361 /* @func ensTranscriptadaptorFetchByDisplaylabel ******************************
9362 **
9363 ** Fetch an Ensembl Transcript via its display label.
9364 **
9365 ** The caller is responsible for deleting the Ensembl Transcript.
9366 **
9367 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_by_display_label
9368 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
9369 ** @param [r] label [const AjPStr] Display label
9370 ** @param [wP] Ptranscript [EnsPTranscript*] Ensembl Transcript address
9371 **
9372 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
9373 **
9374 ** @release 6.4.0
9375 ** @@
9376 ******************************************************************************/
9377 
ensTranscriptadaptorFetchByDisplaylabel(EnsPTranscriptadaptor tca,const AjPStr label,EnsPTranscript * Ptranscript)9378 AjBool ensTranscriptadaptorFetchByDisplaylabel(
9379     EnsPTranscriptadaptor tca,
9380     const AjPStr label,
9381     EnsPTranscript *Ptranscript)
9382 {
9383     char *txtlabel = NULL;
9384 
9385     AjBool result = AJFALSE;
9386 
9387     AjPList transcripts = NULL;
9388 
9389     AjPStr constraint = NULL;
9390 
9391     EnsPBaseadaptor ba = NULL;
9392 
9393     EnsPTranscript transcript = NULL;
9394 
9395     if (!tca)
9396         return ajFalse;
9397 
9398     if (!label)
9399         return ajFalse;
9400 
9401     if (!Ptranscript)
9402         return ajFalse;
9403 
9404     *Ptranscript = NULL;
9405 
9406     ba = ensTranscriptadaptorGetBaseadaptor(tca);
9407 
9408     ensBaseadaptorEscapeC(ba, &txtlabel, label);
9409 
9410     constraint = ajFmtStr(
9411         "transcript.is_current = 1 "
9412         "AND "
9413         "xref.display_label = '%s'",
9414         txtlabel);
9415 
9416     ajCharDel(&txtlabel);
9417 
9418     transcripts = ajListNew();
9419 
9420     result = ensBaseadaptorFetchAllbyConstraint(
9421         ba,
9422         constraint,
9423         (EnsPAssemblymapper) NULL,
9424         (EnsPSlice) NULL,
9425         transcripts);
9426 
9427     if (ajListGetLength(transcripts) > 1)
9428         ajDebug("ensTranscriptadaptorFetchByDisplaylabel got more than one "
9429                 "Transcript for display label '%S'.\n", label);
9430 
9431     ajListPop(transcripts, (void **) Ptranscript);
9432 
9433     while (ajListPop(transcripts, (void **) &transcript))
9434         ensTranscriptDel(&transcript);
9435 
9436     ajListFree(&transcripts);
9437 
9438     ajStrDel(&constraint);
9439 
9440     return result;
9441 }
9442 
9443 
9444 
9445 
9446 /* @func ensTranscriptadaptorFetchByIdentifier ********************************
9447 **
9448 ** Fetch an Ensembl Transcript via its SQL database-internal identifier.
9449 ** The caller is responsible for deleting the Ensembl Transcript.
9450 **
9451 ** @cc Bio::EnsEMBL::DBSQL::BaseAdaptor::fetch_by_dbID
9452 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
9453 ** @param [r] identifier [ajuint] SQL database-internal identifier
9454 ** @param [wP] Ptranscript [EnsPTranscript*] Ensembl Transcript address
9455 **
9456 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
9457 **
9458 ** @release 6.2.0
9459 ** @@
9460 ******************************************************************************/
9461 
ensTranscriptadaptorFetchByIdentifier(EnsPTranscriptadaptor tca,ajuint identifier,EnsPTranscript * Ptranscript)9462 AjBool ensTranscriptadaptorFetchByIdentifier(
9463     EnsPTranscriptadaptor tca,
9464     ajuint identifier,
9465     EnsPTranscript *Ptranscript)
9466 {
9467     return ensBaseadaptorFetchByIdentifier(
9468         ensTranscriptadaptorGetBaseadaptor(tca),
9469         identifier,
9470         (void **) Ptranscript);
9471 }
9472 
9473 
9474 
9475 
9476 /* @func ensTranscriptadaptorFetchByStableidentifier **************************
9477 **
9478 ** Fetch an Ensembl Transcript via its stable identifier and version.
9479 ** In case a version is not specified, the current Ensembl Transcript
9480 ** will be returned.
9481 ** The caller is responsible for deleting the Ensembl Transcript.
9482 **
9483 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_by_stable_id
9484 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
9485 ** @param [r] stableid [const AjPStr] Stable identifier
9486 ** @param [r] version [ajuint] Version
9487 ** @param [wP] Ptranscript [EnsPTranscript*] Ensembl Transcript address
9488 **
9489 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
9490 **
9491 ** @release 6.4.0
9492 ** @@
9493 ******************************************************************************/
9494 
ensTranscriptadaptorFetchByStableidentifier(EnsPTranscriptadaptor tca,const AjPStr stableid,ajuint version,EnsPTranscript * Ptranscript)9495 AjBool ensTranscriptadaptorFetchByStableidentifier(
9496     EnsPTranscriptadaptor tca,
9497     const AjPStr stableid,
9498     ajuint version,
9499     EnsPTranscript *Ptranscript)
9500 {
9501     char *txtstableid = NULL;
9502 
9503     AjBool result = AJFALSE;
9504 
9505     AjPList transcripts = NULL;
9506 
9507     AjPStr constraint = NULL;
9508 
9509     EnsPBaseadaptor ba = NULL;
9510 
9511     EnsPTranscript transcript = NULL;
9512 
9513     if (!tca)
9514         return ajFalse;
9515 
9516     if (!stableid)
9517         return ajFalse;
9518 
9519     if (!Ptranscript)
9520         return ajFalse;
9521 
9522     *Ptranscript = NULL;
9523 
9524     ba = ensTranscriptadaptorGetBaseadaptor(tca);
9525 
9526     ensBaseadaptorEscapeC(ba, &txtstableid, stableid);
9527 
9528     if (version)
9529         constraint = ajFmtStr(
9530             "transcript.stable_id = '%s' "
9531             "AND "
9532             "transcript.version = %u",
9533             txtstableid,
9534             version);
9535     else
9536         constraint = ajFmtStr(
9537             "transcript.stable_id = '%s' "
9538             "AND "
9539             "transcript.is_current = 1",
9540             txtstableid);
9541 
9542     ajCharDel(&txtstableid);
9543 
9544     transcripts = ajListNew();
9545 
9546     result = ensBaseadaptorFetchAllbyConstraint(
9547         ba,
9548         constraint,
9549         (EnsPAssemblymapper) NULL,
9550         (EnsPSlice) NULL,
9551         transcripts);
9552 
9553     if (ajListGetLength(transcripts) > 1)
9554         ajDebug("ensTranscriptadaptorFetchByStableidentifier "
9555                 "got more than one "
9556                 "Ensembl Transcript for stable identifier '%S' and "
9557                 "version %u.\n",
9558                 stableid, version);
9559 
9560     ajListPop(transcripts, (void **) Ptranscript);
9561 
9562     while (ajListPop(transcripts, (void **) &transcript))
9563         ensTranscriptDel(&transcript);
9564 
9565     ajListFree(&transcripts);
9566 
9567     ajStrDel(&constraint);
9568 
9569     return result;
9570 }
9571 
9572 
9573 
9574 
9575 /* @func ensTranscriptadaptorFetchByTranslationidentifier *********************
9576 **
9577 ** Fetch an Ensembl Transcript via its Ensembl Translation identifier.
9578 ** The caller is responsible for deleting the Ensembl Transcript.
9579 **
9580 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_by_translation_id
9581 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
9582 ** @param [r] identifier [ajuint] Ensembl Translation identifier
9583 ** @param [wP] Ptranscript [EnsPTranscript*] Ensembl Transcript address
9584 **
9585 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
9586 **
9587 ** @release 6.4.0
9588 ** @@
9589 ******************************************************************************/
9590 
ensTranscriptadaptorFetchByTranslationidentifier(EnsPTranscriptadaptor tca,ajuint identifier,EnsPTranscript * Ptranscript)9591 AjBool ensTranscriptadaptorFetchByTranslationidentifier(
9592     EnsPTranscriptadaptor tca,
9593     ajuint identifier,
9594     EnsPTranscript *Ptranscript)
9595 {
9596     ajuint trid = 0U;
9597 
9598     AjPSqlstatement sqls = NULL;
9599     AjISqlrow sqli       = NULL;
9600     AjPSqlrow sqlr       = NULL;
9601 
9602     AjPStr statement = NULL;
9603 
9604     EnsPDatabaseadaptor dba = NULL;
9605 
9606     if (!tca)
9607         return ajFalse;
9608 
9609     if (!identifier)
9610         return ajFalse;
9611 
9612     if (!Ptranscript)
9613         return ajFalse;
9614 
9615     *Ptranscript = NULL;
9616 
9617     dba = ensTranscriptadaptorGetDatabaseadaptor(tca);
9618 
9619     statement = ajFmtStr(
9620         "SELECT "
9621         "translation.transcript_id "
9622         "FROM "
9623         "translation "
9624         "WHERE "
9625         "translation.translation_id = %u",
9626         identifier);
9627 
9628     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
9629 
9630     sqli = ajSqlrowiterNew(sqls);
9631 
9632     while (!ajSqlrowiterDone(sqli))
9633     {
9634         trid = 0U;
9635 
9636         sqlr = ajSqlrowiterGet(sqli);
9637 
9638         ajSqlcolumnToUint(sqlr, &trid);
9639     }
9640 
9641     ajSqlrowiterDel(&sqli);
9642 
9643     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
9644 
9645     ajStrDel(&statement);
9646 
9647     if (!trid)
9648     {
9649         ajDebug("ensTranscriptadaptorFetchByTranslationidentifier could not "
9650                 "get Transcript identifier for Translation identifier %u.\n",
9651                 identifier);
9652 
9653         return ajFalse;
9654     }
9655 
9656     return ensBaseadaptorFetchByIdentifier(
9657         ensTranscriptadaptorGetBaseadaptor(tca),
9658         trid,
9659         (void **) Ptranscript);
9660 }
9661 
9662 
9663 
9664 
9665 /* @func ensTranscriptadaptorFetchByTranslationstableidentifier ***************
9666 **
9667 ** Fetch an Ensembl Transcript via its Ensembl Translation stable identifier.
9668 ** The caller is responsible for deleting the Ensembl Transcript.
9669 **
9670 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::fetch_by_translation_stable_id
9671 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
9672 ** @param [r] stableid [const AjPStr] Ensembl Translation stable identifier
9673 ** @param [wP] Ptranscript [EnsPTranscript*] Ensembl Transcript address
9674 **
9675 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
9676 **
9677 ** @release 6.4.0
9678 ** @@
9679 ******************************************************************************/
9680 
ensTranscriptadaptorFetchByTranslationstableidentifier(EnsPTranscriptadaptor tca,const AjPStr stableid,EnsPTranscript * Ptranscript)9681 AjBool ensTranscriptadaptorFetchByTranslationstableidentifier(
9682     EnsPTranscriptadaptor tca,
9683     const AjPStr stableid,
9684     EnsPTranscript *Ptranscript)
9685 {
9686     char *txtstableid = NULL;
9687 
9688     ajuint trid = 0U;
9689 
9690     AjPSqlstatement sqls = NULL;
9691     AjISqlrow sqli       = NULL;
9692     AjPSqlrow sqlr       = NULL;
9693 
9694     AjPStr statement = NULL;
9695 
9696     EnsPDatabaseadaptor dba = NULL;
9697 
9698     if (!tca)
9699         return ajFalse;
9700 
9701     if (!stableid)
9702         return ajFalse;
9703 
9704     if (!Ptranscript)
9705         return ajFalse;
9706 
9707     *Ptranscript = NULL;
9708 
9709     dba = ensTranscriptadaptorGetDatabaseadaptor(tca);
9710 
9711     ensDatabaseadaptorEscapeC(dba, &txtstableid, stableid);
9712 
9713     statement = ajFmtStr(
9714         "SELECT "
9715         "transcript.transcript_id "
9716         "FROM "
9717         "translation, "
9718         "transcript "
9719         "WHERE "
9720         "translation.stable_id = '%s' "
9721         "AND "
9722         "translation.transcript_id = transcript.transcript_id "
9723         "AND "
9724         "transcript.is_current = 1",
9725         txtstableid);
9726 
9727     ajCharDel(&txtstableid);
9728 
9729     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
9730 
9731     sqli = ajSqlrowiterNew(sqls);
9732 
9733     while (!ajSqlrowiterDone(sqli))
9734     {
9735         trid = 0U;
9736 
9737         sqlr = ajSqlrowiterGet(sqli);
9738 
9739         ajSqlcolumnToUint(sqlr, &trid);
9740     }
9741 
9742     ajSqlrowiterDel(&sqli);
9743 
9744     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
9745 
9746     ajStrDel(&statement);
9747 
9748     if (!trid)
9749     {
9750         ajDebug("ensTranscriptadaptorFetchByTranslationstableidentifier "
9751                 "could not get an Ensembl Transcript identifier for "
9752                 "Ensembl Translation stable identifier '%S'.\n",
9753                 stableid);
9754 
9755         return ajFalse;
9756     }
9757 
9758     return ensBaseadaptorFetchByIdentifier(
9759         ensTranscriptadaptorGetBaseadaptor(tca),
9760         trid,
9761         (void **) Ptranscript);
9762 }
9763 
9764 
9765 
9766 
9767 /* @section accessory object retrieval ****************************************
9768 **
9769 ** Functions for retrieving objects releated to Ensembl Transcript objects
9770 ** from an Ensembl SQL database.
9771 **
9772 ** @fdata [EnsPTranscriptadaptor]
9773 **
9774 ** @nam3rule Retrieve Retrieve Ensembl Transcript-releated object(s)
9775 ** @nam4rule All Retrieve all Ensembl Transcript-releated objects
9776 ** @nam5rule Identifiers Retrieve all SQL database-internal identifier objects
9777 ** @nam5rule Stableidentifiers Retrieve all stable identifier objects
9778 ** @nam4rule Canonical Retrieve the canonical flag
9779 **
9780 ** @argrule * tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
9781 ** @argrule AllIdentifiers identifiers [AjPList]
9782 ** AJAX List of AJAX unsigned integer (Ensembl Transcript identifier) objects
9783 ** @argrule AllStableidentifiers stableids [AjPList]
9784 ** AJAX List of AJAX String (Ensembl Transcript stable identifier) objects
9785 ** @argrule Canonical transcript [EnsPTranscript] Ensembl Transcript
9786 ** @argrule Canonical Pcanonical [AjBool*] Canonical flag
9787 **
9788 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
9789 **
9790 ** @fcategory use
9791 ******************************************************************************/
9792 
9793 
9794 
9795 
9796 /* @func ensTranscriptadaptorRetrieveAllIdentifiers ***************************
9797 **
9798 ** Retrieve all SQL database-internal identifier objects of
9799 ** Ensembl Transcript objects.
9800 **
9801 ** The caller is responsible for deleting the AJAX unsigned integer objects
9802 ** before deleting the AJAX List.
9803 **
9804 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::list_dbIDs
9805 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
9806 ** @param [u] identifiers [AjPList]
9807 ** AJAX List of AJAX unsigned integer (Ensembl Transcript identifier) objects
9808 **
9809 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
9810 **
9811 ** @release 6.4.0
9812 ** @@
9813 ******************************************************************************/
9814 
ensTranscriptadaptorRetrieveAllIdentifiers(EnsPTranscriptadaptor tca,AjPList identifiers)9815 AjBool ensTranscriptadaptorRetrieveAllIdentifiers(
9816     EnsPTranscriptadaptor tca,
9817     AjPList identifiers)
9818 {
9819     AjBool result = AJFALSE;
9820 
9821     AjPStr table = NULL;
9822 
9823     if (!tca)
9824         return ajFalse;
9825 
9826     if (!identifiers)
9827         return ajFalse;
9828 
9829     table = ajStrNewC("transcript");
9830 
9831     result = ensBaseadaptorRetrieveAllIdentifiers(
9832         ensTranscriptadaptorGetBaseadaptor(tca),
9833         table,
9834         (AjPStr) NULL,
9835         identifiers);
9836 
9837     ajStrDel(&table);
9838 
9839     return result;
9840 }
9841 
9842 
9843 
9844 
9845 /* @func ensTranscriptadaptorRetrieveAllStableidentifiers *********************
9846 **
9847 ** Retrieve all stable identifier objects of Ensembl Transcript objects.
9848 **
9849 ** The caller is responsible for deleting the AJAX String objects before
9850 ** deleting the AJAX List.
9851 **
9852 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::list_stable_ids
9853 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
9854 ** @param [u] stableids [AjPList]
9855 ** AJAX List of AJAX String (Ensembl Transcript stable identifier) objects
9856 **
9857 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
9858 **
9859 ** @release 6.4.0
9860 ** @@
9861 ******************************************************************************/
9862 
ensTranscriptadaptorRetrieveAllStableidentifiers(EnsPTranscriptadaptor tca,AjPList stableids)9863 AjBool ensTranscriptadaptorRetrieveAllStableidentifiers(
9864     EnsPTranscriptadaptor tca,
9865     AjPList stableids)
9866 {
9867     AjBool result = AJFALSE;
9868 
9869     AjPStr primary = NULL;
9870     AjPStr table   = NULL;
9871 
9872     if (!tca)
9873         return ajFalse;
9874 
9875     if (!stableids)
9876         return ajFalse;
9877 
9878     table   = ajStrNewC("transcript");
9879     primary = ajStrNewC("stable_id");
9880 
9881     result = ensBaseadaptorRetrieveAllStrings(
9882         ensTranscriptadaptorGetBaseadaptor(tca),
9883         table,
9884         primary,
9885         stableids);
9886 
9887     ajStrDel(&table);
9888     ajStrDel(&primary);
9889 
9890     return result;
9891 }
9892 
9893 
9894 
9895 
9896 /* @func ensTranscriptadaptorRetrieveCanonical ********************************
9897 **
9898 ** Retrieve the canonical attribute of an Ensembl Transcript.
9899 **
9900 ** The caller is responsible for deleting the AJAX Boolean object.
9901 **
9902 ** @cc Bio::EnsEMBL::DBSQL::TranscriptAdaptor::is_Transcript_canonical
9903 ** @param [u] tca [EnsPTranscriptadaptor] Ensembl Transcript Adaptor
9904 ** @param [u] transcript [EnsPTranscript] Ensembl Transcript
9905 ** @param [u] Pcanonical [AjBool*] Canonical attribute
9906 **
9907 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
9908 **
9909 ** @release 6.5.0
9910 ** @@
9911 ******************************************************************************/
9912 
ensTranscriptadaptorRetrieveCanonical(EnsPTranscriptadaptor tca,EnsPTranscript transcript,AjBool * Pcanonical)9913 AjBool ensTranscriptadaptorRetrieveCanonical(
9914     EnsPTranscriptadaptor tca,
9915     EnsPTranscript transcript,
9916     AjBool *Pcanonical)
9917 {
9918     ajuint count = 0U;
9919 
9920     AjBool result = AJFALSE;
9921 
9922     AjPSqlstatement sqls = NULL;
9923     AjISqlrow sqli       = NULL;
9924     AjPSqlrow sqlr       = NULL;
9925 
9926     AjPStr statement = NULL;
9927 
9928     EnsPDatabaseadaptor dba = NULL;
9929 
9930     if (!tca)
9931         return ajFalse;
9932 
9933     if (!transcript)
9934         return ajFalse;
9935 
9936     if (!Pcanonical)
9937         return ajFalse;
9938 
9939     dba = ensTranscriptadaptorGetDatabaseadaptor(tca);
9940 
9941     statement = ajFmtStr(
9942         "SELECT "
9943         "count(*) "
9944         "FROM "
9945         "gene "
9946         "WHERE "
9947         "gene.canonical_transcript_id = %u",
9948         ensTranscriptGetIdentifier(transcript));
9949 
9950     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
9951 
9952     sqli = ajSqlrowiterNew(sqls);
9953 
9954     while (!ajSqlrowiterDone(sqli))
9955     {
9956         count = 0U;
9957 
9958         sqlr = ajSqlrowiterGet(sqli);
9959 
9960         ajSqlcolumnToUint(sqlr, &count);
9961 
9962         if (count)
9963         {
9964             *Pcanonical = ajTrue;
9965 
9966             ensTranscriptSetCanonical(transcript, ajTrue);
9967         }
9968         else
9969         {
9970             *Pcanonical = ajFalse;
9971 
9972             ensTranscriptSetCanonical(transcript, ajFalse);
9973         }
9974     }
9975 
9976     ajSqlrowiterDel(&sqli);
9977 
9978     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
9979 
9980     ajStrDel(&statement);
9981 
9982     return result;
9983 }
9984