package Ġru . nr ck i . bio kotlin Ċ Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . ln Ċ import Ġkotlin . math . sqrt Ċ Ċ class ĠDistance (){ ĊĊ ĉ fun Ġraw Distance ( seq 1 : ĠI Bio Sequence , Ġseq 2 : ĠI Bio Sequence ): ĠDouble Ġ{ ĊĉĉĊĉ ĉ if ( seq 1 . gap length Ġ== Ġseq 1 . length ) Ġ{ Ċĉĉ ĉ throw ĠException (" Error ! ĠImp ossible Ġto Ġcalculate Ġdistance : Ġ${ seq 1 . id } Ġcontains Ġonly Ġg aps ") Ċĉ ĉ } Ċĉ ĉ if ( seq 2 . gap length Ġ== Ġseq 2 . length ) Ġ{ Ċĉĉ ĉ throw ĠException (" Error ! ĠImp ossible Ġto Ġcalculate Ġdistance : Ġ${ seq 2 . id } Ġcontains Ġonly Ġg aps ") Ċĉ ĉ } ĊĉĉĊĉ ĉ var Ġmatches Ġ= Ġ 0 Ċĉ ĉ var Ġpositions Ġ= Ġ 0 Ċĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġseq 1 . length ){ Ċĉĉ ĉ if Ġ( seq 1 . sequence [ i ] Ġ== Ġseq 2 . sequence [ i ]){ Ċĉĉĉ ĉ if ( seq 1 . sequence [ i ] Ġ!= Ġ'- '){ Ċĉĉĉĉ ĉ positions Ġ+= Ġ 1 Ċĉĉĉĉ ĉ matches Ġ+= Ġ 1 Ċĉĉĉ ĉ } Ċĉĉ ĉ } else { Ċĉĉĉ ĉ positions Ġ+= Ġ 1 Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ return Ġ 1 . 0 Ġ- Ġmatches . toDouble ()/ positions . toDouble () Ċ ĉ } ĊĊ ĉ fun Ġjc Distance ( seq 1 : ĠI Bio Sequence , Ġseq 2 : ĠI Bio Sequence , Ġnu cl : ĠBoolean Ġ= Ġtrue ): ĠDouble Ġ{ Ċĉ ĉ val Ġdistance Ġ= Ġraw Distance ( seq 1 , Ġseq 2 ) ĊĊĉ ĉ // ĠConstant Ġdifferent Ġfor Ġn ucleot ides Ġand Ġproteins Ċĉ ĉ val Ġb Ġ= Ġif ( nu cl ) Ġ 0 . 7 5 Ġelse Ġ 0 . 9 5 ĊĉĉĊĉ ĉ return Ġ- b Ġ* Ġln ( Ġ 1 Ġ- Ġdistance Ġ/ Ġb Ġ) Ċ ĉ } ĊĊ ĉ fun Ġpo isson Distance ( seq 1 : ĠI Bio Sequence , Ġseq 2 : ĠI Bio Sequence ): ĠDouble Ġ{ Ċĉ ĉ return Ġabs ( Ġ- ln ( Ġ 1 Ġ- Ġraw Distance ( seq 1 , Ġseq 2 ) Ġ) Ġ) Ċ ĉ } ĊĊ ĉ fun Ġjc Matrix ( alignment : ĠList < IB io Sequence >, Ġnu cl : ĠBoolean Ġ= Ġtrue ){ Ċĉ ĉ for ( i Ġin Ġ 1 Ġuntil Ġalignment . size ){ Ċĉĉ ĉ print ( alignment [ i ]. id ) Ċĉĉ ĉ for ( j Ġin Ġ 0 Ġuntil Ġi ){ Ċĉĉĉ ĉ print ("\ t ${ jc Distance ( alignment [ i ], Ġalignment [ j ], Ġnu cl )} ") Ċĉĉ ĉ } Ċĉĉ ĉ print ("\ n ") Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġjc Mean Distance ( alignment : ĠList < IB io Sequence >, Ġnu cl : ĠBoolean Ġ= Ġtrue ){ Ċĉ ĉ alignment . forEach (){ query Seq Ġ-> Ċĉĉ ĉ print ("${ query Seq . id }\ t ") Ċĉĉ ĉ println ( Ġalignment . map { jc Distance ( query Seq , it , nu cl )}. sum (). div ( alignment . size Ġ- Ġ 1 ) Ġ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġcalc Transitions ( seq 1 : ĠI Bio Sequence , Ġseq 2 : ĠI Bio Sequence ): ĠInt Ġ{ Ċĉ ĉ var Ġtransitions Ġ= Ġ 0 Ċĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġseq 1 . length ){ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' A ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' G ' Ġ) Ġ) Ġtransitions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' G ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' A ' Ġ) Ġ) Ġtransitions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' C ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' T ' Ġ) Ġ) Ġtransitions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' C ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' U ' Ġ) Ġ) Ġtransitions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' T ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' C ' Ġ) Ġ) Ġtransitions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' U ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' C ' Ġ) Ġ) Ġtransitions ++ Ċĉ ĉ } Ċĉ ĉ return Ġtransitions Ċ ĉ } ĊĊ ĉ fun Ġcalc Trans versions ( seq 1 : ĠI Bio Sequence , Ġseq 2 : ĠI Bio Sequence ): ĠInt Ġ{ Ċĉ ĉ var Ġtrans versions Ġ= Ġ 0 Ċĉ ĉ for ( i Ġin Ġ 0 Ġuntil Ġseq 1 . length ){ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' A ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' C ' Ġ) Ġ) Ġtrans versions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' A ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' T ' Ġ) Ġ) Ġtrans versions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' A ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' U ' Ġ) Ġ) Ġtrans versions ++ ĊĊĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' C ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' G ' Ġ) Ġ) Ġtrans versions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' C ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' A ' Ġ) Ġ) Ġtrans versions ++ ĊĊĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' G ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' C ' Ġ) Ġ) Ġtrans versions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' G ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' T ' Ġ) Ġ) Ġtrans versions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' G ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' U ' Ġ) Ġ) Ġtrans versions ++ ĊĊĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' T ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' A ' Ġ) Ġ) Ġtrans versions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' T ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' G ' Ġ) Ġ) Ġtrans versions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' U ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' A ' Ġ) Ġ) Ġtrans versions ++ Ċĉĉ ĉ if ( Ġ( Ġseq 1 . sequence [ i ] Ġ== Ġ' U ') Ġ&& Ġ( Ġseq 2 . sequence [ i ] Ġ== Ġ' G ' Ġ) Ġ) Ġtrans versions ++ Ċĉ ĉ } Ċĉ ĉ return Ġtrans versions Ċ ĉ } ĊĊ ĉ fun Ġkim ura Distance ( seq 1 : ĠI Bio Sequence , Ġseq 2 : ĠI Bio Sequence ): ĠDouble Ġ{ Ċĉ ĉ val Ġtransitions Ġ= Ġcalc Transitions ( seq 1 , Ġseq 2 ). toDouble () Ġ/ Ġseq 1 . length Ċĉ ĉ val Ġtrans versions Ġ= Ġcalc Trans versions ( seq 1 , Ġseq 2 ). toDouble () Ġ/ Ġseq 1 . length Ċĉ ĉ val Ġdistance Ġ= Ġ- 0 . 5 Ġ* Ġln ( Ġ( 1 . 0 Ġ- Ġ 2 Ġ* Ġtransitions Ġ- Ġtrans versions Ġ) Ġ* Ġsqrt ( Ġ 1 . 0 Ġ- Ġ 2 Ġ* Ġtrans versions Ġ) Ġ) Ċĉ ĉ return Ġabs ( distance ) Ċ ĉ } ĊĊ ĉ fun Ġtam ura Distance ( seq 1 : ĠI Bio Sequence , Ġseq 2 : ĠI Bio Sequence ): ĠDouble Ġ{ Ċĉ ĉ val Ġgc 1 Ġ= Ġseq 1 . sequence . get GC Content () Ċĉ ĉ val Ġgc 2 Ġ= Ġseq 2 . sequence . get GC Content () Ċĉ ĉ val ĠC Ġ= Ġgc 1 Ġ+ Ġgc 2 Ġ- Ġ 2 Ġ* Ġgc 1 Ġ* Ġgc 2 Ċĉ ĉ val Ġtransitions Ġ= Ġcalc Transitions ( seq 1 , Ġseq 2 ). toDouble () Ġ/ Ġseq 1 . length Ċĉ ĉ val Ġtrans versions Ġ= Ġcalc Trans versions ( seq 1 , Ġseq 2 ). toDouble () Ġ/ Ġseq 1 . length Ċĉ ĉ val Ġdistance Ġ= Ġ- C Ġ* Ġln ( 1 . 0 Ġ- Ġtransitions Ġ/ ĠC Ġ- Ġtrans versions ) Ġ- Ġ 0 . 5 Ġ* Ġ( 1 . 0 Ġ- ĠC ) Ġ* Ġln ( 1 . 0 Ġ- Ġ 2 Ġ* Ġtrans versions ) Ċĉ ĉ return Ġabs ( distance ) Ċ ĉ } Ċ Ċ }