package Ġorg . jetbrains . bio . big Ċ Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġcom . google . common . base . Char Matcher Ċ import Ġcom . google . common . base . More Objects Ċ import Ġcom . google . common . base . Splitter Ċ import Ġcom . google . common . collect . Comparison Chain Ċ import Ġg nu . tro ve . list . T Float List Ċ import Ġg nu . tro ve . list . T Int List Ċ import Ġg nu . tro ve . list . array . T Float ArrayList Ċ import Ġg nu . tro ve . list . array . T Int ArrayList Ċ import Ġorg . jetbrains . bio .* Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . Writer Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠA Ġbasic ĠW IG Ġformat Ġparser . Ċ Ġ* Ċ Ġ* ĠAccording Ġto Ġthe Ġspec . ĠW IG Ġpositions Ġare Ġ* always * Ġ 1 - based , Ġthus Ġwe Ġmanually Ċ Ġ* Ġconvert Ġthem Ġto Ġ 0 - based Ġduring Ġparsing . Ċ Ġ* Ċ Ġ* ĠSee Ġhttp :// genome . uc sc . edu / golden Path / help / w ig gle . html Ċ Ġ*/ Ċ class ĠW ig File ( private Ġval Ġpath : ĠPath ) Ġ: ĠIterable < W ig Section > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < W ig Section > Ġ= ĠW ig Iterator ( path . buffered Reader ()) Ċ } Ċ Ċ @ Visible ForTesting Ċ internal Ġclass ĠW ig Iterator ( reader : ĠBufferedReader ) Ġ: ĠC aching Iterator < W ig Section >( reader ) Ġ{ ĊĠĠĠ Ġ@ Suppress (" platform _ class _ mapped _ to _ kotlin ") ĊĠĠĠ Ġoverride Ġfun Ġcache (): ĠW ig Section ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtrack : ĠW ig Section ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġstate Ġ= ĠState . WAIT ING ĊĠĠĠĠĠĠĠ Ġloop @ Ġwhile Ġ( lines . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJava Ġtri mm ing Ġdoes Ġnot Ġallocate Ġa Ġnew Ġstring Ġif Ġthere 's ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnothing Ġto Ġtrim . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ( lines . peek () Ġas Ġjava . lang . String ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . startsWith ('# ') Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ loop Ġ Ġ// ĠSkip Ġcomments . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ!= ĠState . WAIT ING Ġ&& ĠMETA _ MATCH ER . matches ( line . first ()) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ loop ĠĠĠĠ Ġ// ĠMy Ġjob Ġhere Ġis Ġdone . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunks Ġ= ĠLINE _ SPLIT TER . split ( line ). iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . WAIT ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġchunks . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġchunks . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠRE _ PARAM . findAll ( rest ). map Ġ{ Ġm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m . groups [ 1 ] !!. value Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . groups [ 2 ] !!. value . remove Sur rounding ("\ "" )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" track " Ġ-> Ġcheck ( params [" type "] Ġ== Ġ" w ig gle _ 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" variable Step " Ġ-> Ġstate Ġ= ĠState . VARIABLE _ STEP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fixed Step " Ġ-> Ġstate Ġ= ĠState . FIXED _ STEP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" browser " Ġ-> Ġ{ Ġ/* ĠJust Ġignore Ġ*/ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected Ġsection : Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠState . WAIT ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Ġ= Ġstate . create ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . VARIABLE _ STEP Ġ-> Ġ( track Ġas ĠVariable Step Section ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( chunks . next (). toInt () Ġ- Ġ 1 , Ġchunks . next (). toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . FIXED _ STEP Ġ-> Ġ( track Ġas ĠFixed Step Section ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( chunks . next (). toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines . next () Ġ Ġ// ĠDis card Ġthe Ġprocessed Ġline . ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrack ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠNot Ġa Ġ' Regex ' Ġto Ġavoid Ġexcess ive Ġallocation Ġon Ġ'. split '. Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLINE _ SPLIT TER Ġ= ĠSplit ter . on ( Char Matcher . whitespace ()). limit ( 2 ) ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMat ches Ġprefixes Ġof Ġmeta - data Ġsegments Ġ" track ", Ġ" variable Step " ĊĠĠĠĠĠĠĠĠ Ġ* Ġand Ġ" fixed Step ". ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMETA _ MATCH ER Ġ= ĠChar Matcher . any Of (" tv f ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRE _ PARAM Ġ= Ġ"( \\ S +) =( \" [^ \"] * \" | \\ S +) ". to Regex () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠParser Ġstate . Ċ Ġ*/ Ċ private Ġenum Ġclass ĠState Ġ{ ĊĠĠĠ Ġ/** ĠWaiting Ġfor Ġthe Ġtrack Ġdefinition Ġline . Ġ*/ ĊĠĠĠ ĠWAIT ING Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( params : ĠMap < String , ĠString >): ĠW ig Section Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĠParsing Ġa Ġvariable Ġstep Ġtrack . Ġ*/ ĊĠĠĠ ĠVARIABLE _ STEP Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( params : ĠMap < String , ĠString >): ĠVariable Step Section Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspan Ġ= Ġparams [" span "] ?. toInt () Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVariable Step Section ( params [" chrom "] !! , Ġspan ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĠParsing Ġa Ġfixed Ġstep Ġtrack . Ġ*/ ĊĠĠĠ ĠFIX ED _ STEP Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( params : ĠMap < String , ĠString >): ĠFixed Step Section Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġparams [" start "] !!. toInt () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Ġ= Ġparams [" step "] ?. toInt () Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspan Ġ= Ġparams [" span "] ?. toInt () Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFixed Step Section ( params [" chrom "] !! , Ġstart , Ġstep , Ġspan ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}; ĊĊĠĠĠ Ġabstract Ġfun Ġcreate ( params : ĠMap < String , ĠString >): ĠW ig Section Ċ } Ċ Ċ class ĠW ig Printer Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġwriter : ĠWriter , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġdescription : ĠString Ġ= Ġname ) Ġ: ĠClose able , ĠAuto Closeable Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . write (" track Ġtype = w ig gle _ 0 Ġname =\" $ name \" Ġdescription =\" $ description \"\ n ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprint ( track : ĠVariable Step Section ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . write (" variable Step Ġchrom =${ track . chrom } Ġspan =${ track . span }\ n ") ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( start , Ġ_ /* Ġend Ġ*/, Ġscore ) Ġin Ġtrack . query ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ("${ start Ġ+ Ġ 1 } Ġ$ score \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprint ( track : ĠFixed Step Section ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . write (" fixed Step Ġchrom =${ track . chrom } Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" start =${ track . start Ġ+ Ġ 1 } Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" step =${ track . step } Ġspan =${ track . span }\ n ") ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( interval Ġin Ġtrack . query ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ("${ interval . score }\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ= Ġwriter . close () Ċ } ĊĊ Ċ interface ĠW ig Section Ġ: ĠComparable < W ig Section > Ġ{ ĊĠĠĠ Ġ/** ĠHuman - readable Ġchromosome Ġname , Ġe . g . Ġ"` chr ` ". Ġ*/ ĊĠĠĠ Ġval Ġchrom : ĠString ĊĊĠĠĠ Ġ/** ĠInterval Ġwidth . Ġ*/ ĊĠĠĠ Ġval Ġspan : ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġoffset Ġof Ġthe Ġleft most Ġinterval Ġin Ġthe Ġsection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġstart : ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnd Ġoffset Ġof Ġthe Ġright most Ġinterval Ġin Ġthe Ġsection . ĠNote Ġthat ĊĠĠĠĠ Ġ* Ġwe Ġuse Ġsemi - closed Ġintervals , Ġthus Ġthe Ġreturned Ġvalue Ġis Ġnot ĊĠĠĠĠ Ġ* Ġ_ included _ Ġon Ġthe Ġtrack . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġend : ĠInt ĊĊĠĠĠ Ġ/** ĠThe Ġtotal Ġnumber Ġof Ġintervals Ġin Ġthe Ġsection . Ġ*/ ĊĠĠĠ Ġval Ġsize : ĠInt ĊĊĠĠĠ Ġfun ĠisEmpty () Ġ= Ġsize Ġ== Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġwith Ġall Ġintervals Ġin Ġthe Ġsection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġquery (): ĠSequence < S cored Interval > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( isEmpty ()) Ġempty Sequence () Ġelse Ġquery ( start , Ġend ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġintervals Ġcontained Ġwithin Ġa Ġgiven Ġsemi - interval . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfrom Ġinclusive ĊĠĠĠĠ Ġ* Ġ@ param Ġto Ġexclusive ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġquery ( from : ĠInt , Ġto : ĠInt ): ĠSequence < S cored Interval > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSp lices Ġa Ġsection Ġinto Ġsub - section Ġof Ġsize Ġat Ġmost Ġ[ java . lang . Short . MAX _ VALUE ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsp lice ( max : ĠInt Ġ= ĠShort . MAX _ VALUE . toInt ()): ĠSequence < W ig Section > ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠW ig Section ): ĠInt Ġ= ĠComparison Chain . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compare ( chrom , Ġother . chrom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compare ( start , Ġother . start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. result () ĊĊĠĠĠ Ġenum Ġclass ĠType Ġ{ ĊĠĠĠĠĠĠĠ ĠB ED _ GRAPH , ĊĠĠĠĠĠĠĠ ĠVARIABLE _ STEP , ĊĠĠĠĠĠĠĠ ĠFIX ED _ STEP ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġsection Ġwith Ġg aps ; Ġ_ variable _ Ġstep Ġmean Ġi + 1 - th Ġinterval Ġis Ġon Ċ Ġ* Ġarbitrary Ġdistance Ġfrom Ġi - th Ġinterval . ĠNote , Ġhowever , Ġthat Ġinterval Ċ Ġ* Ġwidth Ġremains Ġ_ fixed _ Ġthroughout Ġthe Ġtrack . Ċ Ġ*/ Ċ data Ġclass ĠVariable Step Section ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġchrom : ĠString , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġspan : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġ/** ĠPer - interval Ġpositions . Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġpositions : ĠT Int List Ġ= ĠT Int ArrayList (), ĊĠĠĠĠĠĠĠ Ġ/** ĠPer - interval Ġvalues . Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġvalues : ĠT Float List Ġ= ĠT Float ArrayList ()) Ġ: ĠW ig Section Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġvalues . size () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( positions . size () Ġ== Ġvalues . size ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġstart : ĠInt Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( size Ġ> Ġ 0 ) Ġ{ Ġ" no Ġdata " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpositions [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġend : ĠInt Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( size Ġ> Ġ 0 ) Ġ{ Ġ" no Ġdata " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpositions . last () Ġ+ Ġspan ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( pos : ĠInt , Ġvalue : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( positions . isEmpty Ġ|| Ġpos Ġ> Ġpositions . last ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions . add ( pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . add ( value ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġpositions . binary Search ( pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositions . insert ( i . inv (), Ġpos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . insert ( i . inv (), Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ i ] Ġ+= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( pos : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġpositions . binary Search ( pos ) ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalues [ i ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġquery ( from : ĠInt , Ġto : ĠInt ): ĠSequence < S cored Interval > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġpositions . binary Search ( from ) ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġi . inv () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġpositions . binary Search ( to Ġ- Ġspan Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( j Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj Ġ= Ġj . inv () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( i .. j ). as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠS cored Interval ( positions [ it ], Ġpositions [ it ] Ġ+ Ġspan , Ġvalues [ it ]) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsp lice ( max : ĠInt ): ĠSequence < Variable Step Section > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchunks Ġ= Ġsize Ġdiv Ce iling Ġmax ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( chunks Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Of ( this ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġchunks ). map Un boxed Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġi Ġ* Ġmax ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= ĠMath . min (( i Ġ+ Ġ 1 ) Ġ* Ġmax , Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( positions Ġ= Ġpositions . sub List ( from , Ġto ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ= Ġvalues . sub List ( from , Ġto )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= ĠMore Objects . toString Helper ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Value ( chrom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Value ( span ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġother Ġ=== Ġthis Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġother Ġ! is ĠVariable Step Section Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġspan Ġ== Ġother . span Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositions Ġ== Ġother . positions Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ== Ġother . values ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= ĠObjects . hash ( span , Ġpositions , Ġvalues ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġsection Ġwith Ġcontiguous Ġinterval . ĠBoth Ġthe Ġdistance Ġbetween Ċ Ġ* Ġconsecutive Ġintervals Ġand Ġinterval Ġwidth Ġis Ġfixed Ġthroughout Ġthe Ċ Ġ* Ġsection . Ċ Ġ*/ Ċ data Ġclass ĠFixed Step Section ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġchrom : ĠString , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġstart : ĠInt , ĊĠĠĠĠĠĠĠ Ġ/** ĠDistance Ġbetween Ġconsecutive Ġintervals . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġstep : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġspan : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġ/** ĠPer - interval Ġvalues . Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġvalues : ĠT Float List Ġ= ĠT Float ArrayList ()) Ġ: ĠW ig Section Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġend : ĠInt Ġget () Ġ= Ġstart Ġ+ Ġstep Ġ* Ġ( values . size () Ġ- Ġ 1 ) Ġ+ Ġspan ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġvalues . size () ĊĊĠĠĠ Ġfun Ġadd ( value : ĠFloat ) Ġ= Ġignore ( values . add ( value )) ĊĊĠĠĠ Ġoperator Ġfun Ġget ( pos : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNote ( le be dev ): Ġwe Ġexpect Ġ' pos ' Ġto Ġbe Ġa Ġstarting Ġposition . ĊĠĠĠĠĠĠĠ Ġreturn Ġvalues [( pos Ġ- Ġstart ) Ġ/ Ġstep ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġquery ( from : ĠInt , Ġto : ĠInt ): ĠSequence < S cored Interval > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠMath . max ( start , Ġfrom Ġ- Ġfrom Ġ% Ġspan ) ĊĠĠĠĠĠĠĠ Ġval Ġj Ġ= ĠMath . min ( start Ġ+ Ġstep Ġ* Ġsize , Ġto Ġ- Ġto Ġ% Ġspan ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( i Ġuntil Ġj Ġstep Ġstep ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Un boxed Ġ{ ĠS cored Interval ( it , Ġit Ġ+ Ġspan , Ġget ( it )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsp lice ( max : ĠInt ): ĠSequence < Fixed Step Section > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchunks Ġ= Ġsize Ġdiv Ce iling Ġmax ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( chunks Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Of ( this ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġchunks ). map Un boxed Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġi Ġ* Ġmax ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= ĠMath . min (( i Ġ+ Ġ 1 ) Ġ* Ġmax , Ġvalues . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( start Ġ= Ġstart Ġ+ Ġstep Ġ* Ġfrom , Ġvalues Ġ= Ġvalues . sub List ( from , Ġto )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= ĠMore Objects . toString Helper ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Value ( chrom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" start ", Ġstart ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" end ", Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" step ", Ġstep ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" span ", Ġspan ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġother Ġ=== Ġthis Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġother Ġ! is ĠFixed Step Section Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstart Ġ== Ġstart Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ== Ġother . step Ġ&& Ġspan Ġ== Ġother . span Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ== Ġother . values ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= ĠObjects . hash ( start , Ġstep , Ġspan , Ġvalues ) Ċ } Ċ Ċ private Ġfun ĠT Int List . last () Ġ= Ġget ( size () Ġ- Ġ 1 )