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, ¤t);
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