void AntiDOS_update(AntiDOS *dos) { time_t t = time(0); assert(dos!=0); if (t-dos->min_time > ANTIDOS_TIME_BASE) { bool was_changed = false; struct Data *i; dos->min_time = t; for (i = Vector_begin(&dos->data); i!=Vector_end(&dos->data); ++i) { if (t - i->access_time>ANTIDOS_TIME_BASE) { i->ip.s_addr = 0xFFFFFFFF; was_changed = true; } else dos->min_time = MIN(dos->min_time, i->access_time); } if (was_changed) { Vector_sort(&dos->data, Data_sortCompare); for (i=Vector_end(&dos->data); i!=Vector_begin(&dos->data);) { --i; if (i->ip.s_addr!=0xFFFFFFFF) break; Vector_popback(&dos->data); } Vector_resize(&dos->data); } } }
char *Translation_modifyTranslation(Translation *translation, char *seq) { Vector *seqEds = Translation_getAllSeqEdits(translation); // Sort in reverse order to avoid complication of adjusting // downstream edits. // HACK: The translation ENSP00000420939 somehow makes the next line // bomb out ($a or $b becomes undef) if the start() method // is used. I haven't been able to find out why. It has 10 // Selenocysteine seqedits that looks correct. // /Andreas (release 59) if (Vector_getNumElement(seqEds)) { Vector_sort(seqEds, SeqEdit_reverseStartCompFunc); // @seqeds = sort { $b->{'start'} <=> $a->{'start'} } @seqeds; // Apply all edits. // Not particularly efficient currently, could improve by precalculating maximum size of new seq prior to applying edits int i; for (i=0; i<Vector_getNumElement(seqEds); i++) { SeqEdit *se = Vector_getElementAt(seqEds, i); seq = SeqEdit_applyEdit(se, seq); } //$seq->seq($peptide); } Vector_free(seqEds); return seq; }
Vector *getGenes(Slice *slice, int flags) { Vector *genes; genes = Slice_getAllGenes(slice, NULL, NULL, 1, NULL, NULL); Vector_sort(genes, geneStartCompFunc); return genes; }
void PredictionTranscript_sort(PredictionTranscript *trans) { PredictionExon *firstExon = PredictionTranscript_getExonAt(trans,0); int strand; int i; for (i=0; i<PredictionTranscript_getExonCount(trans); i++) { if (!PredictionTranscript_getExonAt(trans,i)) { return; } } strand = PredictionExon_getStrand(firstExon); // Hack in using Exon function names if (strand == 1) { Vector_sort(PredictionTranscript_getExons(trans),Exon_forwardStrandCompFunc); } else if (strand == -1) { Vector_sort(PredictionTranscript_getExons(trans),Exon_reverseStrandCompFunc); } }
Vector *GenomicAlignAdaptor_mergeAlignsets(GenomicAlignAdaptor *gaa, Vector *alignSet1, Vector *alignSet2) { int i; Vector *bigList = Vector_new(); IDHash *overlappingSets[2]; Vector *mergedAligns; for (i=0;i<Vector_getNumElement(alignSet1); i++) { GenomicAlign *align = Vector_getElementAt(alignSet1, i); Vector_addElement(bigList, GenomicAlignListElem_new(DNAFrag_getDbID(GenomicAlign_getQueryDNAFrag(align)), GenomicAlign_getQueryStart(align), align, 0)); Vector_addElement(bigList, GenomicAlignListElem_new(DNAFrag_getDbID(GenomicAlign_getQueryDNAFrag(align)), GenomicAlign_getQueryEnd(align)+0.5, align, 0)); } for (i=0;i<Vector_getNumElement(alignSet2); i++) { GenomicAlign *align = Vector_getElementAt(alignSet2, i); Vector_addElement(bigList, GenomicAlignListElem_new(DNAFrag_getDbID(GenomicAlign_getConsensusDNAFrag(align)), GenomicAlign_getConsensusStart(align), align, 1)); Vector_addElement(bigList, GenomicAlignListElem_new(DNAFrag_getDbID(GenomicAlign_getConsensusDNAFrag(align)), GenomicAlign_getConsensusEnd(align)+0.5, align, 1)); } Vector_sort(bigList, GenomicAlignListElem_compFunc); // walking from start to end through sortlist and keep track of the // currently overlapping set of Alignments overlappingSets[0] = IDHash_new(IDHASH_SMALL); overlappingSets[1] = IDHash_new(IDHASH_SMALL); mergedAligns = Vector_new(); for (i=0; i<Vector_getNumElement(bigList); i++) { GenomicAlignListElem *gale = Vector_getElementAt(bigList,i); GenomicAlign *align = gale->align; IDType alignID = GenomicAlign_getDbID(align); int setNo = gale->setNum; if (IDHash_contains(overlappingSets[setNo], alignID)) { // remove from current overlapping set IDHash_remove(overlappingSets[setNo], alignID, NULL); } else { int j; void **values = IDHash_getValues(overlappingSets[1-setNo]); // insert into the set and do all the overlap business IDHash_add(overlappingSets[setNo], alignID, align); // the other set contains everything this align overlaps with for (j=0; j<IDHash_getNumValues(overlappingSets[1-setNo]); j++) { GenomicAlign *align2 = values[j]; if (setNo == 0) { GenomicAlignAdaptor_addDerivedAlignments(gaa, mergedAligns, align, align2); } else { GenomicAlignAdaptor_addDerivedAlignments(gaa, mergedAligns, align2, align); } } free(values); } } // NIY Free gale return mergedAligns; }